如何判断自上次git pull以来远程存储库上的哪些文件发生了变化?

use*_*637 7 git

我正在尝试使用一些代码,$git push origin master但是我得到了错误

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.
Run Code Online (Sandbox Code Playgroud)

当我做$ git fetch origin master,然后$ git diff master origin/master我得到了所有的是两个回购之间不同的文件和更改的列表.但是,我只对远程存储库和上次$ git pull origin master在本地框中进行更改的文件列表感兴趣.

有没有办法可以做到这一点?

mic*_*has 7

git pull与(或)git fetch后跟相同.git mergegit rebase

git fetch显示哪些引用更新.它会显示如下:

a8e5e4e..295bf31  master     -> origin/master
Run Code Online (Sandbox Code Playgroud)

这意味着你最后一次获取master时它位于a8e5e4e,现在它是295bf31.您可以使用以下内容查看已更改的文件:

git diff --name-status a8e5e4e..295bf31
Run Code Online (Sandbox Code Playgroud)

但也许更有趣的是gitk master...origin/master获取后的输出.这样,您可以检查侧面的变化和原点侧的变化.


tor*_*rek 5

michas的答案是所提出问题的正确答案

如果您没有旧的引用(即的a8e5e4e部分)a8e5e4e..295bf31 master -> origin/master怎么办?也许您实际上并不在乎:正如他所建议的那样,注视master...origin/master会更加有趣。1 但是,这种三点...语法实际上什么意思

答案在git rev-list文档中:

另一个特殊符号<commit1>...<commit2>对于合并很有用。提交的结果集是两个操作数之间的对称差。...

我怀疑这足以混淆措辞(实际上git diff使用了完全不同的含义)。但实际上,它并不那么复杂。

给出一些可以这样绘制的提交:

master  origin/master

   E       G
   |       |
   D       F
     \   /
       C
       |
       B
       |
       A
Run Code Online (Sandbox Code Playgroud)

你所拥有的是在提交方面的分歧C。你开始工作的时候master,并origin/master都显示出C。显然,您已承诺DE,并且“他们”(无论他们是谁)已承诺FGC顺便说一句,提交称为合并库

什么master...origin/master意思是:找到我C,然后给我的一切“从那里”,在左,右两侧。也就是说,所有的上都提交master origin/master,不包括任何在提交及以下的地步,他们第一次见面。

如果你运行gitk master...origin/master你会看到这一点:2个的所有提交完成的,所有提交他们做。但是,如果你运行,将大多数这一点的。相反,它将找到merge base ,3并将其与右侧名称进行比较。git diff flags master...origin/mastergit diffC

假设您在master分支机构中(也就是说,HEAD无论如何只是表示“主”),则可以将其进一步缩短。要查看自您和他们的分支分歧以来它们修改了哪些文件,只需运行:

$ git diff --stat ...origin/master   # or --name-status, etc
Run Code Online (Sandbox Code Playgroud)

省略名称意味着HEAD,因此HEAD...origin/master与相同master...origin/master

如果您的git足够新,请@{u}引用“当前分支的上游分支”(即from master,find origin/master),因此您可以运行:

$ git diff --stat '...@{u}'
Run Code Online (Sandbox Code Playgroud)

(引号是为了保护括号不受外壳影响;在您的特定外壳中可能需要也可能不需要)。这个工程即使你在developorigin/develop它的上游,或featureXorigin/featureX作为其上游等


1如果没有gitk,请尝试:

$ git log --graph --boundary ...origin/master
Run Code Online (Sandbox Code Playgroud)

(或'...@{u}'如上所述)。您需要--boundary包含合并提交。您可能还需要添加--oneline --decorate

2实际上,gitk也将向您显示合并提交,就像脚注1中的命令一样。也就是说,它--boundary用来包含汇合点提交(这与合并基础并不完全相同,但是足够接近)。

3这假设存在一个完全的合并基础提交。对于这些情况,这应该是正确的。因此,git diff将树CG上游分支头的树进行比较。您将“他们在哪里”与“他们在哪里结束”进行比较,无论他们在任意长途行驶中访问的任何中间点。:-)例如,如果commit F添加一个文件this/that,然后G再次提交将其删除,则不会看到该文件。


Mar*_*zer 3

git diff --stat master origin/master
Run Code Online (Sandbox Code Playgroud)