- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在重构源代码时,有时您需要将大块文本移动到文件中,甚至移动到新文件中。您创建一个分支 refactored
并提交:
$git checkout master
$git branch refactored
$git checkout refactored
<move code around>
$git commit -m "refactored code"
但是,人们可能会在旧的预重构分支之上提交,更改已移动的代码:
$git checkout master
<change code that was moved elsewhere on branch refactored>
$git commit -m "bugfix"
在分支 refactored
上,您随后想要 merge 在 master
中所做的更改:
$git checkout refactored
$git merge master
<giant merge conflict>
这会导致很大的 merge 冲突。如果有办法告诉 git 内容只是被移动了,应该可以自动 merge 。
更糟糕的是,即使在解决冲突并提交之后,git 仍然无法使用该解决方案来找出进一步的 merge :
<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>
这完全可以避免吗?我试过 git rerere
并不能解决这里的冲突。 git 有什么方法可以将移动文本 block 视为实际移动,而不是删除和插入?如果不能,如果您需要将两个并行分支保留一段时间,那么最小化 merge 冲突的最佳方法是什么?
虽然这对于 moving the contents of a complete file 来说已经足够简单了, 我找不到有关仅移动文件的部分 或在同一文件内移动的信息。
此外,如果有解决方案,git blame
对重构的行为会是什么代码?它会指向重构提交,还是忽略它?有没有办法实现后者?
如果有人感兴趣,我已经将我用于测试的(非常小的)存储库的 base64 编码的 tar.gz 放在了 on pastebin
一个潜在的解决方案可能是通过应用(自动)编辑的补丁和预重构分支中的更改来执行 merge 。是否有为此开发的软件?使用这种方法我猜想,由于这对 git 是透明的,git blame
将指向重构提交。
我找到了 the same question, applied to diff .没有提到任何现有的非专有实现,但提到了一种跟踪 block 移动的算法
最佳答案
避免这种额外的努力是不可能的,但这又是 Git 应该如何工作的:
The other fundamentally smart design decision is how Git does merges. The merging algorithms are smart but they don't try to be too smart. Unambiguous decisions are made automatically, but when there's doubt it's up to the user to decide. This is the way it should be. You don't want a machine making those decisions for you. You never will want it. That's the fundamental insight in the Git approach to merging: while every other version control system is trying to get smarter, Git is happily self-described as the "stupid content manager", and it's better for it.
关于git - 告诉 git 跟随移动的内容(不仅仅是移动的文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541012/
我是一名优秀的程序员,十分优秀!