git: переписать историю: изменить порядок и объединить коммиты - PullRequest
25 голосов
/ 02 сентября 2010

Текущая ситуация:

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch

Я хочу очистить эту историю (от А1 до В3), особенно так как я еще нигде не пихал его и потому что хочу подготовить патч, который как раз те B *.

То, что я хочу, это:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch

Я, вероятно, не буду выдвигать это вообще (или, если я сделаю, только суммированную B *, я должен вообще удалить коммиты A *), и пока я продолжаю работать над этим, я могу получить дополнительные такие коммиты, т.е. как это:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch

И я хочу переписать это потом снова, как указано выше.

Я не просто хочу знать какой-либо способ сделать это (потому что я мог бы получить что-то вроде хакерского способа), я - esp. здесь просят правильный / лучший / самый чистый / самый простой способ сделать это.


Что я делаю, особенно Я работаю над официальной веткой xorg-xserver-1.7 и хочу подготовить патч (B *). Поскольку я хочу иметь возможность заменить свой самоскомпилированный сервер xserver системным для простого тестирования, я применил несколько патчей Debian / Ubuntu (A *). Однако, когда я собираюсь опубликовать этот патч где-то, я хочу исключить его.

1 Ответ

30 голосов
/ 02 сентября 2010

Вы хотите сделать интерактивную перебазировку .

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

$ git branch my-backup-branch

Допустим, ваш коммит А1 имеет хэш 152274b. Попробуйте это:

$ git rebase -i 152274b^

Эта команда выведет ваш редактор (обычно vim) примерно так:

pick 152274b A1
pick 14b0838 B1
pick 661b993 A2
pick a6510db B2
pick 557e171 A3
pick 85da0e4 B3

# Rebase 39a47e4..85da0e4 onto 39a47e4
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Здесь вы можете изменить порядок коммитов, полностью их удалить и даже раздавить. В этом примере вы, вероятно, захотите двигаться и раздавить так:

pick 152274b A1
squash 661b993 A2
squash 557e171 A3
pick 14b0838 B1
squash a6510db B2
squash 85da0e4 B3

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

$ git reset --hard my-backup-branch
...