Перейти к содержанию

Git. Проблемы из реальной жизни

·265 слов·2 минуты

Слияние 2 репозиториев с сохранением истории коммитов #

git checkout <new branch name>
git pull <old rep> --allow-unrelated-histories

После чего вручную правим конфликты и делаем git commit.

Клонирование одной ветки (Single Branch) #

Полезно для CI/CD или когда репозиторий огромный.

git clone --single-branch --branch <branchname> host:/dir.git

Работа c cабмодулями #

Рекурсивное обновление всех вложенных репозиториев.

git submodule update --recursive --remote

Если это первое получение данных сабмодулей, то необходимо сначала провести инициализацию.

git submodule update --init --recursive

Альтернативный вариант (hard reset для всех сабмодулей):

git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

Очистка веток #

Часто при длительной разработке накапливается много неиспользуемых локальных веток. Что ж, их можно быстро почистить одной командой.

Удаление локальных веток, которые уже влиты (merged):

git branch --merged | grep -v "master" | while read i; do git branch -d $i; done;

Удаление влитых веток в удаленном репозитории:

Осторожно! Эта команда удалит ветки на сервере. Убедитесь, что вы понимаете, что делаете.
git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin

Полезные дополнения #

Отмена последнего коммита (Soft Reset) #

Если сделали коммит, но забыли добавить файл или хотите что-то поправить, можно “откатить” его, сохранив изменения в файлах:

git reset --soft HEAD~1

Изменение последнего коммита (Amend) #

Если нужно просто поменять сообщение или докинуть файл в последний коммит без создания нового:

git add .
git commit --amend --no-edit
# или с изменением сообщения:
git commit --amend -m "Новое сообщение"

Красивый лог #

Алиас для “дерева” коммитов в консоли:

git log --oneline --graph --decorate --all