问题描述
如何使用 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 difftool
与 kdiff3
一起使用时,您:
- 让 Git 提取一个或多个提交,以便存档文件可以作为文件访问,而不是打包成仅限 Git 的格式;然后
- 对这些文件运行
kdiff3
,也许让它与您当前的工作树(一个选项)或另一个提取的存档(另一个选项)进行比较。
因此,以您的示例为例:
A---B---C---D topic
/ / \
E---F---G---H---I master
您可以使用 git difftool
从提交 A
或提交 B
或 C
或 D
或 ... 中提取快照I
。您也可以让它提取任何其他提交,然后在两次提取上运行 kdiff3
,或者您可以使用第一次提取来运行 kdiff3
以及当前在您的工作树中的任何内容。
要查看通过在 B
中获取快照,然后对该快照进行更改而形成的假设快照中可能包含的内容: >
- 查找从
C
到D
的变化;然后 - 将这些更改添加到
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
中的快照之间的差异 与快照之间的差异 相同或相似在 D
和 C
中。出于这个原因,您可能希望使用其他名称来调用 commit J
,例如 D'
,但是您叫什么并不重要;这是一个新的提交,包含一个挑选结果的存档。