这个旧分支只有我想要的一些更改,所以做类似的事情
git difftool oldbranch
并且使用可视化 difftool 手动复制更改比清理由自动合并引起的混乱要容易得多。
由于这个分支是旧的并且只有一些你想要的更改,你可以做的是尝试将更改重新定位到master
,然后以这种方式合并到更新的分支中。
但是,由于您提到旧分支也以某种方式引入了您不想要的旧更改,所以让我们对您的变基更具选择性。
让我们假设您真正想要的所有更改都在旧分支顶端的原子提交中,我们将其称为 branch old
。所以历史old
看起来有点像这样:
I J master
o---------o----------o
\
\
o K
\
\
o L
\
\
o old
假设您想L
通过old
into合并提交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
除了使用 rebase 之外,您还可以new-branch
通过使用cherry-pick
instead 对添加的提交进行极具选择性的选择,这将使您既可以选择一系列提交,也可以选择单个提交,从而为您提供更精细的控制。