当我在feature1
工作时,在下面的提交点A
,我被要求在其上构建另一个mod。我们称之为feature1+
。这意味着图表如下所示:
master: o---o---o---o---o
\
feature1: o---e---e---e---O---A
\
feature1+: o---c---c---X
现在我想将feature1+
合并回feature1
,但我意识到X
和A
中存在的文件之间的变化很小; c
提交中有两个新的跟踪文件。
在此过程中,我开始在feature1
上整合提交,将e
提交重新定义为单个o'
,以减少最终提交给master的提交数量。我相信有效的图表是这样的:
master: o---o---o---o---o
\
feature1: o---o'---O---A
\
feature1+: o---e---e---e---O---A---c---c---X
但是,这意味着当我运行时,feature1+
会将e
提交转储到feature1
:
git checkout feature1
git merge feature1+
这给了我:
master: o---o---o---o---o
\
feature1: o---o'---O---A---e---e---e---O---c---c---X
我想在不重新引入c
提交的情况下添加e
次提交。换句话说,将其合并为:
master: o---o---o---o---o
\
feature1: o---o'---O---A---c---c---X
我怎么能这样做?我在checkout
位于A时尝试c
来自feature1
的新文件,但当然这会在不保留历史记录的情况下提供文件。
答案 0 :(得分:3)
在分支上:feature1
在A:
执行git cherry-pick feature1+: A .. X
应该会产生所需的树
master: o---o---o---o---o
\
feature1: o---o'---O---A---c---c---X
答案 1 :(得分:0)
@nevyn在Freenode IRC的#git频道上建议的最短答案是cherry-pick
feature1
所需的提交(文档提示这个,但我可能只是害怕尝试) :
git checkout feature1
git cherry-pick c # the first c
git cherry-pick c # OK, the second one, I didn't think ahead THAT far.
git branch -d feature1+ # warns + gives the correct command for an unmerged branch