我有一堆分支,每个分支都有不同的功能。通常我会有一些额外的分支“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?
答案 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)