2014-04-02 153 views
4

該方案很簡單。從我有一個分支叫myBranch。我一直在後者工作。一旦我完成了一些修改,我想將我的本地副本myBranch的更改推送到遠程分支myBranch。 每次我試試這個,我得到了下面的錯誤/警告消息Git推送分支錯誤

To [email protected]:brabbit/projectA.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]: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很陌生。

回答

6

您需要更改默認的普通行爲。被投訴的分支是master,該分支似乎並不是您正在開發的分支。默認情況下,Git把push.default當作matching,這意味着當你說git push時,它會每推送到原點。不幸的是,大多數人並沒有將所有分支機構的本地版本保持最新,這將導致您在上面看到的錯誤。

發生這種情況的原因是遠程存儲庫中的master分支上有新的提交,但是您的本地版本master沒有它們。當你推,Git試圖使遠程master分支符合你的本地版本。由於本地版本落後於多次提交,所以這是一個非快速更新(你會損失歷史記錄)並且Git抱怨。

我通常建議人們改變push.default設置馬上要麼upstreamsimple,或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中改變默認行爲的原因 - 儘管我認爲他們已經做到了。

3

你仍然在樹枝上myBranch,所以你需要明確說,你只想要把那個分支:

git push origin myBranch 

或者,您可以配置總是推說你的分支默認:

git config push.default current 

之後,修復主分支:

git rebase origin/master master 
git push origin master 
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