Git 再入門: 引数がない場合の git push のデフォルトの挙動(push.default の設定について)
前述したように、git push <remote> <src>:<dst>
を実行するとローカルブランチ <src>
を リモートリポジトリ <remote>
に対して書き込み、<remote>
上のブランチ <dst>
を pushされた <src>
を指すように first-forward します。
git pull
と同様に git push
の引数も省略することができます。
git push
で引数を省略した場合のルールは git pull
で引数を省略した場合のそれより複雑です。
<src>:<dst> が省略された時の挙動
<src>:<dst>
が省略された場合の挙動は、push.default の設定値によって以下のように決まります。
1.x系列では matching
がデフォルト値ですが、mathing
だと現在のブランチ以外も push してしまい危険なのでsimple
などに変更しておくことが推奨されます。
2.x系からはデフォルト値は simple
に変更されています。
git config --global push.default simple
5つの値について簡単に説明しておきます。 (アップストリーム、トラッキングブランチが何だか分からない場合はこちらを参照して下さい)
-
nothing
<src>:<dst>
が省略された場合git push
は何もしません。一番安全ですし、これに設定するのも悪く無いかと思います。
-
current
- 現在のブランチ
<current>
を同名のブランチとして push します。<current>:<current>
を指定したことになります。
- 現在のブランチ
-
upstream
- 現在のブランチをその upstream に対して push します。
現在のブランチに upstream がない場合は何もしません。 また
<remote>
が upstream に指定されたリモートトラキングブランチのリポジトリと異なる場合も何もしません。 個人的にはこれが自然かな?という気がします。
- 現在のブランチをその upstream に対して push します。
現在のブランチに upstream がない場合は何もしません。 また
-
simple
-
現在のブランチに upstream が設定されており、upstream のリポジトリが
<remote>
と一致する場合- 現在のブランチと upstram のブランチが同名の場合 push を行います。
- 名前が異なる場合は何もしません。
- そうでない場合は
current
と同じように動作します。 - デフォルトの割には動作が少し複雑...
-
-
matching
- 同じ名前のブランチがリモートリポジトリに存在する 全て
のブランチを push します。
現在のブランチとは関係なく、同名のブランチがあればすべて push
されてしまいます。 意図していないブランチをうっかり push
しかねない、恐ろしいオプションです。 しかも 1.x
系列では何故かこれがデフォルト値になっています。
1.x系を使っている人は失敗する前に今すぐ
git config --global push.default simple
で設定を変更しておきましょう。
- 同じ名前のブランチがリモートリポジトリに存在する 全て
のブランチを push します。
現在のブランチとは関係なく、同名のブランチがあればすべて push
されてしまいます。 意図していないブランチをうっかり push
しかねない、恐ろしいオプションです。 しかも 1.x
系列では何故かこれがデフォルト値になっています。
1.x系を使っている人は失敗する前に今すぐ
:<dst> が省略された時の挙動
git push
に渡す <src>:<dst>
の :<dst>
の部分は省略可能です。
:<dst>
を省略した場合には <src>:<src>
を指定したのと同じことになります。
<remote> が省略された時の挙動
<remote>
が省略された場合の挙動は
git push の --repo=<repository> の項目
に書かれています。
- 現在のブランチ (
<src>
ではない点に注意!) が トラッキングブランチである場合 (upstream が設定されている場合)、 トラックしているブランチ (== upstream) のリモートリポジトリが<remote>
として利用される。 -
そうでない場合は、
--repository=<repository>
が設定されている場合は、指定された値が利用されます--repository=<repository>
がない場合はorigin
が利用されます。