Git:如何不合并文件删除



我们将分支 A 合并到分支 B 中。 在分支 A 中,我们删除了一些文件。 合并到分支 B 时,我们不想删除分支 B 中的文件。 我们希望除文件删除之外的其他合并更改。 我们该怎么做呢?

请注意,有问题的文件没有合并冲突(即:它们在分支 B 中没有被触及)。

这里有一个可能的解决方案,不依赖于单独提交的删除:

# Do all the merging but do not commit the result
git merge --no-commit branchA
# Look at what has changed
# Beside the list of modified files, there is also a list of all deleted files
git status
# Restore the deleted files (from the current commit on branchB)
git checkout HEAD -- file1 file2
# Now commit the merge
git commit

而不是逐个列出所有已删除的文件,可以使用这个(未经彻底测试的)截图(灵感来自另一个问题的答案):

git diff-index --cached --diff-filter=D -z --name-only HEAD | xargs -0 git checkout HEAD --

我可以想到两种可能的解决方案:

  1. 重定分支 A 的基数,以便所有包含删除操作的提交都位于分支的"末尾"。然后将这些删除之前的最后一次提交合并到分支 B 中。当然,如果变基会导致任何基于分支 A 工作的克隆存储库出现问题,这可能不是一个可行的解决方案。

  2. 直接与分支 A 合并,然后"撤消"提交,并使用 git revert 删除。这里的缺点是您需要找到要"撤消"的提交。如果有很多这样的,手动运行git revert将非常耗时。

如果这些都不适合您,我深表歉意。我只是在这里集思广益一些可能性。希望其他人能提出更好的想法。

如果你想自动化它,你可以调整git-merge-one-file(它libexec/git-core你安装了git的任何地方)并手动运行合并。

git merge --no-commit --no-ff -s ours $topic            # set up parents
git read-tree -um $(git merge-base @ $topic) @ $topic   # handle really trivial cases
git merge-index -o $tweaked_git_merge_one_file -a       # everything else, do my way

调整非常简单,处理$1$1.的情况,您的分支没有执行任何操作,但另一个分支删除了它,至于您添加它而另一个分支没有执行任何操作的.$2.情况。

所以
-"$1.." | "$1.$1" | "$1$1.")
+"$1.." | "$1.$1" )

-".$2.")
+".$2." | "$1$1." )

由于在这两种情况下,文件的本地副本都是正确的,因此唯一要做的就是将索引条目标记为(正确)合并。

最新更新