Git. Проблемы из реальной жизни
Содержание
Слияние 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