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

问题描述 投票:1回答:1

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

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

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

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

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

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

git github
1个回答
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

Long

好吧,首先,重要的是区分拉请求,这不是Git定义的,1和合并提交,即。就Git而言,pull请求只是任何其他提交。在合并之前,您必须以某种方式查找或指定第二次提交。您正在查看的是在某些网页上已经点击了一些标记为“合并拉取请求”的点击按钮的后遗症。

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

... git whatchanged -m ...没有按顺序显示事物......

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

git log --raw -m bdae4af87053490adad2dc9fb184d6d050d46a4c

在Git的Git存储库中:

$ git log --raw -m bdae4af87053490adad2dc9fb184d6d050d46a4c
commit bdae4af87053490adad2dc9fb184d6d050d46a4c (from 8d7fefaac4318ac3155368f475e10f97714ebd47)
Merge: 8d7fefaac 176b2d328
Author: Junio C Hamano <[email protected]>
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 <[email protected]>
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,它被修改。

然后它将commit 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样式输出)git log --raw获取diffs(并使用git diff-tree缩小它们),并以您喜欢的顺序指定合并提交哈希和第一个父提交哈希,或者任何解析为第一个父提交哈希的东西。


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

2OK,不仅仅是迂腐。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.