foo我在分支中有一个文件master。它需要一些工作,所以我创建了bar我做一些工作的分支。事情看起来令人满意,所以我准备重新合并到master. 只有一个问题:我想保留在分支中所做的所有更改bar以供将来参考,但并非所有更改都属于master,至少现在不行。但是如果我进行通常的合并,git 将不会看到任何冲突——因为文件foo尚未master被编辑——并且只会进行合并。有没有办法强制 git 进行此合并,就好像我需要解决冲突一样?或者是否有其他方法可以仅将选定的更改bar放入master?
有几种选择。直接回答你问题的那个:
git merge --no-commit
Run Code Online (Sandbox Code Playgroud)
将执行自动合并到索引,然后停止,就像需要手动解决冲突一样。当然,不会有冲突标记,也不会发生“未暂存”/等待解决的更改,但您可以在提交之前修改提交以使其看起来像您想要的那样。
除了“这可能会很混乱”之外,最大的问题是,就 git 而言,所有更改bar现在都在master. 由于您暗示您稍后可能需要其余的更改,所以这不好。
你真正想要的是类似的东西
x --- O --- M <--(master)
\ /
A --- B <--(bar)
Run Code Online (Sandbox Code Playgroud)
其中O是原始分支点,A有您现在想要的更改,以及B您稍后想要的更改。
(或者,如果您想避免合并提交,您需要
x --- O --- A <--(master)
\
B <--(bar)
Run Code Online (Sandbox Code Playgroud)
反而。)
如何最好地实现这一点取决于您现在拥有的。如果bar只有一次提交(或者,无论如何,如果您很高兴最终只有一个“立即提交合并”和一个“提交保存以供以后使用”),并且如果 after 没有master提交O,你可以这样做:
从...开始
x --- O <--(master)
\
AB <--(bar)
Run Code Online (Sandbox Code Playgroud)
你做
git checkout bar
git reset --mixed HEAD^
Run Code Online (Sandbox Code Playgroud)
(假设实际上只有一个提交bar;否则,请替换HEAD^为提交的 SHA1 值O或您在提交上放置的标签之类的内容O)。现在你有
x --- O <--(master)(bar)
^HEAD
Run Code Online (Sandbox Code Playgroud)
bar以及工作树中未跟踪的所有原始更改。由于所有更改都在单个文件中,因此我们需要使用补丁模式有选择地添加更改
git add -p
# select the changes to merge
git commit
git stash
Run Code Online (Sandbox Code Playgroud)
给你
x --- O <--(master)
\
A <--(bar)
\ ^HEAD
B <--{stash}
Run Code Online (Sandbox Code Playgroud)
那么接下来
git checkout master
git merge bar
Run Code Online (Sandbox Code Playgroud)
如果您想要合并提交(保留在其中进行更改的拓扑bar),则传递--no-ff给该merge命令。否则,由于我们假设 master 没有偏离bar,所以你只会快进离开
x --- O --- A <--(master)(bar)
\ ^HEAD
B <--{stash}
Run Code Online (Sandbox Code Playgroud)
(相反,如果master 已经发生分歧,但您决定线性化历史,您将重新建立A基础master而不是合并......)
然后你可以做类似的事情
git branch --delete bar
git stash branch bar
Run Code Online (Sandbox Code Playgroud)
结束于
x --- O --- A <--(master)
\
B <--(bar)
Run Code Online (Sandbox Code Playgroud)