今天,我检查了GIT存储库中的最后合并,因为丢失了一些修改。
如果打开概述,我只会在平台上获得以下输出:
Merge branch 'master' of bitbucket.org:<ourProject>/<ourRepo>
# Conflicts:
# <pathToTheFile>.cs
是否可以显示合并的所有修改?如果有可能,我该如何检查呢?
答案 0 :(得分:3)
所有Git提交都是快照。对于合并提交以及常规无聊的非合并提交都是如此。合并提交和非合并提交之间的主要区别在于,合并提交具有(至少)两个 个父级,而不是只有一个。 1
当您查看具有git show <hash>
或git log -p
的普通单亲提交时,Git会注意到这些实际上是普通的单亲提交,因此Git提取了 parent 先提交提交的快照,然后提取提交的快照,然后Git运行:
git diff [options] <parent-hash> <commit-hash>
,它告诉您此提交的父级与此提交之间的更改。
对于任何提交,包括合并提交,您都可以手动进行完全相同的操作。但是,由于合并提交具有两个父母,因此您会发现必须选择两个父母中的一个 。
这就是git log -p
不会为合并提交显示任何内容的原因:很难知道要选择哪个父级。嗯,也就是说,除了要查看合并对主线带来的变化之外,您通常需要第一个父级。 2 或者,如果您确实想要第二个父级,只需指定! git log
命令向您介绍父母双方:
commit 085d2abf57be3e424cad0b7dc8c27fe41921258e
Merge: cf22247b63 c3749f6e59
Author: ...
所以我们可以在这里运行:
git diff cf22247b63 085d2abf57be3e424cad0b7dc8c27fe41921258e
查看第一个父对象和提交之间的更改,或者明显的其他git diff
命令查看第二个父对象和提交之间的更改。
git show
命令在应用于合并时,将默认显示Git称为组合差异的内容:它将对每个父对象运行一个差异,然后从该差异中排除与任一父文件完全匹配的任何文件,并仅显示其余文件的更改,主要是发生冲突的地方。如果这还不够(通常如此),那么可以在此处应用一个简单的选项:
git show -m 085d2abf57be3e424cad0b7dc8c27fe41921258e
会将提交“拆分”为两个单独的虚拟提交(都不会存储在任何位置)。然后,Git可以首先将085d2abf57be3e424cad0b7dc8c27fe41921258e (from cf22...)
与它的第一个父对象进行比较,然后将085d2abf57be3e424cad0b7dc8c27fe41921258e (from c374...)
与它的第二个父对象进行比较。结果是两个单独的差异,就好像有两个单独的非合并提交一样,这使您可以找出更改的内容。
1 root 提交具有 no 个父母。任何具有至少一个提交的Git存储库都至少具有一个根提交,因为第一个提交没有父级。
2 这假设您不使用git pull
,它会创建一些称为foxtrot merge的东西。