2016-08-02 28 views
2

開始,我的樹枝現在默認情況下跟蹤和推動該遠程主,即使我做git push -u origin branch_name即使我用matching作爲我push.default選項。科最近一直跟蹤主

# -------- 
# STEP 1 
# -------- 
$ git checkout -b my_branch 
Branch my_branch set up to track local branch master. 
Switched to a new branch 'my_branch' 

# -------------------------------------------------------------------------------- 
# STEP 2: (same behavior BTW with current/upstream/simple) 
# -------------------------------------------------------------------------------- 
$ git config --global push.default matching 

# -------- 
# STEP 3: 
# -------- 
$ git push -u origin my_branch 
Counting objects: 8, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (8/8), done. 
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done. 
Total 8 (delta 7), reused 0 (delta 0) 
To XX:YYY/my_repo 
    62d390c..4e4baa1 my_branch -> master 
Branch my_branch set up to track remote branch master from origin. 

另外,如果我嘗試STEP 2下面,我得到一個錯誤:

$ git branch --set-upstream-to=origin/my_branch 
error: the requested upstream branch 'origin/my_branch' does not exist 
hint: 
hint: If you are planning on basing your work on an upstream 
hint: branch that already exists at the remote, you may need to 
hint: run "git fetch" to retrieve it. 
hint: 
hint: If you are planning to push out a new local branch that 
hint: will track its remote counterpart, you may want to use 
hint: "git push -u" to set the upstream config as you push. 

我知道我可以手動編輯.git/config,但爲什麼沒有上述工作?


$ git remote -v 
origin XX:YYY/my_repo (fetch) 
origin XX:YYY/my_repo (push) 

$ git --version 
git version 2.9.2 
+0

你在推後做了'git fetch'嗎?我會認爲這會創建'origin/my_branch'。 – selfthinker

回答

4

不應該發生的中間線,該位爲可疑:

$ git checkout -b my_branch 
Branch my_branch set up to track local branch master. 
Switched to a new branch 'my_branch' 

舉例來說,當我在一個倉庫做git checkout -b foo

$ git checkout -b foo 
Switched to a new branch 'foo' 

注缺乏上游設置。 我的猜測是,你的gco別名或腳本內部有--track編輯:原來是因爲您已將branch.autoSetupMerge配置爲always,因此從本地分支創建的新分支會跟蹤其本地分支。

這只是問題的一半,但如果沒有發生這種情況,完全不會發生問題。因此一個修正是刪除該設置(默認似乎是大多數人最想要的)。


解決這個問題的另一半:

$ git branch --set-upstream-to=origin/my_branch 
error: the requested upstream branch 'origin/my_branch' does not exist 

問題這裏是字面上正是Git是說:這origin/my_branch不存在。那麼,它不存在還有:你需要說服你的Git擁有origin/my_branch。 Git是Git,有很多方法可以做到這一點,但可能是一種最好的方式,我們稍後會介紹。

$ git push -u origin my_branch 
Counting objects: 8, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (8/8), done. 
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done. 
Total 8 (delta 7), reused 0 (delta 0) 
To XX:YYY/my_repo 
    62d390c..4e4baa1 my_branch -> master 
Branch my_branch set up to track remote branch master from origin. 

這就是事情出錯:自my_branch已經有master上游設置(不origin/master,只是master),你的Git會詢問對方的Git使用的名稱master,就好像你已經用完:

git push origin my_branch:master 

由於沒有其他問題,這git push,他們一邊做什麼你身邊詢問集他們master,以配合您my_branch - 然後你的方面做你所要求的-u,這是將上游設置從master更改爲origin/master。這當然不是你要的意思是

(和:這似乎有點邪惡的爲您的Git在master替代時,這是一個本地master,即branch.my_branch.remote只是.,不origin不過,假設我們無法改變的Git本身...。 )

我看到三個簡單的方法來解決這個問題:

  1. 使用顯式遠程端名稱:git push -u origin my_branch:my_branch。這會覆蓋當前的上游設置,以便Git要求其Git寫入my_branch。如果成功了,它應該 - 你的Git現在將有origin/my_branch,並且會將my_branch的上游設置更改爲origin/my_branch

    這裏的一個缺點是,如果推送失敗,你的Git不會改變當前的上游設置。當然,這通常適用於git push -u(包括接下來的兩種方法,但在這兩種情況下,未來沒有陷阱)。

  2. 明確運行git push之前刪除當前上游設置:git branch --unset-upstream my_branch(或任何等效的,包括編輯.git/config文件)。現在沒有上游,你的Git不會要求他們的Git使用名稱master

    只要您的Git要求他們的Git在origin上創建my_branch(而不是master),我們又回到了第一種方法的情況。

  3. 避免將當地master設置爲上游位置。效果是一樣的方法2.

一個方式做,這是假的了你自己的Git:您無需究竟要遠程創建一個遠程跟蹤分支。要做到這一點,你將不得不使用「管道」命令git update-ref,而不是git branch。但是,如果您這樣做,則可以在推送實際在遠程創建分支之前使用--set-upstream-to。 (另一個難題是你直接編輯0​​或者等效於git config這個技巧,這樣你就可以將上游設置爲一個實際上還不存在的東西,因爲所有的Git真的在這裏做的是存儲的名字。)

+0

感謝torek。我嘗試了沒有別名(ig常規的'git checkout -b new_branch'也無濟於事。這就是爲什麼我在打開問題後很快更新了OP),並且我總是將'Branch new-branch設置爲跟蹤本地分支大師。' –

+0

嗯,你是否將'branch.autoSetupMerge'配置爲'always'?這可能會做到。 – torek

+0

是的!就是這樣:'[branch] autosetupmerge = always'在我的全局'.gitconfig'(主目錄)中。 –