尝试在GIT中找到“踩踏”合并

时间:2019-04-10 22:52:53

标签: git version-control git-branch branching-and-merging

抽象方案:有master和一个分支。分支是后代,是主人。除了此处未显示的其他文件以外,这两个文件都包含一个名为subdir的子目录,该子目录包含一些json文件:

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

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

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

因此,合并后,分支的子目录和主目录的子目录看起来完全相同。

1 个答案:

答案 0 :(得分:2)

没有使它做到这一点的合并参数。

可以在一次合并中完成此操作,但是可能是个坏主意。这种合并至少被某些人称为 evil merge (有关“邪恶合并”的确切含义,请参见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提示提交中的em>,应在合并中将其删除。如果没有这样的文件,git rm -r并不会有害,但没有任何用处:我们将使用后续的git checkout master -- subdir步骤替换所有文件。