重构后合并 - 检测移动的文件部分

时间:2013-05-17 07:45:32

标签: git git-merge

我有两个分支结构:

---(commit 1) ----- (commit 2, refactoring) ----(CONFLICT) 
        \                                      /
         \                                    /
          -----(commit 3, modifying) --------/

commit 1我有一个文件text.txt

Part 1:
  line 1
  line 2
  line 3
Part 2:
  line 4
  line 5
  line 6

commit 2我将text.txt的“第2部分”提取到part2.txt中,所以我得到了:

  • text.txt

    Part 1:
      line 1
      line 2
      line 3
    
  • part2.txt

    Part 2:
      line 4
      line 5
      line 6
    

commit 3中,我稍微修改了text.txt的两个部分:

Part 1:
  line 1
  line 2a
  line 3
Part 2:
  line 4
  line 5b
  line 6

合并两个分支我希望git足够聪明,并将line 2a放入text.txtline 5b进入part2.txt。不幸的是,这不会发生。

我的期望是基于git gui blame part2.txt检测到正确显示text.txt的行的来源这一事实。

我的问题是:

  • 为什么不能开箱即用?
  • 是否有一些解决方法?

1 个答案:

答案 0 :(得分:1)

我没有看到与git gui blame part2.txt相同的结果。我正在提交2. git gui blame没有显示text.txt。无论如何,回答你的问题:

  • 如果它“开箱即用”,您认为在以下情况下会发生什么:在提交3中,您已将line 5更改为line 5b。同时在提交2中,由于某种原因,有人将“第2部分”行移动到两个相同的文件part2a.txtpart2b.txt。如果git现在自动更改这两个这些文件,以便line 5b

    Git不会尝试做出这些决定 - 它会留给你。

  • 如果经常发生这种确切的冲突,则会有git-rerere。否则你需要手动处理。幸运的是,merge.conflictstyle=diff3配置选项显示了基本提交中文件的内容以及两个冲突的提交。这样可以很容易地看出哪一方改变了什么,以及原作是什么。有关详细信息,请参阅git-merge手册页。