情景很简单。从大师我有一个名为 myBranch 的分支。我一直在后者工作。完成一些修改后,我想将我的更改从 myBranch 的本地副本推送到远程分支 myBranch 。 每次我尝试这个时,我都会收到以下错误/警告信息
To git@github.com:brabbit/projectA.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:brabbit/projectA.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
重试并显示相同的错误。
您能否解释一下该消息的含义以及解决方法。我对git很新。
答案 0 :(得分:6)
您需要更改默认推送行为。被抱怨的分支是master
,它似乎不是您正在处理的分支。默认情况下,Git会将push.default
视为matching
,这意味着当您说git push
时,它会推送每个分支到达原点。不幸的是,大多数人并没有将所有本地版本的分支保持最新,这将导致您在上面看到的错误。
之所以会发生这种情况,是因为远程存储库中的master
分支上有新的提交,但您的本地版master
没有这些提交。当您推送时,Git正在尝试使远程master
分支与您的本地版本匹配。由于本地版本落后于多次提交,因此这是一次非快进更新(您将丢失历史记录)并且Git会抱怨。
我通常建议人们立即将push.default
设置更改为upstream
,simple
或current
:
git config push.default upstream
git config push.default simple
git config push.default current
您可以阅读git-config手册页的差异(搜索“push.default”)。您还可以在命令行中看到它:
git help config
设置后,git push
只会推送您所在的分支,此消息将消失。
此外,如果您正在讨论使用git push --force
,请在更改默认推送设置后再考虑使用它。这是失去历史的好方法,也是Git改变2.0中默认行为的原因 - 尽管我认为他们应该已经完成了。
答案 1 :(得分:3)
你还在分行myBranch
,所以你需要明确说你只想推动那个分支:
git push origin myBranch
或者,您可以配置为始终按下您默认启用的分支:
git config push.default current
之后,修复主分支:
git rebase origin/master master
git push origin master
答案 2 :(得分:1)
看起来,就像你的分支机构没有为git pull
配置得好。如果您只是想推送一堆简单的提交(没有合并提交),我建议使用git rebase
:
git checkout master
git rebase origin/master
git push
如果您的更改包含合并提交,并且您想要推送它,就像您在历史记录中看到的那样(gitk --all
),您可以
git checkout master
git merge origin/master
git push