我正在尝试使用一些代码,$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在本地框中进行更改的文件列表感兴趣.
有没有办法可以做到这一点?
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获取后的输出.这样,您可以检查侧面的变化和原点侧的变化.
如果您没有旧的引用(即的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。显然,您已承诺D和E,并且“他们”(无论他们是谁)已承诺F和G。C顺便说一句,提交称为合并库。
什么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)
(引号是为了保护括号不受外壳影响;在您的特定外壳中可能需要也可能不需要)。这个工程即使你在develop与origin/develop它的上游,或featureX与origin/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将树C与G上游分支头的树进行比较。您将“他们在哪里”与“他们在哪里结束”进行比较,无论他们在任意长途行驶中访问的任何中间点。:-)例如,如果commit F添加一个文件this/that,然后G再次提交将其删除,则不会看到该文件。