1

我将一个相对较旧的分支合并到 master 中,合并的结果是一团糟。出于某种未知原因,当我运行 git merge 时,它​​自动获取了一些已在另一个分支中更新并合并到 master 中的过时代码。

这个旧分支只有我想要的一些更改,所以做类似的事情

git difftool oldbranch 

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

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

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

4

2 回答 2

2

这个旧分支只有我想要的一些更改,所以做类似的事情

git difftool oldbranch

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

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

但是,由于您提到旧分支也以某种方式引入了您不想要的旧更改,所以让我们对您的变基更具选择性。

让我们假设您真正想要的所有更改都在旧分支顶端的原子提交中,我们将其称为 branch old。所以历史old看起来有点像这样:

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

假设您想L通过oldinto合并提交master,但不知何故J是一个错误的提交,它已经被纠正,master但在您运行时仍以某种方式被合并

# With master checked out
git merge old

我们还假设这K也是一个您不想添加到master.

然后你可以做的是从当前提交中创建一个新分支master,并有选择地将提交重新设置Lold新分支上:

# 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

除了使用 rebase 之外,您还可以new-branch通过使用cherry-pickinstead 对添加的提交进行极具选择性的选择,这将使您既可以选择一系列提交,也可以选择单个提交,从而为您提供更精细的控制。

于 2013-07-13T17:30:53.840 回答
1

如果你真的想这样走,你可以手动合并,然后使用

git merge -s ours oldbranch

这会将分支标记为合并,但不会对 master 应用任何更改。

于 2013-07-13T15:06:57.223 回答