Как перебазировать (сжать) последние коммиты на мастер и изменить сообщение коммита

В 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}

Другие вопросы по тегам