我将一个相对较旧的分支合并为主人,合并的结果是一个不圣洁的混乱。由于某些未知原因,当我运行git merge时,它会自动获取一些过时的代码,这些代码已经在另一个分支中更新并合并到master中。
这个旧分支只有我想要的一些变化,所以做了像
这样的事情git difftool oldbranch
并使用可视化difftool手动复制更改比清理自动合并导致的混乱要容易得多。
这种方法的问题在于它弄乱了我的历史/网络/树,因为它没有显示分支被合并。
问题是如何在不依赖自动合并的情况下手动合并git中的分支(最好使用图形差异/合并工具)?
答案 0 :(得分:2)
这个旧分支只有我想要的一些变化,所以做了像
这样的事情
git difftool oldbranch
并使用可视化difftool手动复制更改比清理自动合并导致的混乱要容易得多。
由于此分支已旧,并且只有一些您想要的更改,您可以做的是尝试将更改重新定位到master
,然后以这种方式合并更新的分支。
然而,既然你提到旧分支也会带来你不想要的旧变化,那么让我们对你的变化更加有选择性。
让我们假设您实际想要的所有更改都在旧分支的尖端进行原子提交,我们将其称为分支old
。所以old
的历史看起来会像这样:
I J master
o---------o----------o
\
\
o K
\
\
o L
\
\
o old
假设您要将提交L
到old
合并到master
,但不知何故J
是一个错误提交,已在master
中得到纠正但是当你运行
# With master checked out
git merge old
我们还假设K
也是一个“不好”的提交,您不想添加到master
。
然后你可以做的是从master
的当前提交中创建一个新分支,并有选择地将L
提交到old
到新分支:
# Make a new branch off current commit of master
git branch new-branch master
# Now rebase L through old onto new-branch
git rebase --onto new-branch K old
这告诉Git要接受K
和old
之间的提交,并将它们用不同的shas复制到new-branch
的提示上,而忽略K
因为它是(K, old]
范围的独占结束(就数字线而言,类似于I J master
o---------o----------o
\ \
\ \
o K o L`
\ \
\ \
o L o new-branch (same commit as where old branch was at)
\
\
o old
)。
所以现在你的分支看起来像这样:
# From master branch, use fast-forward merge
git merge new-branch
# Or force a merge-commit with non-fast-forward
git merge --no-ff new-branch
现在,您可以使用快进或非快进合并来合并新分支:
new-branch
您可以通过使用cherry-pick
代替添加到{{1}}的提交,而不是使用rebase,这样您就可以选择一系列提交,也可以选择单一提交提交,从而为您提供更细粒度的控制。
答案 1 :(得分:1)
如果您真的想这样,可以手动合并,然后使用
git merge -s ours oldbranch
将分支标记为已合并,但不对master使用任何更改。