在重构源代码时,有时您需要在文件中移动大块文本,甚至移动到新文件.您创建一个分支refactored
并提交:
$git checkout master $git branch refactored $git checkout refactored$git commit -m "refactored code"
但是,人们可能会在旧的预重构分支之上提交,更改已移动的代码:
$git checkout master$git commit -m "bugfix"
在分支上refactored
,您希望合并在master
以下位置进行的更改:
$git checkout refactored $git merge master
这导致了大的合并冲突.如果有办法告诉git简单地移动了内容,应该可以自动合并.
更糟糕的是,即使在解决冲突并提交冲突之后,git仍然无法使用该解决方案来确定进一步的合并:
$git commit -m "merge master into refactored" $git checkout master $git commit -m "bugfix2" $git checkout refactored $git merge master
这是可以避免的吗?我试过了git rerere
,它无法解决这里的冲突.有没有什么方法git可以看到移动一个文本块作为实际移动,而不是删除和插入?如果它不能,那么最小化合并冲突的最佳方法是什么,如果你需要保持两个并行分支一段时间?
虽然这很容易移动完整文件的内容,但我找不到有关仅移动其中一部分或移动到同一文件内的信息.
此外,如果有一个解决方案,那么git blame
重构代码的行为是什么?它会指向重构提交,还是忽略它?有没有办法实现后期?
如果有人感兴趣,我已经把我用于测试的(非常小的)存储库的base64编码的tar.gz放在了pastebin上
潜在解决方案一种可能的解决方案可能是通过应用(自动)编辑的补丁来执行合并,其中包含预重构分支中的更改.是否开发了这样的软件?使用这种方法我想,因为这对git是透明的,所以git blame
会指向重构提交.
我发现了同样的问题,适用于差异.没有提及任何现有的非专有实现,但提到了跟踪块移动的算法