【问题标题】:How to get git to correctly merge moved content (not only files)如何让 git 正确合并移动的内容(不仅是文件)
【发布时间】:2024-01-10 22:22:02
【问题描述】:

我目前正在研究 git 的很多内容跟踪功能。很高兴知道 git 允许我找出已从一个文件移动到另一个文件的代码,但我想知道在合并中解决冲突时如何使用此功能。

这是场景:

我创建了两个文件 hello.ccbye.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 中还有一个额外的提交,我在其中使用了其他一些合并技术,对于这个问题你应该忽略它。

【问题讨论】:

    标签: git git-merge git-branch


    【解决方案1】:

    您可以使用 git 将任何内容放入您的提交中,它会正常工作。

    【讨论】:

    • 是的,当然。我知道。但是,通过工具使用或合并冲突,让 git 给我提示和警告关于提交内容的最佳方法是什么。
    【解决方案2】:

    恐怕 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

    【讨论】:

      【解决方案3】:

      不幸的是,我的代码遇到了同样的陷阱,在 git 中移动文件后,它无法识别分支合并期间的更改。 看来,必须指导使用 move 的黄金法则是:

      将代码移动与更改分开

      目前,GIT 无法跟踪此类案例。而且似乎没有快速/自动化的解决方案来找出文件移动然后合并后的潜在问题。

      即使您知道问题发生的两个提交,并且会尝试应用补丁或恢复移动 + 合并后丢失的更改,您仍然会被 git 拒绝:

      'git apply' failed with code 1:'error: patch failed: filename.js:81'
      

      【讨论】:

        最近更新 更多