如何获取当前分支的git日志,只是合并提交

时间:2018-06-13 08:49:07

标签: git git-merge git-log

我正在使用此git命令以相反的顺序获取日志(来自特定的提交)并提交详细信息:

git log eab3e0ffdsfs.. --reverse -M --numstat --summary --pretty=format:commitId:%H%ndate:%cd%nsubject:%s%nauthor:%an%n

这给了我在指定提交之后的所有提交,包括来自另一个分支的提交,这些分支稍后被合并到当前分支中。

但是我只对当前的分支提交和合并提交日志感兴趣。

我尝试了以下选项:

git log --first-parent 8e146445d19b.. --reverse -M --numstat --summary --pretty=format:commitId:%H%ndate:%cd%nsubject:%s%nauthor:%an%n

提供当前分支的提交但我没有收到在该合并提交中修改过的文件。我只是获取合并提交的作者姓名,主题和日期。

但是,如果你去github并检查你的分支的历史记录,你会得到当前的分支提交,只有一个合并的提交,包括修改过的文件。

我们可以用git命令实现吗?

由于

1 个答案:

答案 0 :(得分:2)

尝试将-m添加到您最成功的git log命令中,即:

git log -m --first-parent 8e146445d19b.. --reverse -M --numstat --summary --pretty=format:commitId:%H%ndate:%cd%nsubject:%s%nauthor:%an%n

-c--cc选项也可以使用,但请在此处使用-m。)

值得注意的是:

  

但是我只对当前的分支提交和合并提交日志感兴趣。

第一个命令 显示当前分支的提交。

使用Git时,重要的是要意识到在合并其他分支时,当前分支上的提交集会发生变化

          D--E--F   <-- br1
         /
...--B--C
         \
          G--H--I   <-- br2

这是两个分支上的一系列提交(由单个大写字母而不是实际哈希ID标识)的图形。早期的提交在左边,后面的提交在右边。

现在,我认为直观明显,并且每个人都会同意,提交D-E-F仅在分支br1上,提交G-H-I仅在分支br2上}。但是:哪些分支或分支提交B-C(以及之前的任何分支)?

Git的答案是这些提交都在两个分支上。此外,如果您现在git checkout br1然后git merge br2,则会得到以下结果:

          D--E--F
         /       \
...--B--C         J   <-- br1
         \       /
          G--H--I   <-- br2

现在,突然,提交G-H-I也在两个分支上!

当您添加--first-parent时,您告诉Git的是,当它从J开始向后遍历时,它应该在合并时仅跟随 每个合并提交的第一个父级。 J的第一个父级是FI是第二个父级),这意味着:J步行到F,{{ 1}}到F,依此类推

  

...但是[with E]我没有收到在合并提交中修改过的文件。

默认情况下,当--first-parent显示合并提交时,它不会显示任何差异。我上面提到的三个选项git log-m-c告诉--cc它应该显示合并提交的差异。

有三个选项的原因是合并提交的显示方式很复杂。对于非合并提交,它非常简单:每次提交都是所有文件的完整快照,因此Git所要做的就是比较 parent 中的文件提交,对提交本身的文件。例如,对于提交git log,Git可以从快照F中提取所有文件,然后从快照E中提取所有文件,以及不同的所有文件,好吧,这就是变化 - 这是从FE的差异。

使用 merge 提交,例如F,有两个父项。哪个Git应与JJE进行比较?答案I默认使用:不要打扰,这太难了。 :-)如果你想说服git log展示一些东西,你需要一个额外的选项。其中两个选项 - git log-c - 告诉Git使用组合差异

组合差异相当棘手。 Git从所有父项中提取所有文件,并将它们与合并快照中的所有文件进行比较。如果任何父文件与合并提交的文件完全相同,则Git会将该文件从文件列表中删除到diff。所以现在,Git有一个非常小的文件列表:那些在合并结果中与任何输入快照不匹配的文件。 1 Git然后将每个文件区分开来父对照最终合并版本的每个此类文件的版本,并组合差异,以便您可以一次看到所有各种版本。 --cc-c选项执行此操作。

--cc选项在概念上要简单得多。遇到合并提交时,Git只需拆分合并以进行显示。而不是同时将-mJF 联合起来,Git进行了一种虚拟提交:I,并将其与J-from-F,并向您展示差异。然后,除非您使用F,否则Git会继续进行第二次虚拟提交:--first-parent,并将其与J-from-I进行比较,并向您显示 差异。< / p>

由于您可能希望将合并视为与合并之前的更改,因此您需要两个选项I--first-parent

1 这样做的一个原因是在Git中比较完全匹配的文件非常快,并且实际上并不需要从提交中提取文件。因此,通过抛弃所有“至少一个父级”相同的文件,Git可以大大减少这个问题。