如何获取 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是F
(I
是第二个parent),所以这意味着:从[=27=走]到F
,F
到E
,等等。
... 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
中的所有文件,以及 中的所有文件不同,嗯,这就是变化——这就是从 E
到 F
的差异。
通过 merge 提交,如 J
,但是,有 两个 parents。 Git 应该与 J
、E
或 I
进行比较? git log
默认使用的答案是:别打扰了,太难了。 :-) 如果你想说服git log
展示一些东西,你需要一个额外的选择。其中两个选项——-c
和 --cc
——告诉 Git 使用 组合差异 .
组合差异相当棘手。 Git 从所有 parent 中提取所有文件,并将它们与合并快照中的所有文件进行比较。如果 any parent 文件与合并提交的文件 完全相同,Git 将该文件从列表中删除文件差异。所以现在,Git 有一个非常小的文件列表:那些在合并结果中与输入快照的 any 不匹配的文件。 1 Git 然后将每个此类文件的每个 parent 版本与最终合并版本进行比较,并合并差异以便您可以一次看到所有不同的版本。 -c
和 --cc
选项执行此操作。
-m
选项在概念上要简单得多。遇到合并提交时,Git 只是 拆分 合并以供显示。而不是将 J
与 F
和 I
同时进行比较 ,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 大大减少了问题。
我正在使用此 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是F
(I
是第二个parent),所以这意味着:从[=27=走]到F
,F
到E
,等等。
... 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
中的所有文件,以及 中的所有文件不同,嗯,这就是变化——这就是从 E
到 F
的差异。
通过 merge 提交,如 J
,但是,有 两个 parents。 Git 应该与 J
、E
或 I
进行比较? git log
默认使用的答案是:别打扰了,太难了。 :-) 如果你想说服git log
展示一些东西,你需要一个额外的选择。其中两个选项——-c
和 --cc
——告诉 Git 使用 组合差异 .
组合差异相当棘手。 Git 从所有 parent 中提取所有文件,并将它们与合并快照中的所有文件进行比较。如果 any parent 文件与合并提交的文件 完全相同,Git 将该文件从列表中删除文件差异。所以现在,Git 有一个非常小的文件列表:那些在合并结果中与输入快照的 any 不匹配的文件。 1 Git 然后将每个此类文件的每个 parent 版本与最终合并版本进行比较,并合并差异以便您可以一次看到所有不同的版本。 -c
和 --cc
选项执行此操作。
-m
选项在概念上要简单得多。遇到合并提交时,Git 只是 拆分 合并以供显示。而不是将 J
与 F
和 I
同时进行比较 ,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 大大减少了问题。