我正在尝试一个非常强大的git合并策略.我遇到的一个问题是我对我的分支中的某些代码进行了一些更改,但我的同事将该代码移动到其分支中的新文件中.所以当我这样做时git merge my_branch his_branch,git没有注意到新文件中的代码与旧文件中的代码相同,因此我没有任何更改.
将更改再次应用于新文件中的代码的最简单方法是什么.我不会有太多问题找出需要重新应用的提交(我可以使用git log --stat).但据我所知,没有办法让git将更改重新应用到新文件中.我现在看到的最简单的事情是手动重新应用更改,这看起来不是一个好主意.
我知道git可以识别blob,而不是文件,所以肯定必须有一种方法可以告诉它,"从这个提交应用这个确切的代码更改,除了它不是它现在在这个新文件中的位置".
假设我在文件A中有函数X,我想将该函数移动到文件B.同时,其他人对文件A中的函数X进行了更改.
合并这两个变化时git是否做了什么特别的事情?它是否会识别相同的功能被移动到文件B并在那里应用更改?或者我们最终会丢失更改或在文件A和B中有两个相同功能的副本?
我发现的关于在git中移动代码的大多数文章主要是指重命名整个文件而不是文件内的代码块.我发现的最接近的是来自内核陷阱的Linus:
当使用git时,整个'保持代码移动与更改分开'有一个更基本的原因:git可以跟踪代码移动(再次,无论是移动整个文件还是只移动文件之间的函数),并做一个'git blame - C'实际上将遵循文件之间的代码移动.它通过相似性分析来做到这一点,但它确实意味着如果你同时移动代码并改变它,git就看不到'哦,那个函数最初来自那个其他文件',现在你得到更糟糕的注释代码实际来自哪里.
所以看起来git会认识到代码被移动到其他地方,但并没有真正说明合并期间会发生什么.
git ×2