撤消Git合并,但保留以后的更改,并重写历史记录

时间:2011-01-25 20:15:26

标签: git undo git-merge

我有一堆分支,每个分支都有不同的功能。通常我会有一些额外的分支“not_master”,其中包含master + feature A,如下所示:

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

有时我想取消合并功能A,但请在“not_master”中保留x,y,z

换句话说,我想这样:

(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 个答案:

答案 0 :(得分:7)

git rebase会做你想要的。 git rebase -i <commit e>应该有效:它将打开一个编辑器,然后删除合并提交并保存。

你也应该能够直接在e上指定rebasing x..z,但是整理出命令行的语义有点毛茸茸。如果我正在阅读手册页,那应该是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)