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