我目前正在研究git的很多内容跟踪功能。很高兴知道git允许我找出从一个文件移动到另一个文件的代码,但我想知道在合并中进行冲突解决时这个功能是如何可用的。
以下是该方案:
我创建了两个文件hello.cc
和bye.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中有一个额外的提交,其中我正在使用其他一些合并技术,你应该忽略这个问题。
答案 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将任何内容放入您的提交中,它将正常工作。