Git: "更新被拒绝,因为您当前分支的最新提交落后于远程分支.." 但是如何查看差异呢?

29
我刚刚完成了一段代码的工作,当我要推送更改时,出现了已经很有名的错误提示:
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. 
hint: 'git pull ...') before pushing again.

我在这里看到过这个问题被多次发布,例如(1)(2)
因此,解决方案要么是:
- 运行git pull,这样远程的更改就会合并到我的本地工作中,或者 - 运行git push -f,强制推送以更新远程(origin)分支。
现在,我已经有一段时间没有在这个分支上工作了。我不一定想将远程的更改合并到我的当前工作中!我也不知道是否可以安全地强制更新原始分支...
我该如何只查看差异并决定哪种方法最适合我的情况?

如果你想将更改带入远程分支,那么很可能无法避免摩擦。最好的做法是让本地分支与远程更改保持同步。现在,你可以尝试作为干运行合并,以查看冲突有多严重。 - Tim Biegeleisen
3
git push -f 命令会覆盖其他人在远程仓库上的所有更改,除非这是你个人的仓库,否则你可能不希望使用它。 - max630
https://dev59.com/FmEi5IYBdhLWcg3wpdnJ#21088381 - jeevu94
5个回答

15

为了看到差异,首先需要从原始仓库获取提交记录:

git fetch origin

现在您可以查看差异(假设您在主分支上):git diff HEAD..origin/master

现在您已经掌握了所需的知识,可以决定在push更改之前是合并还是变基


4
两个点会混合显示本地和远程分支之间的差异。在这种情况下,最好使用三个点的差异(three-dots diff)来查看特定于本地或远程侧的更改。您可以参考 git-diff文档中的说明 - max630
非常奇怪。我也做了同样的事情,但没有任何区别。 - KansaiRobot
如果没有差异,您可以选择使用 git reset 命令将您的分支指针移动到 origin/master。 - Ben
git diff HEAD..origin/master => 致命错误: 模糊的参数 'HEAD..origin/master': 未知的修订版本或路径不在工作树中。 使用 '--' 来分隔路径和修订版本,就像这样: 'git <command> [<revision>...] -- [<file>...]' - Petrus Theron

13

最近我遇到了这样的情况:我使用git checkout -b feature/abc创建一个新分支,提交了一些更改,然后尝试用git push --set-upstream origin feature/abc创建一个拉取请求以供审查。由于我认为我在本地定义分支,但实际上远程分支已经存在,因此出现了错误。删除远程分支解决了问题,我的推送成功了。


你如何删除远程分支? - Bluz
我们使用的是BitBucket,因此BitBucket UI显示了远程分支,我只是从那里删除了它。git CLI也应该提供一种删除远程分支的方法...我只是不用那种方式。 - djb
谁知道为什么git告诉我不能执行git push,并建议我执行git push --set-upstream origin mybranch,当你是对的时候,github上已经有一个分支了。谢谢,问题解决了! @Bluz 我只是去github点击“分支”,然后点击同一分支旁边的垃圾桶图标。 - Rock Lee
1
这在我的情况下也是问题所在。这个答案应该得到更多的赞。 - philosopher

9

我发现这个命令可以正常工作:

git push -u origin main -f

你只需要添加一个 "-f" 标记来强制推送就可以了。


2
我想分享最近发生在我身上的一个场景,即使你做得一切正确,这个错误似乎会突然出现。原因并不明显,但最终似乎是由于自 git 版本 2.0 起默认推送行为的更改引起的。我正在与使用 git 版本 1.8 的人合作,而我有版本 2.x。因此,尽管我们都在进行 git push,但不同类型的 push 正在发生。对我们来说,问题解决了,一旦我们通过在 git 版本 1.8 计算机上运行以下命令来更改默认的 push 行为:

git config --global push.default simple

这将把 git 版本 >=1.7 的 push.default 更改为与版本 2.0 及以后相同。对于较低版本的 git,您可能需要另一种默认行为。我们两个都是 git 新手,如果我错了,请纠正我,但这确实让我们的“更新被拒绝…”错误消失了。

此外,如果有更好的答案场所,请告诉我,我很乐意将其移动到其他地方。


0

如果您想要放弃本地更改,您应该运行git reset --hard @{u}。请注意,这是一项不可逆转的操作,因此在运行之前请确保您已经确认过了。以下是如何操作:

要查看您当前拥有的本地提交,可以使用git log HEAD --not --remotes,与任何远程分支进行比较或者使用git log @{u}..HEAD来查看特定于跟踪分支的差异。

要查看您已经本地提交的实际差异,请运行git diff @{u}...。这将忽略远程进度,并仅显示您的更改。

要查看未提交的更改,请运行git diff HEAD

PS:您应该先运行git fetch origingit remote update来更新跟踪引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接