我正在尝试使用$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
之间已更改的文件列表感兴趣。
我有办法做到这一点吗?
答案 0 :(得分:7)
git pull
与git 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
的分歧。当C
和master
都指向origin/master
时,您就开始工作了。显然,您已提交C
和D
,并且“他们”(无论他们是谁)已提交E
和F
。顺便提一下,提交G
称为合并基础。
C
的含义是:找到我master...origin/master
,然后在左右两侧给我“从那里开始”的所有内容。也就是说,C
和 master
上的所有提交,不包括他们第一次见面时的任何提交。
如果你运行origin/master
,你会看到: 2 所有你提交的提交,以及所有提交他们制作。但是,如果您运行gitk master...origin/master
,git 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