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

时间:2013-08-18 07:17:07

标签: 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.

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

我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:7)

git pullgit fetch相同,后跟git merge(或git rebase)。

git fetch显示更新后的哪个引用。它将显示如下内容:

a8e5e4e..295bf31  master     -> origin/master

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

git diff --name-status a8e5e4e..295bf31

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

答案 1 :(得分:5)

michas' answer是问题所针对的问题。

如果您没有旧的参考号,即a8e5e4e的{​​{1}}部分怎么办?可能你实际上并不关心:正如他所建议的,看a8e5e4e..295bf31 master -> origin/master可能会更有趣。 1 但是,这个三点master...origin/master语法实际上是什么? >意味着

答案在git rev-list文档中:

  

另一个特殊符号是...,它对此有用    合并。由此产生的提交集是对称差异    两个操作数之间。 ...

我怀疑这个措辞令人困惑(实际上<commit1>...<commit2>使用了一个完全不同的含义)。但实际上,它并不复杂。

鉴于一些提交可以这样绘制:

git diff

你所拥有的是提交master origin/master E G | | D F \ / C | B | A 的分歧。当Cmaster都指向origin/master时,您就开始工作了。显然,您已提交CD,并且“他们”(无论他们是谁)已提交EF。顺便提一下,提交G称为合并基础

C的含义是:找到我master...origin/master,然后在左右两侧给我“从那里开始”的所有内容。也就是说,C master上的所有提交,不包括他们第一次见面时的任何提交。

如果你运行origin/master,你会看到: 2 所有提交的提交,以及所有提交他们制作。但是,如果您运行gitk master...origin/mastergit diff flags master...origin/master会将大部分内容抛出。相反,它会找到合并基础git diff 3 并将其与右侧名称区分开来。

假设您在C分支上(即master仅表示“主”),您可以进一步缩短此范围。要查看自您和他们的分支分歧后他们修改了哪些文件,只需运行:

HEAD

取消名称意味着$ git diff --stat ...origin/master # or --name-status, etc ,因此这与HEAD相同,与HEAD...origin/master相同。

如果你的git足够新,master...origin/master指的是“当前分支的上游分支”(即来自@{u},找到master),所以你可以运行:

origin/master

(引号用于保护大括号不受外壳影响;在您的特定外壳中可能需要也可能不需要它们)。即使您使用$ git diff --stat '...@{u}' 作为其上游,develop以及origin/develop作为其上游等,也可以使用此功能。


1 如果您没有featureX,请尝试:

origin/featureX

(或gitk,如上所述)。您需要$ git log --graph --boundary ...origin/master 来包含合并提交。您可能还想添加'...@{u}'

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

3 这假设只有一个合并基础提交。对于这些情况,这应该是真的。因此,gitk--boundary的树与上游分支头部的git diff树进行比较。你可以比较“他们在哪里”和“他们最终在哪里”,无论他们在任何长途驾驶中访问过的任何中间点。 :-)例如,如果提交C添加文件G然后提交F再次删除它,您将看不到该文件。

答案 2 :(得分:3)

git diff --stat master origin/master