所以我在一个名为"test_branch"的分支上。
我做git add .
和git commit
,一切都很好。
但是当我做git push
时,它给了我错误:
! [rejected] acceptance -> acceptance (non-fast-forward)
error: failed to push some refs to 'git@github.com:company/sample.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.
做git pull
告诉我一切都是最新的,之后做一个推送,给我和上面一样的错误。
有人可以帮我吗?
谢谢。
在没有任何参数的情况下键入git push
时,其行为取决于push.default
设置的值。 push.default
的默认值是 matching
,根据 git help config
,它执行以下操作:
matching
-- 推送两端具有相同名称的所有分支。 这适用于将所有分支准备为可发布形状,然后使用单个命令将它们推出的人。 它不适合推送到由多个用户共享的存储库中,因为如果其他用户更新了分支,本地停止的分支将尝试非快进推送。
换句话说,如果您的本地仓库有一个名为 acceptance
的分支,而远程仓库有一个名为 acceptance
的分支,那么即使您没有签出acceptance
,git push
也会尝试使远程acceptance
分支与您的acceptance
分支匹配。
所以,我的猜测是你在过去某个时候签出了acceptance
,但项目中的其他人(或者你可能来自存储库的不同克隆)将新提交推送到acceptance
。 这导致您的本地acceptance
分支位于远程acceptance
分支后面。 现在,每当您键入 git push
时,您的 Git 都会尝试将远程acceptance
分支备份到您在本地存储库中的版本。
为了解决这个问题,我建议将push.default
设置为 simple
(如果 Git 版本中simple
不可用,则upstream
- 它仅在 1.7.11 中添加)。
分支必须合并才能推送可快进的提交。要找出答案,首先要做
$ git fetch
然后做
$ git log --graph --decorate --oneline --all
您应该看到您尝试推送的分支与您尝试合并的远程分支不在同一行中并且领先。
顺便说一下,git push
本身总是将所有跟踪的分支推送到它们的源/对应项,并且您可能有与其源对应项不同步的分支。在这种情况下,请忽略警告。您可以通过以下方式使此警告不那么冗长:
$ git config advice.pushNonFastForward false
但我现在看到你真正的问题可能是test_branch没有被git push
推动.要解决此问题,请键入:
$ git branch --set-upstream test_branch origin/test_branch