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

时间:2012-01-12 23:29:37

标签: git git-merge git-branch

我目前正在研究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中有一个额外的提交,其中我正在使用其他一些合并技术,你应该忽略这个问题。

3 个答案:

答案 0 :(得分:5)

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

此处已就此主题进行了一些讨论,例如how does git handle merging code that was moved to a different file?git merge: apply changes to code that moved to a different file

答案 1 :(得分:0)

不幸的是,在我的代码中使用相同的陷阱,在git中移动文件后,它不会识别分支合并期间的更改。 似乎,一个必须指导与移动一起工作的黄金法则是:

  

将代码移动与更改分开

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

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

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

答案 2 :(得分:-4)

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