2016-08-02 7 views
2

を追跡し続け、私の枝は、デフォルト追跡することによりあると私はgit push -u origin branch_nameを行う場合でも、私は私のpush.defaultオプションとしてmatchingを使用している場合でも、リモート・マスターにプッシュします。支店が最近開始マスター

# -------- 
# 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を編集することができます知っているが、WHYは、上記の作業をしません?


$ 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.autoSetupMergealwaysに設定したため、ローカルブランチから作成された新しいブランチがローカルブランチを追跡するためです。

これは問題の半分に過ぎませんが、これが起こっていなければ、問題は発生しません。したがって、の修正は、その設定を削除することです(デフォルトはほとんどの人が主に望むものと思われる)。問題の残りの半分アドレッシング


:ここ

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

問題はGitが言っているだけで何文字通りです:origin/my_branchが存在しないこと。さて、それは存在しませんまだ:あなたのお父さんに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はあなたが実行したかのように、名前masterを使用するために、他のGitリポジトリを尋ねます:

git push origin my_branch:master 

このgit pushを持つ他の問題がないとして、その辺はあなたの側には何を求めてセットしそのmasterあなたに合わせて、- あなたの側はからorigin/masterにアップストリーム設定を変更することで、-uで尋ねたことを行います。それはが意味するものではありません。もちろん、です。

(そして:それはそれはすなわち、masterローカルだときmasterに置換するあなたのGitのために少し悪そうです、branch.my_branch.remoteだけ.、ないoriginである。しかし、我々はGitリポジトリ自体を変更することはできませんと仮定し...。 git push -u origin my_branch:my_branch

  1. は、明示的なリモート側の名前を使用します。

    私はこの問題を解決するための3つの簡単な方法を参照してください。これは現在のアップストリーム設定よりも優先されるので、GitはGitにmy_branchへの書き込みを要求します。それが成功すれば、Gitはorigin/my_branchになり、my_branchのアップストリーム設定はorigin/my_branchに変更されます。

    ここで欠点の1つは、プッシュが失敗した場合、Gitは現在のアップストリーム設定を変更しないということです。もちろん、これは一般的にgit push -u(両方の次の2つの方法を含みますが、その2つの場合には、将来のために残されたトラップはありません)に当てはまります。

  2. は、明示的に git pushを実行する前に、現在のアップストリームの設定を削除します。 git branch --unset-upstream my_branch.git/configファイルを編集含め、または何か同等)。既存のアップストリームは存在しないので、GitはGitに masterという名前を使用するように要求しません。

    はできるだけ早くあなたのGitはoriginmy_branch(というよりもmaster)を作成するために彼らのGitを尋ねると、我々は戻って最初の方法で何が起こるかにしています。

  3. ローカルmasterを最初に上流に設定しないでください。効果は2

一つこれを行うためのハード方法が出て偽のあなたのGitリポジトリにある方法と同じである:あなたが実際にリモートに行かなくても、リモート追跡ブランチを作成することができます。これを行うにはgit branchではなく、 "plumbing"コマンドgit update-refを使用する必要があります。ただし、実際にはリモートにブランチを作成するプッシュの前に--set-upstream-toを使用することができます。 (他の難しい方法は、.git/configを直接編集したり、git configと同等の処理をしていたことです。実際にはまだ実際には存在しないものを上流に設定することができます.Gitは実際にここでは

+0

torekに感謝します。私はエイリアスなしで試しました(普通の 'git checkout -b new_branch'も役に立たなかったので、質問を開いた直後にすぐにOPを更新しました)。そして、私は常にブランチブランチブランチをローカルトラッキングに設定しましたブランチマスター。 –

+0

うーん、 'branch.autoSetupMerge'を' always'に設定しましたか?そうするかもしれない。 – torek

+0

はい!それは私のグローバル '.gitconfig'(ホームディレクトリ)の' [branch] autosetupmerge = always'でした。 –

関連する問題