如何获取拉取请求的提交和文件列表? (不是通过用户界面)

时间:2018-01-04 23:54:08

标签: git github

我正在尝试获取类似于git log的日志信息,但具有特定于拉取请求的信息。我想获得pull请求,它只是合并到master,已经更改的文件。

例如,我有一个刚刚合并的拉取请求。 它改变了File1,File2和File4。

我还有另一个刚刚合并的拉取请求。 它改变了File1,File3。

我希望能够获取与特定拉取请求相关联的文件的名称。

我的问题是,git log --onelinegit whatchanged -mgit log --pretty=format:"%H" --name-only没有按顺序显示内容,并且由于提交而难以解析。

无论如何都要检索从拉取请求编辑的文件?

1 个答案:

答案 0 :(得分:3)

TL; DR

你可能想要:

git diff-tree [options] <sha>^1 <sha>

,例如,由:

制作
$ git diff-tree --abbrev bdae4af8705^1 bdae4af8705
:100644 100644 50c6b2ab1... 8cc34186c... M      setup.c
$ git diff-tree --name-status bdae4af8705^1 bdae4af8705
M       setup.c

首先,区分拉取请求非常重要,这不是Git定义的, 1 合并提交< / em>,这是。就Git而言,pull请求只是任何其他提交。在合并之前,您必须以某种方式查找或指定第二次提交。您正在查看的是在某些网页上点击了一些标记为&#34;合并拉取请求&#34;的点击按钮的后遗症。

我说这一切都不是迂腐, 2 但是因为这是一件好事,因为这意味着你现在有一个你通过运行获得的合并提交 git fetch。 (如果您尚未使用git fetch来获取合并提交,请先执行此操作。)这样可以简化问题!您不必搜索所有已合并的提交,而只需查看合并提交本身:

  

... git whatchanged -m ...没有按顺序显示内容......

使用git log -m - git whatchanged实际上只是git log --raw所以你正在这样做 - 这是一种可行的方式。我不清楚你的意思是什么&#34;不按顺序显示事物&#34;事实上,它以非常精确和受控的顺序显示事物,正如我们通过跑步看到的那样,例如:

git log --raw -m bdae4af87053490adad2dc9fb184d6d050d46a4c

在Git的Git存储库中:

$ git log --raw -m bdae4af87053490adad2dc9fb184d6d050d46a4c
commit bdae4af87053490adad2dc9fb184d6d050d46a4c (from 8d7fefaac4318ac3155368f475e10f97714ebd47)
Merge: 8d7fefaac 176b2d328
Author: Junio C Hamano <gitster@pobox.com>
Date:   Tue Dec 19 11:33:58 2017 -0800

    Merge branch 'sg/setup-doc-update'

    Comment update.

    * sg/setup-doc-update:
      setup.c: fix comment about order of .git directory discovery

:100644 100644 50c6b2ab1... 8cc34186c... M      setup.c

commit bdae4af87053490adad2dc9fb184d6d050d46a4c (from 176b2d328ccc305aa2e565c39ad7b0fb24099275)
Merge: 8d7fefaac 176b2d328
Author: Junio C Hamano <gitster@pobox.com>
Date:   Tue Dec 19 11:33:58 2017 -0800

    Merge branch 'sg/setup-doc-update'

    Comment update.

    * sg/setup-doc-update:
      setup.c: fix comment about order of .git directory discovery

:000000 100644 000000000... 611ab4750... A      .clang-format
:100644 100644 320e33c32... 8ce9c6b88... M      .gitattributes
:000000 100644 000000000... 64e605a02... A      .github/CONTRIBUTING.md
[mass snippage]

这是任何人总是会为此特定提交获得的输出:它首先将提交本身(哈希ID bdae4af87053490adad2dc9fb184d6d050d46a4c)与其第一个父8d7fefaac4318ac3155368f475e10f97714ebd47进行比较。此比较中只更改了一个文件,即setup.c,已修改。

然后将提交bdae4af87053490adad2dc9fb184d6d050d46a4c与其第二个父176b2d328ccc305aa2e565c39ad7b0fb24099275进行比较。这次,更改并添加了许多文件。

第一个父级是 提交git merge之前的分支的提示。第二个提交是作为git merge的参数的提交(这是与两个父节点的正常合并;如果这是章鱼合并,则输出将继续显示针对第三个父节点的新提交,因此上)。

当Git执行合并时,它通过以下方式执行:

  • 找到合并基础提交(或者在极少数情况下,当存在多个合并库时,构建一个用作合并基础的新提交);
  • 将合并基础提交与当前(HEAD)提交进行比较,获取--ours更改集;
  • 将合并基础提交与其他提交进行比较(假设标准的两次提交合并),获取--theirs更改集;和
  • 将这两个更改集中发现的更改合并到基础。

如果Git成功地将这些结合起来,Git继续自己进行新的合并提交。如果没有,它会停止并获得用户的帮助。在任何情况下,结果都是一个新的提交,带有一个新的哈希ID,其父项是--ours提交(旧的HEAD提交)和--theirs提交,特别是的顺序

这意味着第一个git log输出部分精确显示了从--theirs分支(对于合并基础)获得的那些尚未出现在--ours分支中的更改。显示合并提交与其第二个父级的第二个git log输出部分显示从--ours分支(对于合并库)获得的更改,这些更改尚未存在于--theirs分支中

一般来说,第一个这样的部分是有趣的部分。

您可以使用--name-status或(对于git diff / git whatchanged样式输出){{1}获取差异(例如,使用git log --raw缩小它们)并以您喜欢的顺序指定合并提交哈希和第一父提交哈希,或者解析为第一父提交哈希的任何内容。

1 Git有一个git diff-tree命令,但是当您单击Web服务器上的clicky按钮时,这不是您正在使用的命令。

2 好的,不是只是是迂腐的。 : - )