完成合并后,如何验证合并的所有更改?

时间:2018-07-09 12:50:03

标签: git bitbucket

今天,我检查了GIT存储库中的最后合并,因为丢失了一些修改。

如果打开概述,我只会在平台上获得以下输出:

Merge branch 'master' of bitbucket.org:<ourProject>/<ourRepo>

# Conflicts:
#   <pathToTheFile>.cs

是否可以显示合并的所有修改?如果有可能,我该如何检查呢?

1 个答案:

答案 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的东西。