如何获取 git 仅当前分支和合并提交的日志

How to get git logs of only current branch and just a merged commit

我正在使用此 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

给出了当前分支的提交,但我没有收到在那个合并中修改过的文件commit.I只是获取合并提交的作者姓名、主题和日期。

但是,如果您转到 github 并检查您的分支的历史记录,您将获得当前分支提交和合并提交,包括其中修改的文件。

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

谢谢

尝试将 -m 添加到您的 mostly-successful 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。)

这里还有一点值得注意:

However I am just interested in current branch commits and merged commits log.

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

使用 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 开始向后遍历时,它应该在合并时遵循 只有每个合并提交的第一个parent。 J的第一个parent是FI是第二个parent),所以这意味着:从[=27=走]到FFE,等等

... but [with --first-parent] I don't receive files that have been modified in that merged commit.

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

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

通过 merge 提交,如 J,但是,有 两个 parents。 Git 应该与 JEI 进行比较? git log默认使用的答案是:别打扰了,太难了。 :-) 如果你想说服git log展示一些东西,你需要一个额外的选择。其中两个选项——-c--cc——告诉 Git 使用 组合差异 .

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

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

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


1这样做的一个原因是比较 exact-match 的文件在 Git 中非常快,并且实际上不需要提取文件从提交。所以通过扔掉所有 "same in at least one parent" 文件,Git 大大减少了问题。