1. ホーム
  2. git

[解決済み] この "u "は具体的に何をするのですか?"git push -u origin master" と "git push origin master" の違い。

2022-03-24 11:05:25

質問

gitを理解しようと頑張っているのですが、どうやら苦手意識があるようです。

から kernel.org について git push :

-u

-設定-アップストリーム

最新の状態にある、あるいはプッシュが成功したすべてのブランチに対して、引数なしの 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> これは、FETCH_HEAD でマージするためにマークされるデフォルトの refspec を git fetch に伝えるものです。この値は refspec のリモート部分と同様に扱われ、次のように指定したリモートから取得した ref と一致する必要があります。 "branch.<name>.remote" . このマージ情報は、git pull (これは最初に git fetch を呼び出します) がマージ用のデフォルトブランチを探すために使用されます。このオプションを指定しなかった場合、git pull はデフォルトで最初に取得した refspec をマージします。複数の値を指定すると、蛸壺マージになります。にマージするように git pull を設定したい場合は、次のようにします。 <name> をローカルリポジトリの別のブランチから指定することができます。 branch.<name>.merge を目的のブランチに設定し、特別な設定 . (ピリオド) を使って branch.<name>.remote .

githubでリモートリポジトリのセットアップに成功し、最初のコミットをpushすることに成功しました。

git push -u origin master

そして、知らず知らずのうちに、2回目のコミットをリモートリポジトリにプッシュすることに成功しました。

git commit -m '[...]'

しかし、誤って、もう一度 origin から master を、走らせました。

# note: no -u
git push origin master

どうだった?全く効果がなかったようです。元に戻せますか? git push -u origin master ?

解決方法は?

鍵は "引数なしの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 は、リモートやブランチを指定しなくても期待通りに動作します。

更新しました。 ボーナスのヒント

  • マークがコメントで触れているように、さらに git pull のデフォルトの動作にも影響します。 git push . を使う癖がついたら -u を使用して、追跡するリモートブランチをキャプチャすることをお勧めします。 push.default の設定値を upstream .
  • git push -u <remote> HEAD にある同名のブランチに現在のブランチをプッシュします。 <remote> (また、トラッキングを設定することで git push の後に)。