如何在git中手动合并分支?

时间:2013-07-13 15:00:21

标签: git github git-merge

我将一个相对较旧的分支合并为主人,合并的结果是一个不圣洁的混乱。由于某些未知原因,当我运行git merge时,它会自动获取一些过时的代码,这些代码已经在另一个分支中更新并合并到master中。

这个旧分支只有我想要的一些变化,所以做了像

这样的事情
git difftool oldbranch 

并使用可视化difftool手动复制更改比清理自动合并导致的混乱要容易得多。

这种方法的问题在于它弄乱了我的历史/网络/树,因为它没有显示分支被合并。

问题是如何在不依赖自动合并的情况下手动合并git中的分支(最好使用图形差异/合并工具)?

2 个答案:

答案 0 :(得分:2)

  

这个旧分支只有我想要的一些变化,所以做了像

这样的事情      

git difftool oldbranch

     

并使用可视化difftool手动复制更改比清理自动合并导致的混乱要容易得多。

由于此分支已旧,并且只有一些您想要的更改,您可以做的是尝试将更改重新定位到master,然后以这种方式合并更新的分支。

然而,既然你提到旧分支也会带来你不想要的旧变化,那么让我们对你的变化更加有选择性。

让我们假设您实际想要的所有更改都在旧分支的尖端进行原子提交,我们将其称为分支old。所以old的历史看起来会像这样:

I         J          master
o---------o----------o
           \
            \
             o K
              \
               \
                o L
                 \
                  \
                   o old

假设您要将提交Lold合并到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要接受Kold之间的提交,并将它们用不同的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使用任何更改。