Подтвердить что ты не робот

Git: переписать историю: переупорядочить и выполнить слияние

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

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

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

Я хочу:

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

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

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

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

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


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

4b9b3361

Ответ 1

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

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

$ git branch my-backup-branch

Скажем, что ваш коммит A1 имеет хэш 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