「u」は正確には何をしているのですか?「git push -u origin master」対「git push origin master」


335

私はそれを理解しようとする私の最善の試みにもかかわらず、私はどうやらgitを使うことにひどいです。

kernel.orgのためにgit push

-u

--set-upstream

最新の、または正常にプッシュされたすべてのブランチについて、引数なしのgit-pull(1)およびその他のコマンドで使用される上流(追跡)参照を追加します。詳細についてはbranch.<name>.merge、git-config(1)を参照してください。

ここbranch.<name>.mergeからgit configです:

branch.<name>.merge

とともにbranch.<name>.remote、指定されたブランチの上流ブランチを定義します。マージするブランチをgit fetch / git pullに指示し、git pushにも影響を与える可能性があります(push.defaultを参照)。ブランチ<name>にあるとき、それはgit fetchにFETCH_HEADでマージするためにマークされるデフォルトのrefspecを伝えます。値はrefspecのリモート部分のように処理され、によって指定されたリモートからフェッチされる参照と一致する必要があります"branch.<name>.remote"。マージ情報は、git pull(最初はgit fetchを呼び出す)によって使用され、マージするデフォルトのブランチを検索します。このオプションがない場合、git pullはデフォルトで、フェッチされた最初のrefspecをマージします。タコのマージを取得するには、複数の値を指定します。<name>ローカルリポジトリの別のブランチからマージされるようにgit pullを設定する場合は、branch.<name>.merge目的のブランチに移動し、特別な設定を使用します。(期間)branch.<name>.remote

私はgithubを使用してリモートリポジトリを正常にセットアップし、最初のコミットをそれに正常にプッシュしました。

git push -u origin master

次に、次のコマンドを使用して、2番目のコミットを無意識のうちにリモートリポジトリにプッシュしました。

git commit -m '[...]'

しかし、originから再びプッシュする必要があると間違って考えてmaster、私は走った:

# note: no -u
git push origin master

それは何をしましたか?まったく効果がないようです。「元に戻しました」git push -u origin master


45
I'm apparently terrible at using git, despite my best attempts to understand it.-誰かが私をそんなに上手に再現してくれたことがありません。
dgo 2016

回答:


336

キーは「引数なしのgit-pull」です。git pullソースのリモートまたはブランチを指定せずにブランチからを実行すると、gitはbranch.<name>.mergeどこからプルするかを知るために設定を調べます。git push -uプッシュするブランチにこの情報を設定します。

違いを見るために、新しい空のブランチを使用しましょう:

$ git checkout -b test

最初に、なしでプッシュし-uます:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

追加した場合-u

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

git pullリモートまたはブランチを指定しなくても期待どおりに機能するように追跡情報が設定されていることに注意してください。

更新:ボーナスのヒント:

  • Markがコメントで述べているように、git pullこの設定に加えて、のデフォルトの動作にも影響しますgit push。を使用-uして、追跡するリモートブランチをキャプチャする習慣がある場合は、push.default設定値をに設定することをお勧めしますupstream
  • git push -u <remote> HEAD現在のブランチを同じ名前のブランチにプッシュします<remote>(また、追跡を設定してgit push、後で実行できるようにします)。

4
git push <remote> <branch>物事を明確にします。リモートまたはブランチをオフにすると、gitはで設定されたブランチ構成設定にフォールバックしますgit push -u
dahlbyk

2
@dahlbyk私は先に進んであなたを答えとしてマークしましたが、そのコメントはやや混乱します。あなたの答えでは、後にgit 混乱したことを示しましたgit push origin test(これにはがありません-u)。次に、あいまいさをgit push -u origin test 取り除くことを示しました。タイプミスはありますか、それとももう一度密集していますか?
ClosureCowboy 2011

1
私たちはお互いを過ぎて話していると思います。:)私git push <remote> <branch>が明確であると言うとき、私はそれgit pushがブランチ構成に依存していることを意味します。同様に、git pull <remote> <branch>明確でありgit pull、ブランチ構成に依存します。あなたがプッシュしたら-u両方、git pushおよびgit pull期待どおりに動作します。
dahlbyk

10
@dahlbyk:あなたの答えは罰金ですが、上記のコメントは、繰り返しに一般的な誤解をについてgit push-あなたが設定されていない限りpush.default、自分自身を、git push唯一のリモートアップデートにないリモートブランチにプッシュするかを決定するために上流分岐の設定を使用しています。
Mark Longair、2011

1
gitのベストプラクティスはgit push origin master、反対側のIEと同じです。git pull origin master..したがって、ブランチが変更された場合git push origin branch_name、反対側のIEでも同じことができます 。git pull origin branch_name
Arpit Vaishnav

87
git push -u origin master

…と同じです:

git push origin master ; git branch --set-upstream master origin/master

忘れた場合は、最後のステートメントを実行してください-u

または、強制することもできます。

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

コマンドに自動的に実行させると、存在しないブランチを入力した場合や、入力しなかった場合のように、間違いを見つけてしまいますgit remote add。それはあなたが望むものかもしれませんが。:)


1
BTW masterは単なる例です:)
サブゲントン

Ok 2番目のビットは新しいバージョンでgit branch master -u origin/master
廃止さ

2
-uオプションの使用を忘れた場合は、git push -uすぐに入力しても問題ありません。
zeekvfu 2014年

1
gitの新しいバージョンは、それが示す--setup-upstream廃止されます: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
ビル・ホグ

--set-上流のは、今では動作しますが、廃止されました:git branch --set-upstream-to=origin/master master
アルベルト・ペレス

43

より簡単な言葉で:

技術的には、この-uフラグは、プッシュ先のアップストリームサーバーに追跡参照を追加します。

ここで重要なのは、これにより、git pull引数を追加することなくを実行できることです。たとえば、一度を実行するとgit push -u origin master、後で呼び出すことができgit pull、gitは実際にを意味したことを認識しますgit pull origin master

それ以外の場合は、コマンド全体を入力する必要があります。


1
したがって、次のプルごとに-uフラグを設定orgin masterすると、それが参照されます。私は変更したい場合やgit pull振る舞いを私が実行しなければならないgit push -u origin some_other_branchし、git pull今を参照してくださいだろうかsome_other_branch?ありがとうございました!
トマトモフ2018

1
「git push origin master」の代わりに「git push」を使用できますか?
cegprakash

はい、@ cegprakashできます。しかし、あなたが最初に行われているだろうgit push -u origin master
AdépòjùOlúwáségun

-11

Githubにプッシュおよびプルするために必要なすべてのgit bashコマンド:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

ファイルを編集したい場合:

edit filename.* 

すべてのブランチとそのコミットを確認するには:

git show-branch

4
質問の範囲外で回答したと思います。
AdépòjùOlúwáségun
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.