我正在尝试获取类似于git log
的日志信息,但具有特定于拉取请求的信息。我想获得pull请求,它只是合并到master,已更改的文件。
例如,我有一个刚刚合并的拉取请求。它改变了File1,File2和File4。
我还有另一个刚刚合并的拉取请求。它改变了File1,File3。
我希望能够获得与特定拉取请求相关联的文件的名称。
我的问题是git log --oneline
或git whatchanged -m
或git log --pretty=format:"%H" --name-only
没有按顺序显示事物,并且由于提交而很难解析。
无论如何都要检索从拉取请求编辑的文件?
你可能想要:
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和合并提交,即。就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执行合并时,它通过以下方式执行:
--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,不仅仅是迂腐。 :-)