找到错误源头:git push被拒绝:错误:无法推送某些引用

4
在其中一个团队使用git时,我们经常遇到“git push rejected: error: failed to push some refs”错误。

对于git@git.far-mteria.org:ledy/thakres.git ! [rejected]
b_stable -> b_stable (non-fast-forward) error: failed to push some refs to 'git@git.far-mteria.org:ledy/thakres.git',为了防止您丢失历史记录,拒绝了非快进式的更新。在再次推送之前,请合并远程更改(例如'git pull')。有关详细信息,请参见“git push --help”的“关于快进”的部分。

当然,我们可以通过使用“-f”来解决问题,但这只是一种粗略的方法。
但是,我们想知道这个问题的根源或原因。
Git不能给出详细的拒绝原因吗?比如说,导致冲突的文件是哪个?
我们怀疑是.gitignore引起了另一个项目中的类似问题。

你没有收到真正的错误信息吗?例如:![rejected] master -> master(非快进) 错误:无法将某些引用推送到'git@git.somewhere.git' - Simon Boudrias
编辑并添加缺失的消息部分。然而,Git没有告诉我导致问题的确切源或文件。 - ledy
3个回答

1
Git不会逐个推送单个文件,而是推送完整的提交树,即“这是整个项目在一个提交中的样子,然后在另一个提交中它看起来像那样,现在最终看起来像这样”。 以提交为图形表示,例如非常线性的:
...--D--E--F--G    <-- master

被“拒绝”的是您提供的“finally”不是远程之前的“finally”的“前进”,也就是说,您缺少了其他人放入的“前进”。您有:
...--D             <-- master

然后你添加了提交记录EFG。但是在你这样做的同时,有人拿起以D结尾的提交系列,并添加了他或她自己的提交H

...--D--H          <-- master

您正在提议放弃 H 并使提交序列看起来像 您的 序列: D 之后是 E-至-G,那就结束了一切。
Git 告诉您要放弃的进度所在的 分支名称,在本例中为 master。由您决定 git fetch 进度,然后保留它,可能是通过 git merge 创建一个合并提交 M
       H------
      /       \
...--D         M   <-- master
      \       /
       E--F--G

或者通过将您的一系列提交“变基”在H之上:

...--D--H-E'-F'-G' <-- master

(其中 E' F' G'是“在 E F G 中发生了什么变化”的版本,只需稍微更改即可使它们适用于 H - 这往往只是提交父级,偶尔需要进行更多的工作。)

首先,感谢您提供详细的解释。不管怎样,如何在此时分析错误的确切来源呢?Git不能告诉我树的哪一部分缺失,或者给出提示在哪里可以找到它吗?在历史记录中,我没有看到除了我之外有其他人向主分支提交过更改。他们将更改添加到与主分支不同的几个分支中。然而,如果他们正在更新b_stable,而我尝试提交和推送到主分支,这将与关于b_stable的通知发生冲突<-这对我来说并不重要... - ledy
与上文相同,您需要使用 git fetch 命令来获取“他们”的提交。您应该设置一个“远程”,命名URL并提供名称空间以跟踪“他们的提交”。如果您的存储库最初是从 git@git.far-mteria.org:ledy/thakres.git 克隆的,则已经有一个名为 origin 的远程指向该存储库。然后,git fetch origin 将带来所有必要的提交并更新 origin/master 以表示它们。使用 git log origin/mastergitk --all 查看“他们”的提交并决定如何处理。如果只需进行 git merge,则可以使用 git pull;请参阅其他 SO 帖子。 - torek
另外(空间不足):git push 可以使用分支名;git push origin master 限制了推送仅将 master 分支推送到远程的 origin。 (最终,您可能还想决定如何处理 b_stable,但那可以稍后再说。)这可能是您现在想要的。 - torek
请纠正我如果我说错了,但是这个git fetch会覆盖我自己的更改,对吗? - ledy
我怀疑你的 b_stable 没有设置为跟踪 origin/b_stable,或者一些有趣的 push 配置项。例如,git config --get-regexp '^branch\..*' 显示了什么? - torek
显示剩余2条评论

1

运行git pull命令,然后尝试push,这就是该消息所表达的意思。


这并没有解决问题。如所描述的,使用“-f”可以强制覆盖,但这并不是我正在寻找的修复或错误源细节。 - ledy
是的,但请阅读 @torek 的回答,他解释了关于分支的内容。可能需要先 checkout 相应的分支。 - Jorge Orpinel Pérez

0

这可能是一个难以找到的问题,我遇到过几次,当磁盘不同步或过载时,iowait 很高。

git show-branch --list --all 是否会担心分支名称的歧义性:"warning: refname xyz is ambiguous"?

如果是这样,请尝试

$ rm -rf .git/refs/heads/origin/xyz

$ git branch --set-upstream lkgr origin/xyz


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