如何获取git log -p以显示合并提交中的更改

s5s*_*s5s 5 git

我有一个功能定义缺失的分支但该功能仍在使用导致崩溃.必须在合并期间删除函数定义.我已经完成了'git log -p'并搜索了函数定义,我可以看到它被定义但是后来无法找到它被删除.这让我相信'git log -p'没有显示合并更改?我该如何获得此功能?

tor*_*rek 7

这让我相信'git log -p'没有显示合并更改?我该如何获得此功能?

你是对的:默认情况下,git log -p显示合并提交,但甚至不尝试为它显示差异.

正如odradek在评论中写道,添加该-c选项将使git log节目组合差异.您也可以使用--cc(注意两个破折号--cc,相对于一个破折号-c),它也显示组合差异,或者-m,为了差异目的有效地分割合并,并且针对该父亲显示每个父亲一个差异.

这三个选项可以同时使用git show.无论出于何种原因,不过,git show 默认--cc同时git log默认什么都没有.

三个选项之间的区别仅在某些合并时才会明确,并且显示它们有点棘手.但是,我们可以说清楚一件事:任何组合差异只显示与所有父母不同的文件. 也就是说,git show -cgit show --cc修剪什么显示尝试是有益的.(--cc形式可能会削减-c,取决于可以显示的内容.但是,我没有一个方便的例子.)

例如,考虑在Git存储库中为Git 提交3e5c63943d35be1804d302c0393affc4916c3dc3.这是一个合并(与父母c13c783...20690b2...,如果我们运行两个独立的 git diff命令,我们可以看到,相比于它的第一个父母,只有两个文件改变:

$ git diff --name-status 3e5c639^1 3e5c639
M       builtin/remote.c
M       t/t5505-remote.sh
Run Code Online (Sandbox Code Playgroud)

但与其第二个父级相比,许多文件(包括相同的两个)都会发生变化:

$ git diff --name-status 3e5c639^2 3e5c639 | expand
M       .gitignore
M       .mailmap
M       Documentation/Makefile
A       Documentation/RelNotes/2.12.0.txt
M       Documentation/SubmittingPatches
A       Documentation/asciidoctor-extensions.rb
M       Documentation/blame-options.txt
M       Documentation/cat-texi.perl
M       Documentation/config.txt
M       Documentation/diff-config.txt
[snipped here - but the same two files do appear in the 339-entry list]
Run Code Online (Sandbox Code Playgroud)

如果我git show --cc继续这样做,我根本就没有差异列表; 如果我git show -c继续它,我得到一个差异列表为builtin/remote.ct/t5505-remote.sh.

如果我git show -m继续这样做,我会得到两个单独的git diff列表. 两者都不是"组合差异".第一个开始于:

commit 3e5c63943d35be1804d302c0393affc4916c3dc3 (from
 c13c783c9d3d7d3eff937b7bf3642d2a7fe32644)
Run Code Online (Sandbox Code Playgroud)

并显示前两个文件.第二个开始于:

commit 3e5c63943d35be1804d302c0393affc4916c3dc3 (from
 20690b213975ad3e9b1bc851f434d818bd2d1de9)
Run Code Online (Sandbox Code Playgroud)

并显示所有339个文件.

使用-m是真正的大锤子,但你需要通过大量的工作进行大量的分类.使用--cc-c通常就足够了.

(在查找此类更改时git log -p,其他可能有用的方法是添加--full-history以确保在每个合并后git log跟随两个分支.只有在通过添加-- <path>选项进行历史记录简化时才需要这样做.)


Von*_*onC 6

这让我相信 ' git log -p' 不显示合并更改?

确实如此,在 Git 2.31(2021 年第一季度)中:“ git logman学到了一个新--diff-merges=<how>选项。

对于 git 2.33(2021 年第三季度),git log -m将意味着-p(补丁)(请参阅本答案的末尾)。

请参阅提交 af04d8f提交 1d24509提交 e58142a、提交8efd2ef、提交b5ffa9e、提交 388091f 、提交 5071c75提交a6d19ec 提交5733b20提交 8c0ba52提交 255a4da提交 3d2b5f2提交a6e66af提交 d9b1bc6提交 1a2c4d8提交 6fc944d提交ec315c6提交 14c14b4提交 e121b4b提交 0c627f5 、提交 3291eea、提交 3b6c17b提交 09322b1提交564a4fc 、提交4f54544 、提交7acf0d0、提交18f0947 提交a37eec6提交 3d4fd94、提交027c478提交 299a663提交 891e417(2020 年 12 月 21 日) )作者:谢尔盖·奥加诺夫(Sergey Organov sorganov
(由Junio C Hamano 合并 -- gitster--提交 aac006a中,2021 年 2 月 5 日)

diff-merges:实施新的价值观--diff-merges

签署人:谢尔盖·奥加诺夫

我们首先将新选项实现为其原始选项的精确同义词,以使所有基础设施正确,并为以后的提交保留功能改进。

实现了以下值:

--diff-merges=            old equivalent 
first|first-parent      = --first-parent (only format implications)
sep|separate            = -m
comb|combined           = -c
dense| dense-combined   = `--cc`
Run Code Online (Sandbox Code Playgroud)

diff-merges:添加旧的助记符对应项--diff-merges

签署人:谢尔盖·奥加诺夫

--diff-merges={m|c|cc}对于那些习惯了旧选项的人来说,这会添加与旧选项的助记符相匹配的值。

请注意,例如, 的--diff-meres=cc行为与 不同--cc,因为后者暗示-p并因此为所有提交启用差异,而前者仅为合并提交启用差异输出。

diff-merges: 添加 ' --diff-merges=1' 作为 ' first-parent'的同义词

签署人:谢尔盖·奥加诺夫

正如我们现在所拥有的--diff-merges={m|c|cc},添加--diff-merges=1--diff-merges=first-parent 作为同义词,以使其具有更短的助记符。

doc/git-show: 包括 --diff-merges 描述

签署人:谢尔盖·奥加诺夫

将选项描述--diff-mergesgit-log.txt移至diff-options.txt,以便将其包含在( man )帮助中。git-show

diff-options现在包含在其手册页中:

--diff-merges=(off|none|first-parent|1|separate|m|combined|c|dense-combined|cc)

--no-diff-merges

指定用于合并提交的 diff 格式。默认值为 {diff-merges-default} 除非--first-parent正在使用,在这种情况下 first-parent为默认值。

--diff-merges=(off|none):

--no-diff-merges:

禁用合并提交的差异输出。对于覆盖隐含值很有用。

--diff-merges=first-parent:

--diff-merges=1:

此选项使合并提交仅显示相对于第一个父级的完整差异。

--diff-merges=separate:

--diff-merges=m:

-m:

这使得合并提交显示每个父级的完整差异。
为每个父级生成单独的日志条目和差异。
-m如果没有 则不会产生任何输出-p

--diff-merges=combined:

--diff-merges=c:

-c:

使用此选项,合并提交的 diff 输出会同时显示每个父级与合并结果的差异,而不是一次显示父级与结果之间的成对差异。

此外,它仅列出所有父级修改的文件。

-c暗示-p

--diff-merges=dense-combined:

--diff-merges=cc:

--cc:

使用此选项, --diff-merges=combined通过省略无趣的大块(其父级中的内容只有两个变体)而进一步压缩 产生的输出,并且合并结果会选择其中一个而不进行修改。 --cc暗示-p

--combined-all-paths

此标志导致组合差异(用于合并提交)列出所有父级的文件名。因此,它仅在使用时有效--diff-merges=[dense-]combined,并且可能仅在检测到文件名更改时有用(即,当已请求重命名或复制检测时)。endif::git-log[]

git log现在包含在其手册页中:

:diff-合并-默认:off

git show现在包含在其手册页中:

DIFF FORMATTING

以下选项可用于更改git show生成 diff 输出的方式。

git show现在包含在其手册页中:

:diff-合并-默认:dense-combined


这是基于 Git 2.29(2020 年第 4 季度)的工作,正式记录为:

请参阅Jeff King的提交 5fbb4bc提交 9a6d515提交 6cea104 、提交6f2e02a 、提交9ab89a2提交 6fae74b提交 eed5332(2020 年 7 月 29 日(由Junio C Hamano 合并 -- --提交 eca8c62中,2020 年 8 月 17 日)peff
gitster

doc/git-log:澄清合并提交差异的处理

签署人:杰夫·金

令人惊讶的是,git-log默认情况下不显示合并提交的任何差异。
可以说“ ”是一个合理的默认值,但它非常昂贵(这就是为什么我们为“ ” man而不是“ ”--cc打开它)。git showgit log

让我们至少记录一下当前的行为,包括最近的“ --first-parent implies -m”案例

git log现在包含在其手册页中:

请注意,除非给出-c--cc-m之一,否则合并提交将永远不会显示差异,即使--patch选择了类似的差异格式,也不会匹配诸如 之类的搜索选项-S

例外情况是在--first-parent使用时,合并被视为正常的单父提交(这可以通过提供组合差异选项或 with 来覆盖--no-diff-merges)。


而且你还有:

为了在“”选项与“ ” ( man )一起使用时取消隐式“”-m选项,我们在主题中添加了“”选项。--first-parentgit log--[no-]diff-mergesjk/log-fp-implies-m

要保持开放状态以允许“ --diff-merges”选项采用指示如何计算合并提交的补丁的值(例如“ cc”?“-p针对第一个父级?”),请重新定义“ --diff-merges”以采用非可选值,并实现“ off” 与“ ”意思相同--no-diff-merges

请参阅提交 298889d提交 405a2fd提交 6501580(2020 年 8 月 6 日),作者:Sergey Organov ( sorganov)
(由Junio C Hamano 合并 -- gitster--提交 a555b51中,2020 年 8 月 17 日)

doc/git-log: 描述--diff-merges=off

签署人:谢尔盖·奥加诺夫

git log现在包含在其手册页中:

--diff-merges=off

--no-diff-merges

禁用合并提交的差异输出(默认)。
可用于覆盖-m-c--cc


在 Git 2.32(2021 年第 2 季度)中,“ git logman学习了--diff-merges=<style>选项,以及关联的配置变量log.diffMerges

请参阅提交 364bc11提交 17c13e6提交 38fc4db提交 26a0f58提交 4320815(2021 年 4 月 13 日),作者:Sergey Organov ( sorganov)
(由Junio C Hamano 合并 -- gitster--提交 59bb0aa中,2021 年 4 月 30 日)

diff-merges: 引入 log.diffMerges 配置变量

签署人:谢尔盖·奥加诺夫

新的配置变量设置将使用的log.diffMerges格式。 默认为“单独”。--diff-merges=on

添加了 的文档log.diffMerges

git config现在包含在其手册页中:

log.diffMerges

设置用于合并提交的默认差异格式。详情请--diff-merges参阅。 git log默认为separate.


在 Git 2.33(2021 年第 3 季度)中,“ ” ( man )-m -m中的“ ”选项未指定 diff 所需的格式(如果有),但没有任何可见效果;它现在意味着生成了某种形式的 diff(默认情况下为“--patch”)。git log

请参阅提交 f5bfcc8提交 fd16a39提交 1e20a40提交 23f6d40提交 19b2517提交 e0b1642提交 3ae7fe2提交 faf16d4提交 48229c1提交 7a55fa0(2021 年 5 月 21 日),作者:Sergey Organov ( sorganov)
(由Junio C Hamano 合并 -- gitster--提交 8e444e6中,2021 年 6 月 14 日)

diff-merges:让“ -m”暗示“ -p

签署人:谢尔盖·奥加诺夫

修复-c/之间长期存在的不一致,--cc这些不一致确实暗示-p了一侧,但-m并不暗示-p了另一侧。

相应地更改相应的测试,因为“ log -m”输出现在应该与“”匹配log -m -p,而不仅仅是“ log”。

相应地更改文档。

笔记:

打完这个补丁后

git log -m
Run Code Online (Sandbox Code Playgroud)

生成差异而无需提供-p,这提高了一致性和可用性。如果将“ ”配置变量设置为“ ”以强制仅生成与第一个父级相关的常规差异,
它会变得更加有用。log.diffMergesfirst-parent-m

但是,当在命令行上显式提供特定的 diff 格式时,此补丁不会改变行为,因此像这样的命令

git log -m --raw
git log -m -