TL; DR: git branch --set-upstream-to origin/solaris
あなたが尋ねた-た「私は、上流を設定する必要があります」と、私は少し言い換えます質問への答えは、-is:いいえ、あなたはしていない持っているすべてのアップストリームを設定します。
ただし、現在のブランチのアップストリームがない場合、Gitはgit push
、および他のコマンドの動作も変更します。
ここでの完全なプッシュストーリーは長く退屈で、Gitバージョン1.5より前の歴史にさかのぼります。それを全体的に短くするために、git push
不十分に実装されました。1 Gitバージョン2.0以降、Gitには、push.default
デフォルトでに設定された設定ノブが付いていますsimple
。2.0より前と後のいくつかのバージョンのGitでは、実行するたびにgit push
、Gitは多くのノイズを吐き出して設定を説得しようとしますpush.default
git push
て、シャットダウンするためだけに。
実行しているGitのバージョンや、設定したかどうかについては触れていないpush.default
ため、推測する必要があります。私の推測では、あなたはGitバージョン2ポイント何かを使用しており、それをシャットダウンするように設定push.default
しsimple
ていると思います。長くて退屈な歴史があるためpush.default
、正確にどのバージョンのGitを使用しているのか、また何を設定したのかが重要ですが、結局、Gitからさらに別の苦情が寄せられているという事実は、Git が過去の間違いの1つを回避するように構成されています。
アップストリームとは何ですか?
上流は、単に(通常、ローカル)分岐に関連する別の支店名、通常のリモート追跡ブランチです。
すべてのブランチには、1つのアップストリームセットを持つオプションがあります。つまり、すべてのブランチにアップストリームがあるか、アップストリームがないかです。ブランチが複数のアップストリームを持つことはできません。
アップストリームは、有効なブランチである必要がありますが、そうである必要はありません(リモート追跡のようなものか、ローカルのようなものか)。つまり、現在のブランチBにアップストリームUがある場合、動作するはずです。それが機能しない場合、つまりUが存在しないというメッセージが出た場合、ほとんどのGitは、アップストリームがまったく設定されていないかのように動作します。のようないくつかのコマンドは、上流の設定を表示しますが、「なくなった」とマークします。origin/B
master
git rev-parse U
git branch -vv
アップストリームとは何ですか?
あなたがいる場合push.default
に設定されているsimple
かupstream
、上流の設定が行いますgit push
なし追加の引数、ちょうど仕事で使用し、。
それだけです—それだけですgit push
。しかし、これgit push
はかなり重要です。なぜなら、単純なタイプミスが大きな頭痛の種となる場所の1つだからです。
あなたがいる場合push.default
に設定されているnothing
、matching
またはcurrent
、上流を設定すると、すべてのために何もしませんgit push
。
(これはすべて、Gitのバージョンが2.0以上であることを前提としています。)
上流の影響 git fetch
git fetch
追加の引数なしで実行すると、Git は現在のブランチの上流を調べて、どのリモートからフェッチするかを判断します。アップストリームがリモート追跡ブランチの場合、Gitはそのリモートからフェッチします。(アップストリームが設定されていないか、ローカルブランチの場合、Gitはフェッチを試みorigin
ます。)
上流も影響git merge
しgit rebase
ます
実行するgit merge
場合git rebase
、または追加の引数を指定しない場合、Gitは現在のブランチの上流を使用します。したがって、これらの2つのコマンドの使用が短縮されます。
上流の影響 git pull
あなたはいけ2使用git pull
とにかく、しかし、あなたがしなければ、git pull
どのリモートブランチとマージやリベースに続いからフェッチし、ためにどの把握する上流の設定を使用します。つまり、git pull
同じことをやっgit fetch
て、実際に-because 実行します git fetch
-そしてその後、同じことをしgit merge
たりgit rebase
、それ実際にあるため実行 git merge
かgit rebase
。
(通常、少なくとも2つのステップを手動で実行する必要があります。少なくとも、どちらかのステップが失敗した場合にGitが十分に理解できるまでは、いずれかのステップが失敗し、最終的に何が問題だったかを認識し、それに対して何をすべきかを知っています。)
上流の影響 git status
これは実際には最も重要かもしれません。アップストリームセットを取得したら、git status
を取得すると、コミットに関して、現在のブランチとそのアップストリームの違いを報告できます。
通常の場合と同様に、B
アップストリームがに設定されているブランチ上でを実行すると、プッシュできるコミットやマージまたはリベースできるコミットがあるかどうかがすぐにわかります。origin/B
git status
これはgit status
実行するためです:
git rev-list --count @{u}..HEAD
:コミットされB
ていないコミットはいくつありますか?origin/B
git rev-list --count HEAD..@{u}
:コミットされていないコミットはいくつありますか?origin/B
B
アップストリームを設定すると、これらすべてが得られます。
どうしてmaster
既にアップストリームセットが存在するのですか?
いくつかのリモートから最初にクローンを作成するとき、次を使用します:
$ git clone git://some.host/path/to/repo.git
または同様に、Gitが行う最後のステップは、本質的にはgit checkout master
です。お近くの支店アウトこのチェックはmaster
-onlyあなたはしていない持っているローカルブランチをmaster
。
一方、あなたはないリモート追跡ブランチは、名前の持っているorigin/master
あなたはそれをクローン化しているため、。
Gitは、「master
リモートトラッキングと同じコミットを指す新しいローカルを私に作成origin/master
し、その間にアップストリームをmaster
に設定する」ことを意味していたと推測しますorigin/master
。
これは git checkout
まだ持っていないすべてのブランチでします。Gitはブランチを作成し、対応するリモート追跡ブランチを「追跡」(上流として機能)させます。
しかし、これは動作しません 新しいブランチ、つまりまだリモート追跡ブランチがないブランチでは機能しません。
あなたが作成した場合 新しいブランチ:
$ git checkout -b solaris
まだありませんorigin/solaris
。あなたの地元solaris
がorigin/solaris
存在しないため、リモート追跡ブランチを追跡できません。
新しいブランチを最初にプッシュしたとき:
$ git push origin solaris
で作成 solaris
されるorigin
ためorigin/solaris
、独自のGitリポジトリにも作成されます。しかし、それは遅すぎる:あなたはすでにローカル持っているsolaris
ことを何の上流を持っていませんが。3
今のところ、Gitはそれを自動的にアップストリームとして設定すべきではありませんか?
恐らく。「正しく実装されていない」と脚注1を参照してください。今は変更が難しい:数百万です。Gitを使用するスクリプト 4、現在の動作に依存するスクリプトもあります。動作を変更するには、新しいメジャーリリース、いくつかの構成フィールドを設定するように強制するnag-wareなどが必要です。つまり、Gitはそれ自体の成功の犠牲者です。Gitにあるどんな誤りでも、今日、変更がほとんど目に見えないか、明らかにはるかに優れているか、時間の経過とともにゆっくりと行われる場合にのみ修正できます。
実際には、あなたが使用中または中にない限り、それは今日ではありません--set-upstream
-u
git push
。それがメッセージが伝えていることです。
そのようにする必要はありません。さて、前述したように、それを行う必要はまったくありませんが、アップストリームが必要だとしましょう。あなたは既にブランチを作成したsolaris
上でorigin
、以前のプッシュを通じて、そしてあなたのようgit branch
出力を示し、あなたはすでに持っています origin/solaris
あなたのローカルリポジトリに。
あなたはそれを上流として設定していません solaris
。
最初のプッシュ時ではなく、今すぐ設定するには、を使用しますgit branch --set-upstream-to
。--set-upstream-to
サブコマンドは、既存のブランチの名前を取り、などorigin/solaris
、そしてそのほかのブランチに現在のブランチの上流を設定します。
それだけです—それだけです—しかし、上記のすべての影響があります。これは、追加の手間をかけずに、を実行しgit fetch
、次に見回してから、git merge
または必要git rebase
に応じて、新しいコミットを作成して実行できることを意味しますgit push
。
1公平を期すために、当初は初期実装にエラーが発生しやすいことが明確ではありませんでした。それは、すべての新しいユーザーが毎回同じミスを犯したときにのみ明らかになりました。現在は「それほど貧しい」ではなく、「素晴らしい」とは言えません。
2「まったくない」は少し強いですが、Gitの初心者は、特にgit fetch
実際に何をしたかを示し、次に何をするか、git merge
または何をするかgit rebase
を確認できるようにすると、ステップを分けるとかなり理解しやすくなります。
3 最初の git push
ように実行する場合git push -u origin solaris
、つまり-u
フラグを追加するorigin/solaris
場合、プッシュが成功した場合(かつその場合のみ)、Gitは現在のブランチの上流に設定されます。したがって-u
、最初のプッシュで供給する必要があります。実際、後のプッシュでそれを供給することができ、その時点でアップストリームを設定または変更します。でもgit branch --set-upstream-to
、忘れた方が簡単だと思います。
4いずれにしても、オースティン・パワーズ/ドクター・イービルの「1つのMILLLL-YUN」とだけ言う方法で測定。