Git Difftool显示两个分支之间的差异,但Mergetool表示“无需合并文件”

Git Difftool显示两个分支之间的差异,但Mergetool表示“无需合并文件”,git,git-merge,difftool,Git,Git Merge,Difftool,我正试图合并两个分支 alpha_critical gamme_mine gamme_mine是我的,需要从alpha_到critical的一切 当我这样做的时候 git difftool f78606e3c60 94482fe3610 它显示了来自不同分支的这两个提交中不同的所有文件。然而 1使用difftool保存并关闭文件时,更改会丢失 2我想改用mergetool,但当我这么做的时候 git mergetool f78606e3c60 94482fe3610 上面说 No fil

我正试图合并两个分支

alpha_critical

gamme_mine
gamme_mine是我的,需要从alpha_到critical的一切

当我这样做的时候

git difftool f78606e3c60 94482fe3610
它显示了来自不同分支的这两个提交中不同的所有文件。然而

1使用difftool保存并关闭文件时,更改会丢失

2我想改用mergetool,但当我这么做的时候

git mergetool f78606e3c60 94482fe3610
上面说

No files need merging
最后,我只想比较这两个分支中的两个特定文件,并将更改保存在我的分支上,如下所示

git mergetool f78606e3c60:./test_basic.py 94482fe3610:./test_basic.py
TL;DR:Git CytoEtOL直到运行Git合并后才能运行,并且在合并冲突中停止。

长的 合并操作涉及三次提交,而不是两次提交,通常比只涉及两次提交的diff操作复杂得多。实际上,差异是无状态的:它获取您所拥有的并比较事物,并向您显示比较的结果。因此,您可以随时运行git diff或git difftool。正如您所看到的,您在git difftool中所做的更改通常不会影响文件:diff正在对每个文件的一个副本进行操作,操作完成后副本就会消失

合并不是无状态的。合并有一个独特的开始阶段,在这个阶段中,您和Git合作寻找感兴趣的三个提交。接下来是一个扩展的中间部分,其中Git计算两个差异,一个是从合并基到当前提交,另一个是从合并基到另一个提交,并尝试合并这两个差异。Git有时可以自己完成这个阶段。有时,它不能,也必须停下来寻求帮助。即使Git可以自己完成这项工作,您也可以指示Git停止,就好像它无法自己完成合并一样

在任何情况下,一旦第二个阶段完成,合并将进入第三个也是最后一个阶段。这涉及到做出新的承诺。新提交几乎与任何普通的非合并提交完全相同,但有一个关键区别:新提交有两个父级,而不是通常的单父级

我认为,查看合并工作原理的说明会有所帮助。假设每个提交都由某个哈希ID标识,实际上就是这样,每个提交都链接回前一个提交,实际上也是这样。您的两个分支都是从某个公共提交派生的,如下所示:

          o--o--...--T   <-- alpha_critical
         /
...--o--B
         \
          o--...--o--H   <-- gamma_mine
其中,新合并提交M将旧的tip提交H作为其第一个父级,并将其分支中的提交T作为其第二个父级。您的分支名称现在指向新的合并提交

          o--o--...--T   <-- alpha_critical
         /            \
...--o--B              M   <-- gamma_mine (HEAD)
         \            /
          o--...--o--H