Как перебазировать (сжать) последние коммиты на мастер и изменить сообщение коммита
В Git у меня следующая ситуация:
o "ok" b6ca869 [my_branch*]
|
o "ok" 479d27c
|
o "ok" c80fad5
|
o "ok" 8f7fe87
|
o "master commit message" [master][remotes/origin/master]
Я хочу сжать эти 4 "ОК" коммитов и, кроме того, изменить сообщение
o "my_branch commit message" [my_branch*]
|
o "master commit message" [master][remotes/origin/master]
Так что я делаю
git rebase --interactive master
И GNU Nano (я на Ubuntu) редактор открыт
GNU nano 2.2.2 File: /home/.git/modules/src/android/frameworks/base/rebase-merge/git-rebase-todo
pick 8f7fe87 ok
pick c80fad5 ok
pick 479d27c ok
pick b6ca869 ok
# Rebase aeedb8f..b6ca869 onto aeedb8f
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Как я понимаю, мне нужно отредактировать этот файл, но на самом деле я не знаю как.
3 ответа
Вы должны раздавить последние 3 коммита к первому так (s
обозначает squash
):
pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok
Сохраните, а затем выйдите, и новый буфер должен появиться со всеми сообщениями фиксации. Просто используйте / измените коммит, который вы хотите получить в конце, сохраните и выйдите.
Вы можете раздавить вместе последние 4 коммита; так как вы передали их на месте. Для этого вы должны отредактировать файл:
pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok
после этого вы сможете изменить (комбинированное) сообщение о коммите.
Однако это не приведет к их раздавливанию при последнем коммите с помощью "сообщения о мастер-коммите". Проблема в том, что ваш "главный коммит" был отправлен на сервер; поэтому вы не можете просто добавить коммиты к коммиту, который был передан на сервер.
Этот коммит имеет определенный "хэш-код"; и так как другие пользователи могли вытащить этот код; Git не (или не легко) позволяет добавить к коммиту, который уже был передан на сервер. Если вы хотите сделать это, вы можете увидеть этот вопрос
Поменяй три ниже pick
с squash
, затем сохраните и выйдите. Появится другой редактор, позволяющий вам изменить сообщение коммита.
Если вы хотите отменить ребаз по любой причине, взгляните на git reflog
, Он покажет вам sha1 состояния перед ребазингом, и вы можете вернуться в это состояние, выполнив git reset --hard sha1
, Там также есть ярлык для ссылки на reflog, git reset --hard @{1}