有几个选项可供选择。直接回答你问题的一个是:
git merge --no-commit
会自动将合并操作执行到索引中,然后停止,就像需要手动解决冲突一样。当然,不会有冲突标记和任何“未暂存”/等待解决的更改,但是您可以在提交之前修改提交内容以满足您的需求。
这种方法最大的问题除了"做起来可能很混乱"之外,还包括对于Git而言,所有bar
的更改现在都已计入master
。由于您暗示稍后可能需要剩余的更改,这是不好的。
真正需要的是类似于:
x --- O --- M <--(master)
\ /
A --- B <--(bar)
其中,O
是原始分支点,A
包含你现在想要的更改,B
包含你以后想要的更改。
(或者,如果你想避免合并提交,你会选择
x --- O --- A <--(master)
\
B <--(bar)
具体如何实现取决于您目前的状态。如果bar
只有一个提交记录(或者,无论如何,如果您满意于最终只有一个“立即合并的提交”和一个“留待以后保存的提交”),并且在O
之后的master
上没有提交记录,则可以执行以下操作:
从下面开始:
x --- O <--(master)
\
AB <--(bar)
you do
git checkout bar
git reset --mixed HEAD^
(假设bar
上真的只有一个提交;否则,请将HEAD^
替换为类似于提交O
的SHA1值或您在提交O
上放置的标记)。现在你有了
x --- O <--(master)(bar)
^HEAD
在您的工作树中,所有来自bar
的原始更改均未被跟踪。由于所有更改都在单个文件中,因此我们需要使用补丁模式来选择性地添加更改。
git add -p
# select the changes to merge
git commit
git stash
为您提供
x --- O <--(master)
\
A <--(bar)
\ ^HEAD
B <--{stash}
那么接下来,
git checkout master
git merge bar
如果你想要一个合并提交(保留在
bar
上进行更改的拓扑结构),那么请在
merge
命令中传递
--no-ff
。否则,由于我们假设主分支没有与
bar
分支分岔,你将只获得一个快速前进的提交。
x --- O --- A <--(master)(bar)
\ ^HEAD
B <--{stash}
(反之,如果
master
已经分叉,但您决定线性化历史记录,则应将
A
变基到
master
而不是合并...)
然后你可以像这样做
git branch --delete bar
git stash branch bar
结束于
x --- O --- A <--(master)
\
B <--(bar)