Git - полезные примеры

Просмотр логов

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

$ git log --pretty=format:"%H [%cd]: %an - %s" --graph --date=format:%c
$ git log --pretty=format:"%h - %ar : %s"

Склейка коммитов

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

git rebase

Перед склейкой коммитов в git необходимо предварительно закоммитить все изменения в проекте и весьма желательно сделать резервную копию, например так:

$ git tag -a backup -m 'Backup'

Для примера будет использоваться вот такая история коммитов:

$ git log --pretty=format:"%h : %s"
cb9d634 : Commit 5 - the freshest, last commit
bdd925d : Commit 4
08f380e : Commit 3
6084726 : Commit 2
0fbcc50 : Commit 1 - initialization, the oldest commit

Commit 1 - самый старый коммит, выполненный сразу после создания репозитория, Commit 5 - самый новый.

Склейка коомитов в середине репозитория

Для склейки 3 коммитов (Commit 3-4 нужно склеить с Commit 2), запускается git rebase в интерактивном режиме, опция HEAD~4 обозначает, что нужно открыть в интерактивном режиме 4 самых старых коммита (4 коммита от первого):

$ git rebase -i HEAD~4

После этого в текстовом редакторе откроется такой текст:

pick 6084726 Commit 2
pick 08f380e Commit 3
pick bdd925d Commit 4
pick cb9d634 Commit 5 - the freshest, last commit

# Rebase 0fbcc50..cb9d634 onto 0fbcc50 (4 commands)
#
...

Редактируем данные так, чтобы напротив коммитов 3 и 4 вместо комманды pick была установлена squash, после чего нужно сохранить файл и закрыть текстовый редактор. В интерактивном режиме обязательно должен присутствовать и тот коммит, к которому нужно приклеить предыдущие с коммандой pick, иначе в результате склейки произойдет ошибка и получится совсем не тот результат, который ожидался. После этого редактор снова откроется, но уже для того, чтобы внести изменения в название нового коммита, содержащего в себе 3 склееных коммита (Commit 2-4) - назовем его: "Commit 2 - 4" сохраним и закроем файл. После этого можно проверить результат склейки, запустив:

$ git log --pretty=format:"%h : %s"
5ff1f80 : Commit 5 - the freshest, last commit
40213c8 : Commit 2 - 4
0fbcc50 : Commit 1 - initialization, the oldest commit

Как видно, склейка коммитов прошла успешно. Стоит обратить внимание, что у Commit 5 изменилась хеш-сумма, что не удивительно, так как все более новые коммиты зависят от более старых (каждый новый коммит содержит хеш старого, и если он изменится, то изменится и хеш нового), и соответственно любые изменения в более старых коммитах автоматически вызовут изменения хеша более новых.

Не стоит экспериментировать с git rebase -i ... над репозиторием реального проекта. Если в интерактивном режиме удалить строку с одним или более коммитом, то это повлечет удаление отсутствующих коммитов из репозитория. Чтобы после запуска git rebase -i ... в интерактивном режиме никакие изменения не были бы внесены в историю коммитов, нужно не просто закрыть файл без сохранения, а удалить все содержимое файла и сохранить его.

Склейка первого коммита, созданного при инициализации репозитория

Такая склейка происходит почти так же, как и предыдущая, но для того, чтобы склеить первый, созданный при инициализации репозитория, коммит, нужно запустить rebase с параметром --root

$git rebase -i --root

И установить s или squash перед всеми, более младшими коммитами, которые нужно объединить с инициализирующим коммитом.

Сохранение изменений в удаленном репозитории после git rebase

Чтобы сохранить изменения в удаленном репозитории после редактирования истории коммитов при помощи git rebase, необходимо запускать комманду push с опицией f:

$ git push -f

Если над проектом работает несколько человек, то после выполнения git push -f другим разработчикам придется заново скачивать весь проект. Если они ранее внесли изменения в свои локальные копии репозитория и не объединили их с основным (merge, push), это может вызвать у них большие сложности с добавлением новых изменений в новый репозиторий с измененной историей.

Полезные ссылки

Исправление истории
Опубликовано: 2019/12/08
HTML-код ссылки на эту страницу:
<a href="https://petrenco.com/git.php?txt=722" target="_blank">Git - полезные примеры</a>
1389
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.