摘要场景:有主人和分支。分支是后代是主人。与此处未显示的其他文件一起,都包含一个名为subdir的子目录,其中包含一些json文件:
branch:
/subdir/1.json
/subdir/2.json
master:
/subdir/2.json
/subdir/3.json
我想要做的是只将子目录从master合并到branch,其中branch的subdir中的所有文件都被删除并替换为master的内容,而不会丢失分支中提交的历史记录而不影响分支中的任何其他文件。
所以在合并之后,branch的subdir和master的subdir看起来完全一样。
没有合并参数可以做到这一点。
有一种方法可以在一次合并中完成,但这可能是一个坏主意。这种合并被称为邪恶合并,至少有一些人参见(参见Evil merges in git?对于什么是“邪恶合并”的各种看法)。一种做“非邪恶”的方法是进行合并,提交结果,然后进行后续提交以使事情正确。执行“非邪恶”的另一种方法是进行导致合并正确的提交,然后进行合并。无论哪种方式,你有两个提交,其中一个是非邪恶的普通日常合并。
但是如果你确实想把它作为一个单一的合并,devil-may-care判断它是否是邪恶的,这就是你如何做到这一点:
$ git checkout branch
$ git merge --no-commit -s ours master
... Git does the merge, but stops before committing ...
$ git rm -r -- subdir # needed only if there are files to remove
$ git checkout master -- subdir
$ git status # use git status often!
... you'll see some status ...
$ git diff --cached HEAD # optional: see what's changing vs tip of branch "branch"
... you'll see some status ...
$ git diff --cached --name-status HEAD # optional: see what files differ
... you'll see some status ...
$ git status # it's never wrong to use git status too often
... you'll see some status ...
... ok, we're really ready ...
$ git commit
<and write a good merge message>
注意,在进行了这次合并之后,Git现在认为将刚刚合并的两个提交组合起来的正确结果就是你刚刚提交的内容。这会影响未来的合并操作!
请注意git rm -r
步骤(我先忘记了这一步):如果当前(branch
提交)提交中的文件不在master
提示中,则需要这个,这应该在合并中删除。如果没有这样的文件,git rm -r
没有害处,但没有任何用处:我们只是用随后的git checkout master -- subdir
步骤替换所有文件。