试图在 GIT 中找到 "stomp" 合并

Trying to find a "stomp" merge in GIT

抽象场景:有master和branch。分支是后代是主人。与此处未显示的其他文件一起,它们都包含一个名为 subdir 的子目录,其中包含精选的 json 个文件:

branch:
/subdir/1.json
/subdir/2.json

master:
/subdir/2.json
/subdir/3.json

我想做的是仅将主目录中的子目录合并到分支中,其中分支子目录中的所有文件都被删除并替换为主目录中的内容,而不会丢失分支中提交的历史记录并且不会影响任何分支中的其他文件。

所以合并后,branch的子目录和master的子目录看起来完全一样。

没有合并参数可以做到这一点。

一种在单次合并中完成此操作的方法,但这可能不是一个好主意。这种合并被称为 邪恶的合并 ,至少有些人是这样(请参阅 Evil merges in git? 以了解 "evil merge" 到底是什么)。 "not evil" 的一种方法是进行合并,提交结果,然后进行后续提交以纠正问题。 "not evil" 的另一种方法是进行使合并正确的提交,然后进行合并。无论哪种方式,您都有 两个 提交,其中一个是非邪恶的普通日常合并。

但是如果你确实想把它作为一个单一的合并来做,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)提交中有文件 aren,则需要此步骤'tmaster 提示提交中,应该在合并中删除。如果没有这样的文件,git rm -r 没有害处,但没有任何用处:我们只是用后续的 git checkout master -- subdir 步骤替换所有文件。