如何让git正确合并移动的内容(不仅仅是文件)



我目前正在研究git的许多内容跟踪功能。很高兴知道git可以让我计算出从一个文件移到另一个文件的代码,但我想知道在合并中解决冲突时,这个功能是如何使用的。

这是一个场景:

我创建了两个文件hello.ccbye.cc。我启动一个分支topic,并将一些代码从hello.cc移动到bye.cc。如果我现在做一个git blame -C bye.cc,我可以看到这个代码最初来自hello.cc,这很好。但是,现在我切换到没有移动内容的原始分支,并更改hello.cc中在其他提交中移动的部分中的一些代码。如果我现在做git merge topic,我会得到hello.cc的冲突。然而,除非我使用diff3样式(尽管我通常这样做),否则我只能看到这个方法已经从另一个分支的hello.cc中删除,而不能看到它后来被更改。最好在bye.cc上也得到一个冲突,因为有必要检查来自其他分支的这些更改是否必须重新应用于代码。这有可能吗?

我知道我可以手动计算出,代码已经通过执行git blame --reverse -C topic...移动了。然而,首先我花了很长时间才弄清楚这种可能性,其他大多数人可能都不知道。其次,我很懒,可能会忘记代码可能已经被移动了。此外,当代码被移动到多个文件时,我也不确定这是否有效。

你会用什么方法来尽可能保证这种情况的安全?

编辑

我刚刚发现git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic还可以用来查找内容的移动位置。如果我正确理解git,这可能会更快,因为它不会对完整存储库中的内容进行完整搜索。

编辑

我把我用来玩的存储库上传到了github,这样你就可以自己尝试合并了。我移动函数的提交位置在主题分支中。在分支merge_here的HEAD的master中更改相同函数的提交。在master中还有一个额外的提交,我在其中使用了一些其他的合并技术,对于这个问题,您应该忽略这些技术。

恐怕git不可能自动识别合并中移动的代码并产生冲突等,除非这些都是重命名的整个文件。

这里已经有一些关于这个主题的讨论了,比如git如何处理移动到不同文件的合并代码?和gitmerge:将更改应用于移动到其他文件的代码。

不幸的是,我的代码遇到了同样的陷阱,在git中移动文件后,它在分支合并过程中无法识别更改。看来,一个人必须指导行动的黄金法则是:

将代码移动与更改分开

GIT目前无法追踪此类案件。而且似乎没有快速/自动化的解决方案来解决文件移动后合并后的潜在问题。

即使你知道两次提交都是在哪里发生的问题,并试图应用补丁或恢复移动+合并后丢失的更改,你仍然会被git拒绝:

'git apply' failed with code 1:'error: patch failed: filename.js:81'

您可以使用git将任何内容放入您的提交中,它都可以正常工作。

相关内容

最新更新