difftool 如何显示分支更改但避免合并?

问题描述

如何使用 Difftool 显示两个修订版之间的所有更改,避免在合并中进行更改?

我可以使用 git log 来显示此命令的更改:

 git log --no-merges -p firstrevinbranch..lastrevinbranch

但是 git log 只显示变更集,而不显示文件,所以我可以正确读取上下文。

有什么方法可以使用 difftool 来执行此操作并显示修订之间的更改以避免合并? 我的意思是,在这样的场景中:

  A---B---C---D topic
 /       /      \
E---F---G---H---I master

我想用 kdiff 仅显示在提交 A、B 和 D 中所做的更改,避免使用 C,因此它是合并提交。

非常感谢。

解决方法

简短的回答是“你不能”。

长的答案是你可以,但只有首先创建新的提交,其中有不同的变化。换句话说,与其看你现在有什么,你可以做点别的,然后再看。您通过这样做获得的价值量将部分取决于您制作其他东西时的表现。

这是事实。 (这些是快乐的事实还是悲伤的事实取决于您的观点。)提交,在 Git 中,存储一个快照。它不存储更改。快照本身实际上是一个存档。任何现有快照都无法更改,因此它是一个只读存档。

当您将 git difftoolkdiff3 一起使用时,您:

  • 让 Git 提取一个或多个提交,以便存档文件可以作为文件访问,而不是打包成仅限 Git 的格式;然后
  • 对这些文件运行 kdiff3,也许让它与您当前的工作树(一个选项)或另一个提取的存档(另一个选项)进行比较。

因此,以您的示例为例:

  A---B---C---D topic
 /       /     \
E---F---G---H---I master

您可以使用 git difftool 从提交 A 或提交 BCD 或 ... 中提取快照I。您也可以让它提取任何其他提交,然后在两次提取上运行 kdiff3,或者您可以使用第一次提取来运行 kdiff3 以及当前在您的工作树中的任何内容。

要查看通过在 B 中获取快照,然后对该快照进行更改而形成的假设快照中可能包含的内容: >

  1. 查找从 CD 的变化;然后
  2. 将这些更改添加到 B 中的快照

您实际上必须首先执行步骤 1 和 2。结果可以存储在您喜欢的任何位置:临时目录、全新的存储库或您在这个存储库中所做的提交(临时或永久)。 Git 可以帮助您进行新的提交。您从实际进行此类提交中获得的价值取决于您,但最简单的方法是:

  • 检查提交 B,创建一个新分支(临时或永久,随你喜欢):

    git checkout -b temp-branch <hash-of-B>
    
  • 樱桃挑选提交D

    git cherry-pick <hash-of-D>
    

这一切的结果是一个新的提交J

        J   <-- temp-branch
       /
  A---B---C---D   <-- topic
 /       /     \
E---F---G---H---I   <-- master

J 中的快照与B 中的快照之间的差异 与快照之间的差异 相同或相似在 DC 中。出于这个原因,您可能希望使用其他名称来调用 commit J,例如 D',但是您叫什么并不重要;这是一个新的提交,包含一个挑选结果的存档。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...