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 に指定されたリモートトラキングブランチのリポジトリと異なる場合も何もしません。 個人的にはこれが自然かな?という気がします。
  • simple

    • 現在のブランチに upstream が設定されており、upstream のリポジトリが <remote> と一致する場合

      • 現在のブランチと upstram のブランチが同名の場合 push を行います。
      • 名前が異なる場合は何もしません。
    • そうでない場合は current と同じように動作します。
    • デフォルトの割には動作が少し複雑...
  • matching

    • 同じ名前のブランチがリモートリポジトリに存在する 全て のブランチを push します。 現在のブランチとは関係なく、同名のブランチがあればすべて push されてしまいます。 意図していないブランチをうっかり push しかねない、恐ろしいオプションです。 しかも 1.x 系列では何故かこれがデフォルト値になっています。 1.x系を使っている人は失敗する前に今すぐ git config --global push.default simple で設定を変更しておきましょう。

:<dst> が省略された時の挙動

git push に渡す <src>:<dst>:<dst> の部分は省略可能です。 :<dst> を省略した場合には <src>:<src> を指定したのと同じことになります。

<remote> が省略された時の挙動

<remote> が省略された場合の挙動は git push の --repo=<repository> の項目 に書かれています。

  • 現在のブランチ (<src> ではない点に注意!) が トラッキングブランチである場合 (upstream が設定されている場合)、 トラックしているブランチ (== upstream) のリモートリポジトリが <remote> として利用される。
  • そうでない場合は、

    • --repository=<repository> が設定されている場合は、指定された値が利用されます
    • --repository=<repository> がない場合は origin が利用されます。
最終更新: 5/1/2015