【问题标题】:Cannot Push Local Branch to Remote Git Repo无法将本地分支推送到远程 Git 存储库
【发布时间】:2011-06-16 09:45:16
【问题描述】:

我有一个在多个开发人员之间共享的 git 存储库的问题。一个分支似乎已经丢失(有点),当我尝试使用这个分支推送到远程仓库时,我收到以下消息......

To git@hades:bbis.git
 * [new branch]      dompdf0.52 -> dompdf0.52
 ! [rejected]        live -> live (non-fast-forward)
error: failed to push some refs to 'git@hades:bbis.git'
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.

repo 上有 3 个分支:

  • dompdf0.52 是我升级 dompdf 的临时分支(没关系)
  • 主人
  • live(这是有问题的分支)

我是唯一使用 live 分支(用于部署到 live 服务器)的开发人员,我直接在这个分支中做了一些工作(我知道这不是一个好主意,但这是一个错误)并在本地提交。尝试推送时出现此错误。

其他开发人员看不到 live 分支或 dompdf0.5.2 分支(我创建了这两个分支,但已将它们推送到远程仓库 - 它们甚至在 gitweb 界面中显示为 HEADS)。即使开发人员执行git pull --all,它仍然不会拉下这些分支。

另一个奇怪的现象是,在 gitweb 上查看日志时,它只显示 master,但在查看 live 分支的短日志时,它在 master 所在的同一点显示 live master 短日志。

我对这里发生的事情有点困惑,从我可以看到live 分支在远程仓库中但没有显示在主仓库日志中。

有人有什么想法吗?如果您需要来自gitk的任何图片,请告诉我

编辑:只是想我会提到,我试图通过执行 git fetchgit pull 来解决错误消息,但无济于事。我唯一没有尝试过的是git push --force,因为我不想失去我的历史。

编辑 2:运行 sehe 提供的脚本后,我收到以下信息:

fatal: ref ed2cacdacad22c75ca765cfc996304c8c7c8a654 is not a symbolic ref
fatal: ref 98c37bd8a9ef2fc16e882c17b4c04f417ae7b2b2 is not a symbolic ref

【问题讨论】:

    标签: git branch git-branch


    【解决方案1】:

    您所遇到的只是因为有人更新了中间的分支,所以不允许您推送。您需要先拉出此分支,然后才能推送您的更改。 git pull --all 不起作用的原因可能是因为您的本地实时分支未设置为跟踪源/实时

    试试这个:

    git branch --set-upstream live origin/live
    git checkout live
    git pull
    git push
    

    【讨论】:

      【解决方案2】:

      也许'live'是对master的象征性引用?在这种情况下,它仅充当别名,更新它会(可能?)更新主引用。

      符号引用应该用 git-update-ref 更新。老实说,我只使用过一次符号引用,从未将它们推送到遥控器。 git push(send-pack 或 receive-pack)可能不理解符号引用,并尝试通过首先解析符号引用来将它们视为普通引用。

      背景见What's the recommended usage of a Git symbolic reference?

      git refs 后台:http://progit.org/book/ch9-3.html

      用它来判断你的分支是否是符号引用:

      for ref in $(git rev-list --branches --no-walk); do
          git symbolic-ref "$ref"
          git check-ref-format --print "$ref"
      done
      

      对于所有(远程)分支,将 --all 添加到 rev-list

      【讨论】:

      • 感谢您的回复,我现在就试试这个。如果我最初使用git branch live 创建分支,那会创建一个符号引用吗?
      • @sehe 我可以在脚本中执行git 吗?从脚本中运行该代码会引发关于 git 不是命令的错误
      • (1) 符号引用不会偶然发生(分支创建正常的引用); (2) 毫无疑问,您遇到了 PATH 或别名问题;尝试使用完整路径(/usr/bin/git"c:\msysgit\msysgit\bin\git.exe"
      • @sehe 谢谢,我在做一些愚蠢的事情......我已经添加了该脚本的输出(我得到了一个致命的 git 错误)
      • @Jaitsu:不,你没有。您会收到一条信息性消息,确认 refs 实际上是不是,是象征性的。这是您要验证的内容。从现在开始你可以无视我的回答:)
      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 2010-10-25
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多