В 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

Насколько я понимаю, мне нужно отредактировать этот файл, но на самом деле я не знаю, как.

2
Marian Paździoch 9 Апр 2014 в 14:20

3 ответа

Лучший ответ

Вам нужно сжать последние 3 коммита до первого так (s означает squash):

pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok

Сохраните, а затем выйдите, и новый буфер должен появиться со всеми сообщениями фиксации. Просто используйте / измените коммит, который вы хотите сохранить в конце, сохраните и выйдите.

2
PericlesTheo 9 Апр 2014 в 10:25

Вы можете сжать последние 4 коммита; поскольку вы совершили их локально. Для этого вы должны отредактировать файл, чтобы:

pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok

После этого вы сможете изменить (комбинированное) сообщение фиксации.

Однако это не раздавит их при последней фиксации с помощью «основного сообщения фиксации». Проблема в том, что ваша «основная фиксация» была отправлена ​​на сервер; поэтому вы не можете просто добавлять коммиты в коммит, который был отправлен на сервер.

У этой фиксации есть определенный «хэш-код»; и поскольку другие пользователи могли вытащить этот код; git не позволяет (или нелегко) добавлять к фиксации, которая уже была отправлена ​​на сервер. Если вы хотите это сделать, вы можете увидеть этот вопрос

1
Community 23 Май 2017 в 12:09

Измените три нижних pick на squash, затем сохраните и выйдите. Появится другой редактор, позволяющий изменить сообщение фиксации.

Если вы хотите отменить перебазирование по какой-либо причине, взгляните на git reflog. Он покажет вам sha1 состояния до перебазирования, и вы можете вернуться в это состояние, выполнив git reset --hard sha1. Также есть ярлык для ссылки на журнал ссылок, git reset --hard @{1}

0
Phillip 9 Апр 2014 в 10:25