【发布时间】:2021-12-07 16:14:17
【问题描述】:
我确实有以下别名,以显示任何给定文件的提交历史记录:
file-history = log --follow --date-order --date=short -C
它运行良好,但从不显示“合并提交”,而文件可能已经在我们合并到 main 的分支中进行了修改,例如。
解决方案是添加选项-m,但随后会显示很多很多很多合并提交,其中大多数似乎与文件的提交历史无关。
编写这样一个别名以使其行为正确的正确方法是什么(就像在 BitBucket 中一样):显示所有确实更改文件的提交,并且只显示那些? p>
额外信息 --
使用 -m 显示提交太多;具体来说:
(在红色矩形中,我应该看到的......这就是 BitBucket 显示的......)
(顺便说一句,我不明白为什么提交 da3c94a1 是重复的。)
使用 -c 显示更多提交(应该报告的第一个提交在页面底部)并显示差异(我不想在这里看到):
--cc 的结果相同:
而 --first-parent 显示了奇怪的结果(因为我完全没有看到我感兴趣的提交):
新的额外信息 --
而且,使用 --first-parent -m,没有变化:
对 TOREK 的回答 --
为了简单起见,我创建了以下测试仓库:
master master
C--D I--J
/ \ / \
A--B G--H M--N master
\ / \ /
E--F K--L
br1 br2
我确实将br1 和br2 合并到master。
我创建了一次只更改一个文件的提交。
提交更改了 file1(仅):
ACFIL
提交更改了 file2(仅):
BDEHJKN
修改了两个文件的提交:
-
G(br1合并到master) -
M(br2合并到master)
让我们从测试开始:
$ git log --decorate --date=short
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 7ae0238 (br2) Commit L
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 ca2e68f Commit I
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 9aaa030 (br1) Commit F
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 611bef2 Commit C
2021-11-05 eceafb8 Commit B
2021-11-05 e137033 Initial commit
你知道吗?我本来希望看到这个:
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 ecd490f Commit J
2021-11-05 ca2e68f Commit I
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 86a71ff Commit D
2021-11-05 611bef2 Commit C
2021-11-05 eceafb8 Commit B
2021-11-05 e137033 Initial commit
也就是说,我预计既不会看到来自br1 的提交 E 和 F,也不会看到 K 和 L
来自br2。所以,看来我什么都不懂……
现在,让我们看看file2.txt 的文件历史... GitHub 和 BitBucket --
我已经测试了它们 - 向我展示以下提交(并且只有那些)
要求显示文件的历史记录:
BDEGHJKMN
这是我预期的 2 个结果中的 1 个 - 另一个是
没有提交 E 和 K 也一样,因为我本以为它们会被隐藏(如
作为分支的一部分,未在master 上提交)。
现在,让我们来玩一些“文件历史”命令:
$ git log --follow --date-order --date=short -C file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
$ git log --follow --date-order --date=short -C -m file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
$ git log --follow --date-order --date=short -C -c -s file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
$ git log --follow --date-order --date=short -C --cc -s file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
$ git log --follow --date-order --date=short -C -m --first-parent file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
$ git log --follow --date-order --date=short -C --cc --full-history -s file2.txt
2021-11-05 d670be5 (HEAD -> master, origin/master, origin/HEAD) Commit N
2021-11-05 838f65c Merge branch 'br2' (Commit M)
2021-11-05 affed14 Commit K
2021-11-05 ecd490f Commit J
2021-11-05 45d8231 Commit H
2021-11-05 eb356b8 Merge branch 'br1'
2021-11-05 552a403 Commit E
2021-11-05 86a71ff Commit D
2021-11-05 eceafb8 Commit B
我们来一一分析结果:
$ git log --follow --date-order --date=short -C file2.txt
不显示合并提交。结果不完整。那么失败。
$ git log --follow --date-order --date=short -C -m file2.txt
确实显示了 file2.txt 已更改的所有提交,但重复了合并
提交。部分失败...
$ git log --follow --date-order --date=short -C -c -s file2.txt
和
$ git log --follow --date-order --date=short -C --cc -s file2.txt
两者都显示了file2.txt 所在的 9 个提交(7 个“正常”+ 2 个合并)
改变了。与 BitBucket 和 GitHub 上的结果相同。
$ git log --follow --date-order --date=short -C -m --first-parent file2.txt
显示master 上的所有提交,其中file2.txt 已更改,并且合并
提交。可能是我得到的其他预期结果,但不一样
BitBucket 和 GitHub。那就扔掉吧。
$ git log --follow --date-order --date=short -C --cc --full-history -s file2.txt
还显示了 9 个提交。
因此,给出与 GitHub 中的命令相同(完整)结果的命令 和 BitBucket 是:
$ git log --follow --date-order --date=short -C -c -s file2.txt
$ git log --follow --date-order --date=short -C --cc -s file2.txt
$ git log --follow --date-order --date=short -C --cc --full-history -s file2.txt
回到我的请求,这可能表达得很糟糕,它是 以下:我确实想查看所有确实更改了某些文件的提交,以便 显示其他文件在相同的提交中也发生了变化,这样做发现 对于某些特定的功能请求,我必须更改的文件列表。
根据我的真实示例,BitBucket 似乎是正确的
识别这些提交,并且我的 file-history 别名没有......
显示提交不足,提交过多,甚至不适当的提交......
回到那个真实的例子,下面的命令:
$ git log --follow --date-order --date=short -C -c -s 32-factures-creation.R | wc -l
$ git log --follow --date-order --date=short -C --cc -s 32-factures-creation.R | wc -l
$ git log --follow --date-order --date=short -C --cc --full-history -s 32-factures-creation.R | wc -l
全部返回 440 行:
2021-10-18 d5590007 Merge branch 'master' of https://bitbucket.org/.../...
2021-10-18 6ccde740 Merge branch 'master' of https://bitbucket.org/.../...
2021-10-06 9d532874 Merge branch 'indexation-RMMMG-09-2021' into release/21.10
2021-10-04 d982c3d8 Merge branch 'indexation-RMMMG-09-2021' into release/21.10
2021-10-04 0a65134f Merge branch 'indexation-RMMMG-09-2021' into release/21.10
2021-10-02 728897b9 Merge branch 'indexation-RMMMG-09-2021' into release/21.10
2021-09-30 0df507b9 Simplify SQL expression in 32-factures-creation.R
2021-09-30 16f94a10 Update format of prsAnneeMois
2021-09-29 f9a6cafb Update "Facturation à l'employeur"
2021-10-02 22ef1194 Merge branch 'feature/103-upgrade-...-logo' into release/21.10
2021-09-20 9a2244d3 (tag: xxx_21-10-20_23-01-50, tag: sh_21-10-20_22-56-11, tag: sh_21-10-20_22-54-54, tag: 2021.10.20_23.04_xxx) Merge branch 'master' of https://bitbucket.org/mc.../...
2021-09-20 9fa77b1e Merge branch 'new-new-augm-eff'
2021-07-02 b4538cce Merge branch 'new-augm-eff' into release/21.07
2021-07-02 20c72364 (tag: 2021.07.01) Merge branch 'master' of https://bitbucket.org/.../...
...
这比我在 BitBucket 上看到的要多:
2021-09-30 0df507b9 Simplify SQL expression in 32-factures-creation.R
2021-09-30 16f94a10 Update format of prsAnneeMois
2021-09-29 f9a6cafb Update "Facturation à l'employeur"
...
所以,在上面,我仍然看到太多的提交。还是很疑惑……
【问题讨论】:
-
将
-m、-c或--cc添加到您的git log。有关这些选项的作用,请参阅git diff的文档。-m的问题在于它(如您所见)可能会显示许多合并提交:文件与 either 父文件不同的任何合并提交都会显示在此处。 -
或者,考虑使用
--first-parent遍历only 主线,完全跳过任何合并的分支。然后-m会做你想做的事(我想-c和--cc也会做,虽然我没有测试过)。 -
亲爱的@torek,如您所见,替代选项不起作用:它们显示了太多的提交,其中一些甚至显示了完整的差异(这里不需要什么)... ;-(
-
-c和--cc选项不应这样做,因为它们会丢弃任何与至少一个父级匹配的文件。但是,-m选项 将 这样做(显示比您希望查看的更多的合并),因为您将获得两个单独的合并结果比较:一个关于第一个父母,一个关于第二个。因此,如果合并的结果与 either 父级不同(在将其剥离为感兴趣的文件之后),-m将显示它。 -
我确实看到了您的输出,但这并不奇怪。您需要添加
-s以抑制实际差异,同时保留-c或--cc。这两个都将确保出现"evil merge"。
标签: git logging merge commit history