如何在命令行上重新创建GitHub拉取请求的差异?

19

在我正在打开的拉取请求分支上工作时,我希望能够看到与GitHub显示相同的差异。哪个git diff命令可以复制GitHub为拉取请求显示的更改列表?


这个问题比你链接的那个问题早两年。所以另一个才是重复的 ;) - stason
6个回答

9
最接近的方法是使用您的特性分支和基础分支之间的共同祖先进行差异比较。例如:
git diff `git merge-base feature-branch base-branch`

图片:我的错,没有阅读文档,而且命令建议它可以进行合并。 - João Antunes

4
如果您不想执行任何git fetch并更新本地PR分支,则可以使用GitHub的命令行界面cli/cli版本0.9.0包括gh pr diff

https://user-images.githubusercontent.com/98482/82266353-13a03300-992f-11ea-8d71-2a0995707f87.png


1
花费了6年的时间,但终于得到了一个完全令人满意的答案。 - Jacob Dalton

2

不确定是否有一种方法可以使实际差异格式更接近Github样式,但是$ git diff master...<branch_name>似乎显示的是一组更改,这些更改与拉取请求相同(假设它是针对master的拉取请求)。拉取请求中更改文件的列表似乎等同于$ git diff --name-status master...<branch_name>。我想这都假定您的本地分支与远程Github分支保持最新。


1
假设您想检查名为master的基本分支:
git diff $(git merge-base --fork-point master)

这将提供自创建分支以来的所有更改,包括尚未提交的更改!

该命令与@pic答案中的命令相同,但它更简单,因为不需要知道特性分支。

如果您只想获取已提交的更改(类似于@VonC答案中的gh pr diff命令),则以下命令将提供相同的结果:

git diff $(git merge-base --fork-point master) HEAD

git diff 的方式在某些情况下可能更有用,因为您可以使用所有其他 git diff 功能。例如,如果您不想要差异,而是想知道哪些文件已被修改,只需传递 --name-only 参数即可:

git diff --name-only $(git merge-base --fork-point master)

你无法使用 gh 来完成这个操作。


这些命令与 gh pr diff 不会给我相同的输出。它们会给出在特性分支和主分支之间发生变化的每个文件,即如果在创建分支后合并到 master 的其他提交也会被列出。 - ashgromnies
我也发现了这个问题,自己写的时候也遇到了。试试用git diff $(git merge-base master HEAD)代替它。我应该更新一下这个答案,如果它管用,请告诉我。 - stason

0
请参阅 GitHub 高级培训中的 审查和同步 部分。特别是,在获取拉取请求后,您可以查看合并之前的差异:
$ git fetch origin refs/pull/1/head
$ git show FETCH_HEAD

1
有没有一种方法可以在不拉取引用的情况下完成这个操作?这似乎是工作流程/烦恼。我更喜欢完全使用git命令行而不获取GitHub创建的额外引用集合的一组命令,例如git diff ...master + flags - Jacob Dalton

-1

git diff branchA branchB 应该可以工作,对吧?

其他有用的 diff 符号 的更多信息可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接