比较强制推拉请求的新旧版本

Rob*_*een 21 git github git-diff pull-request

通常,我的同事会对一个公开拉取请求进行一些更改,将他们的本地分支重新绑定到基本分支 - 通常也将他们的更改压缩到以前的提交中 - 并强制推送.

如何看待旧版PR与新版PR之间的变化?

我想我可以做一个git pullgit checkout $BRANCH_NAME当PR首次提出,然后git fetchgit diff $BRANCH_NAME..origin/$BRANCH_NAME对PR进行了更新后-但也将显示已通过重订引入基地分支(通常硕士),并带入PR的变化.是否有可能消除噪音并只显示PR本身的变化?

Dan*_*ato 9

结帐这个答案,这需要做的非常相似,你想达到什么样的东西另一个问题.

它描述了你的情况:

newcommit -> the new pull request commit
oldcommit -> the old pull request commit
upstream -> the base branch commit the new pull request is based on
Run Code Online (Sandbox Code Playgroud)

现在这样做:

git commit-tree newcommit^{tree} -p oldcommit -p upstream -m "message"
git show <commit id returned by previous command>
Run Code Online (Sandbox Code Playgroud)

这个想法是,提交树将假之间的合并oldcommitupstream生产newcommit树,从而含有的完全代码newcommit.它根本不会修改您当前的分支,它会创建一个新的无头提交并为您提供其ID.这意味着git show将每个修改列为冲突解决方案,这是新PR和旧PR之间的确切差异.

为了能够做到这一点,你需要在你的git存储库中的某个地方使用以前的PR(如果已经执行了强制推送,git历史记录已经被重写并且除非你在你的电脑上拥有它或者你有权访问,否则无法恢复服务器reflog).有关详细信息,请查看VonC答案.

假设:

  • 基地分支: master
  • 你在当地有旧公关分支: $BRANCH_NAME
  • 远程分支中的新PR: origin/$BRANCH_NAME

你可以这样做:

# fetch locally upstream changes (origin/$BRANCH_NAME)
git fetch
# produce the fake merge commit
git commit-tree origin/$BRANCH_NAME^{tree} \
         -p $BRANCH_NAME \
         -p `git merge-base master origin/$BRANCH_NAME` \
         -m "message"
# see "fake" conflict resolution = difference between the two PR
git show <commit id returned by previous command>
Run Code Online (Sandbox Code Playgroud)

git merge-base用于查找两个分支之间的共同祖先,在这种情况下,找到上提交了新的PR在基地分支基础上,如果你愿意,你可以直接写提交ID.


Von*_*onC 7

PR的旧版本

您可以直接在GitHub上执行此操作:请参阅"在GitHub上查找强制推送的提交者 "

单击"强制推送"链接将显示两次提交之间的两点对比.


原答案:2016年

这将仅在远程仓库的reflog中可用,其中包括分支强制推送的先前HEAD.
由于远程repo是GitHub,你仍然可以通过查看推送事件来推断旧提交:请参阅" github是否记得提交ID? ".

hat还将显示已引入基本分支的更改(通常为master)

更确切地说,您将始终与共同的祖先(包括来自基本分支的提交master)存在差异

请参阅Git diff提交范围中双点" .."和三点" ..."之间的区别是什么?

http://mythic-beasts.com/~mark/git-diff-help.png

因此,在您的情况下,您的强制推送分支在远程仓库上看起来像这样:

      x--x--x        (old branch in reflog)
     /
 m--M0--M--M   (master)
            \
             X--X--X (new branch forced push)
Run Code Online (Sandbox Code Playgroud)

diff old_HEAD..newHEAD将包括M来自基本分支的少数提交,因为它们是公共祖先(M0)路径的一部分.

因此,您可以比较强制推送分支(假设您正在监视pushEvents并知道该分支的先前HEAD).
但是,如果没有共同的祖先路径,你就不能轻易地比较两个分支.