Отмените Git Merge, но сохраните последующие изменения и переписайте историю - PullRequest
8 голосов
/ 25 января 2011

У меня есть несколько веток, каждая из которых имеет свои особенности. Обычно у меня будет дополнительная ветка "not_master", которая содержит master + функцию A, например:

(not_master)     a--b--c--d--e---M--x--y--z
(feature A)           --h--i--j-/

Иногда я хочу отключить функцию A, но сохраняю коммиты x,y,z в "not_master".

Другими словами, мне бы хотелось:

(not_master)     a--b--c--d--e--x--y--z

Я вижу, что могу сделать git revert -m 1 M, который добавит коммит до конца, который отменит мои изменения, но я не очень хочу этого делать, так как эти коммиты еще не были опубликованы, поэтому добавление большего количества коммитов делает историю еще труднее читать.

Другие предлагают просто сделать git reset --hard M, но это сбросит изменения x,y,z. Я просто думаю об этом совершенно неправильно? Должен ли я просто git reset --hard M и вишня выбрать x, y, z?

1 Ответ

7 голосов
/ 25 января 2011

git rebase будет делать то, что вы хотите. git rebase -i <commit e> должно работать: откроется редактор, а вы удалите коммит слияния и сохраните.

Вы также должны иметь возможность напрямую указать перебазирование x..z на e, но разбирать семантику командной строки немного сложно. Если я правильно читаю справочную страницу, она должна быть git rebase --onto <commit e> <commit M> not_master.

РЕДАКТИРОВАТЬ: Протестировано и, кажется, работает:

mkdir foo; cd foo
git init
touch initial
git add initial
git commit -m 'initial'
git checkout -b topic
touch topic
git add topic
git commit -m 'topic'
git checkout master
touch master
git add master
git commit -m 'master'
git tag pre_merge
git merge topic
git tag merge
touch post_topic
git add post_topic
git commit -m 'post topic'
git rebase --onto pre_merge merge master

Результаты в истории

initial -- master -- post topic  (master)
      \
       \-- topic                 (topic)
...