2014-07-21 203 views
28

使用Git GUI檢出遠程分支releases/rel_5.4.1後,當我嘗試pushfatal:您當前分支的上游分支與當前分支的名稱不匹配

時,看到這個意外的錯誤消息
fatal: The upstream branch of your current branch does not match 
the name of your current branch. To push to the upstream branch 
on the remote, use 

    git push origin HEAD:releases/rel_5.4.1 

To push to the branch of the same name on the remote, use 

    git push origin rel_5.4.1 

我不知道Git在說什麼。我可能想推到origin releases/rel_5.4.1,因爲那是我檢查出來的分支。所以這兩個選項對我來說似乎都不正確我的分支rel_5.4.1

這裏是分支,因爲它出現在我的.git/config

[branch "rel_5.4.1"] 
    remote = origin 
    merge = refs/heads/releases/rel_5.4.1 

這是怎麼回事?

+0

你使用的是什麼版本的git(也是什麼平臺)? – R0MANARMY

回答

29

您當地的分支稱爲rel_5.4.1但遠程分支releases/rel_5.4.1(據混帳而言,/在分支名稱沒有任何特殊含義除了使它們更易於人眼閱讀)。

當您推送時,無論您是要將分支推送到releases/rel_5.4.1(遠程分支的名稱)還是要創建新的遠程分支,Git都會保持謹慎。但它注意到名稱的相似性。

除非你想創建一個新的分支,正確的命令是

git push origin HEAD:releases/rel_5.4.1 

你也可以使用

git push origin rel_5.4.1:releases/rel_5.4.1 

要解決警告一勞永逸,重命名您當地的分行,以配合遠程名稱:

git branch -m releases/rel_5.4.1 
+3

很好的答案,尤其是最終的結論。在本地和遠程使用不同名稱的IMO原因很少,除非您使用兩個或多個具有相同分支名稱的不同上游。但在這種情況下,在命令上手動輸入推送目標使我感覺比使用某些自動化解決方案更安全* – hek2mgl

+3

我同意這樣的結論:將分支名稱保持在雙方相同通常是最令人感到最困惑和最不容易混淆的。 的Git也同意,這就是爲什麼在配置爲** ** push.default的默認值是** **簡單,它強制執行此理智。從手冊頁:「**簡單** - 在集中式工作流程中,像**上游**一樣工作,如果上游分行的名稱與當地分行的名稱不同,則會增加安全性以拒絕推送。」 如果您需要相同的基本行爲(默認情況下只推送當前分支),請更改您的存儲庫的配置: 'git config push。默認上游' –

+4

如果我使用'git checkout -b branchname --track origin/releases/branchname'檢出分支,我很費力地告訴Git上游分支的名稱並要求它跟蹤它。沒有需要的魔術匹配,沒有危險,我說我想要這個分支 - 但它仍然會引發這個錯誤。爲什麼跟蹤適用於「拉」而不是「推」? –

0

似乎有一個不同於遠程的本地分支名稱不是什麼Git喜歡太多。您將需要發出:

git push origin HEAD:releases/rel_5.4.1 

明確地對每一個推

+0

是不是'release /'分支名稱的一部分? –

+0

哦,是的。我忽略了這一點。它應該從'releases /'開始。似乎Git錯誤消息是誤導性的。 (現在我得到了問題) – hek2mgl

+0

謝謝。前面的命令在我的遠程回購中創建了一個分支'rel_5.4.1'。我用'git branch -D rel_5.4.1'刪除了它。那是對的嗎? –

13

此錯誤可以一次性修復,全部修復:

git branch releases/rel_5.4.1 -u origin/releases/rel_5.4.1 

它更改分支的上游,以匹配正確的遠程(再次)。

+5

默認情況下,'git config push.default'設置爲'simple',這意味着即使遠程設置爲上游,如果遠程分支與本地分支名稱不匹配,它也永遠不會開心。設置'git config push.default upstream'將會抑制這些錯誤。 –

+0

@ JacobFord的評論非常重要。據我所知,這是解決這個問題的唯一方法,無需重命名您的本地分支。 – prasanthv

+0

謝謝!這正是我所需要的,雖然我真的很困惑爲什麼'git remote set-branch origin releases release/rel_5.4.1' does not solve the problem ... –

25

對於誰可能會錯過可能是最重要的細節,以及隱藏在評論讀者的利益:

這是由於git config push.default設置。它定義了當您輸入git pushsee link)時git所做的操作。

在的問題,顯然是設置被設定爲simple(這是git v2默認設置),可能與

git config --global push.default simple 

這意味着,git拒絕推時,本地和遠程分支機構不匹配究竟。要允許推到跟蹤分支,從而使git pull對稱git push,使用

git config --global push.default upstream 

注:離開--global客場挑戰剛剛更改設置爲當前(本地)git庫。

+0

我參考的評論是來自@ Tom-Spurling和Jacob-福特 – Tino

+0

我相信應該是最好的答案!因爲我不想在每次推動時提及跟蹤分支。 – basslo

+0

這就是我正在尋找的。 +1。謝謝。 –

1

在我的情況git branch --unset-upstream解決了這個問題。

+0

當你通過'git branch -m newbranch'重命名一個分支時,遇到了一個上游設置,並嘗試進行git push時,這會更加真實。在這種情況下,'git branch --unset-upstream',然後執行'git push'和git會告訴你'致命的:當前分支newbranch沒有上游分支。要推送當前分支並將遠程設置爲上游,請使用git push --set-upstream origin newbranch' – harschware

+0

yeap,使用該命令,稍後我沒有任何問題。 – gpap

相關問題