【问题标题】:Git push complaining about non-fast-forward, even though remote has been pulled即使远程已被拉出,Git push 仍抱怨非快进
【发布时间】:2011-08-09 02:02:29
【问题描述】:

我正在尝试将我的更改推送到我的 NAS 上的存储库。它以我不理解的方式失败。

documentation 声明默认情况下push 仅适用于快进更新。很公平。所以我做了一个git pull(我的遥控器叫rubix):

D:\RoboCup\Dev\TinMan>git pull rubix master 来自 ssh://rubix/volume1/git/TinMan * 分支主 -> FETCH_HEAD 已经是最新的了。

一切看起来都很好。让我们尝试推动...

D:\RoboCup\Dev\TinMan>git push rubix master 到 ssh://dnoakes@rubix/volume1/git/TinMan ! [拒绝] master -> master(非快进) 错误:未能将一些参考推送到 'ssh://dnoakes@rubix/volume1/git/TinMan' 为防止您丢失历史记录,拒绝了非快进更新 在再次推送之前合并远程更改。请参阅“关于 'git push --help' 的 fast-forwards 部分了解详细信息。

我已经阅读了git push 上的文档,但此时我不明白为什么会出现这个问题。

这里是一些其他的上下文信息:

D:\RoboCup\Dev\TinMan>git --version git 版本 1.7.0.2.msysgit.0 D:\RoboCup\Dev\TinMan>git 分支 *(无分支) 掌握

最后一行看起来很可疑。我怎么能不在任何分支上?另请注意,我也有一些未跟踪的文件和已修改(未暂存)的更改。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: git dvcs git-push


    【解决方案1】:

    我遇到了同样的问题并遇到了这个问题,所以我想我会发布我的问题的解决方案。

    注意:我在 Windows 上使用 git。

    我不小心用不同的大小写检查了我的本地分支:“开发”而不是我通常的“开发”。在我按照以下步骤操作之前,我所做的任何事情都无法纠正问题(即使在检查了具有正确大小写的分支之后):

    1. 用正确的大小写“develop”签出分支
    2. 进行任何更改,添加/提交
    3. 现在您可以推送而不会被拒绝

    【讨论】:

      【解决方案2】:

      如果还是不行,你可能需要配置你的 git 来接受别名分支名称

      git config --global push.default upstream
      

      默认情况下,如果你的远程分支名称是origin/master,只有你的本地跟踪分支名称是ma​​ster,git才会接受你的推送。如果您将本地跟踪分支创建为 ma​​ster_xxx,除非您将 push.default 配置修改为 upstream,否则 git 不会接受您的推送。

      【讨论】:

        【解决方案3】:

        这是同步的一种方法。

        首先,提交任何更改,然后使用git log 记录您想要推送的任何提交。

        接下来重置你的主人以匹配遥控器:

        git checkout master
        git reset --hard remotes/rubix/master 
        

        最后,挑选你想要保留的提交

        例子:

        git cherry-pick 111aaa111
        git cherry-pick 123abc123
        

        现在推送应该可以了。

        git push rubix master
        

        【讨论】:

          【解决方案4】:

          我不确定你是如何最终没有分支的。你可能正处于一个变基的中间。你可能已经直接签出了一个提交。无论如何,这很可能是你的推动困境的原因。检查git reflog 看看它是否显示任何明显的原因,检查git log 看看你在哪里。使用git diff 查看更改的文件,以决定是否要保留它们(如果需要,请使用git add . && git stash)。然后,一旦您确定不需要任何更改或任何当前历史记录,git checkout master 即可返回。

          【讨论】:

          • 谢谢。 git checkout master 有道理,但我现在回到了过去。我应该做git merge <oldref>吗?
          • 查看您的git reflog,尝试找出您之前的位置。假设你知道<oldref>,并且它是当前master的后代,你可以git merge <oldref>。确保输出包含“Fast-forward”。否则,如果您正在创建合并提交(对于非直接后代),我建议首先为那些具有有用名称的提交创建一个主题分支。
          • 当我签出 master 时,Git 打印出 <oldref>。从那个 ref 合并是有效的,我能够继续我想做的事情。非常感谢您的帮助。
          猜你喜欢
          • 2018-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-20
          • 2012-08-27
          • 2010-10-08
          • 1970-01-01
          • 2011-05-17
          相关资源
          最近更新 更多