在其中一个团队中,当使用git时,我们一次又一次遇到“git push被拒绝:错误:未能推送一些引用”
To 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’ 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.
当然,我们可以继续使用“-f”作为quick’n’dirty – 而不是真正的解决方案.
但是,我们想知道它的来源或拒绝的原因是什么.
不能git给出关于它拒绝的原因的详细信息,也许是导致冲突的文件?
我们对.gitignore有疑问,导致另一个项目出现类似问题.
最佳答案
Git不会一次推送一个单独的文件,它会推送完整的提交树,例如,“这是整个项目看待一个提交的方式,然后它看起来像另一个提交,现在终于看起来像这样” .
绘制为提交图,这是非常线性的:
...--D--E--F--G <-- master
被“拒绝”的是,你所提供的“最后”不是来自遥控器之前的“最后”进展,也就是说,你错过了别人投入的一些“前进”.你有:
...--D <-- master
然后你添加了提交E,F和G.但是当你这样做时,其他人选择了以D结尾的一系列提交并添加了他或她自己的提交H:
...--D--H <-- master
你建议抛弃H并使提交序列看起来像你的序列:D后跟E-through-G,这就是一切的结束.
Git告诉你分支名称,它具有你要求扔掉的进度,在本例中是master.这取决于你git获取进度然后保留它,也许是通过git merge创建一个合并提交M:
H------
/ \
...--D M <-- master
\ /
E--F--G
或者可能通过在H之上“重新定位”你的一系列提交:
...--D--H-E'-F'-G' <-- master
(其中E’,F’和G’是“在E,F和G中发生了变化”的版本,只有足够的变化使它们适用于H而不是 – 通常只是提交父母,偶尔会有一点更多的工作涉及).