我遇到了多个开发人员共享的git repo的问题。一个分支似乎已经丢失(种类),当我尝试使用此分支推送到远程仓库时,我收到以下消息...
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.
回购中有3个分支:
我是唯一使用实时分支(用于部署到实时服务器)的开发人员,我直接在这个分支中做了一些工作(我知道这不是一个好主意,但这是一个错误)并在本地提交。我试图推动时出现此错误。
其他开发人员无法看到live
分支或dompdf0.5.2
分支(我创建了这两个分支,但已将它们推送到远程仓库 - 它们甚至在gitweb界面中显示为HEADS) 。即使开发人员执行git pull --all
,它仍然不会将这些分支拉下来。
另一个奇怪的现象是,当查看gitweb上的日志时,它只显示master
,但是当查看live
分支的短日志时,它会在live
的同一点显示master
master
位于live
短信中。
我对这里发生的事情感到有点困惑,我可以看到gitk
分支在远程仓库中,但未在主仓库日志中显示。
有没有人有任何想法?如果您需要git fetch
git pull
和git push --force
来解决错误消息,但无济于事。我唯一没试过的是fatal: ref ed2cacdacad22c75ca765cfc996304c8c7c8a654 is not a symbolic ref
fatal: ref 98c37bd8a9ef2fc16e882c17b4c04f417ae7b2b2 is not a symbolic ref
,因为我不想失去我的历史。
编辑2:运行提供的脚本后,我收到以下内容:
{{1}}
答案 0 :(得分:1)
也许'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
答案 1 :(得分:1)
您所遇到的只是因为有人在中间更新了分支而不允许您推送。在推送更改之前,您需要拉动此分支。 git pull --all不起作用的原因可能是因为你的本地实时分支没有设置为跟踪origin / live
试试这个:
git branch --set-upstream live origin/live
git checkout live
git pull
git push