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

时间:2017-03-31 10:35:16

标签: git

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

2 个答案:

答案 0 :(得分:5)

  

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

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

作为odradek wrote in a comment,添加-c选项会使git log显示组合差异。您也可以使用--cc(注意--cc的两个破折号,-c的一个破折号),其中还显示组合差异,或-m,有效分割用于差异目的的合并,并针对该父项显示每个父项一个差异。

git show可以使用这三个相同的选项。不管出于何种原因,git show 默认--cc,而git log默认为什么都没有。

这三个选项之间的区别仅在某些合并时很明显,而且显示它们有点棘手。我们可以,但是,非常明确地说一句话:任何组合差异仅显示与所有父母不同的文件。两者git show -cgit show --cc修改显示的内容以尝试提供帮助。 (--cc表单可能会裁剪超过-c,具体取决于可以显示的内容。但我没有一个方便的例子。)

例如,考虑commit 3e5c63943d35be1804d302c0393affc4916c3dc3 in the Git repository for Git。这是一个合并(与父母c13c783...20690b2...合并,如果我们运行两个单独的 git diff命令,我们可以看到,与其第一个父级,只有两个文件发生变化:

$ git diff --name-status 3e5c639^1 3e5c639
M       builtin/remote.c
M       t/t5505-remote.sh

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

$ 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]

如果我对此运行git show --cc,我根本就没有差异列表;如果我在其上运行git show -c,我会获得builtin/remote.ct/t5505-remote.sh的差异列表。

如果我对此运行git show -m,我会获得两个单独的git diff个列表。 都不是"组合差异"。第一个开始于:

commit 3e5c63943d35be1804d302c0393affc4916c3dc3 (from
 c13c783c9d3d7d3eff937b7bf3642d2a7fe32644)

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

commit 3e5c63943d35be1804d302c0393affc4916c3dc3 (from
 20690b213975ad3e9b1bc851f434d818bd2d1de9)

并显示所有339个文件。

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

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

答案 1 :(得分:0)

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

现在正式发布Git 2.29(2020年第四季度):

请参见commit 5fbb4bccommit 9a6d515commit 6cea104commit 6f2e02acommit 9ab89a2commit 6fae74bcommit eed5332(2020年7月29日)由Jeff King (peff)
(由Junio C Hamano -- gitster --commit eca8c62中合并,2020年8月17日)

doc/git-log:阐明合并提交差异的处理方式

签名人:杰夫·金

令人惊讶的是,git-log在默认情况下未显示合并提交的任何差异。
可以说“ --cc”是一个合理的默认值,但是它非常昂贵(这就是为什么我们为“ git showman启用它的原因代表“ git log”。

至少要记录当前的行为,包括最近的“ --first-parent implies -m”案例

git log现在包含在其man page中:

请注意,除非给出-c--cc-m之一,否则合并提交 即使像--patch这样的差异格式也不会显示差异 被选中,它们也不会匹配-S之类的搜索选项。

例外是 使用--first-parent时,合并被视为正常 单亲提交(可以通过提供 组合差异选项或与--no-diff-merges一起使用。)


您还有:

要在“ -m”选项与“ git logman一起使用时取消隐式的“ --first-parent”选项,我们在--[no-]diff-merges主题中添加了“ jk/log-fp-implies-m”选项。

打开大门,允许“ --diff-merges”选项采用值,该值指示应如何计算合并提交的补丁(例如,“ cc”?“ -p父”),重新定义“ --diff-merges”以获取非可选值,并实现“ off”,这与“ --no-diff-merges”的含义相同。

请参见commit 298889dcommit 405a2fdcommit 6501580Sergey Organov (sorganov)(2020年8月6日)。
(由Junio C Hamano -- gitster --commit a555b51中合并,2020年8月17日)

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

签名人:Sergey Organov

git log现在包含在其man page中:

--diff-merges=off

--no-diff-merges

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