引数なしのgit pushは危険なので気をつけましょう

引数なしで"git push"すると、何がpushされるかご存知でしょうか?

デフォルトでは、ローカルブランチと同名のブランチがリモート上にあるならそれらを一気にpushしてしまいます。
カレントブランチが何であろうと関係ないのです。

これを人よんで絨毯爆撃pushといいます。(←いま思いついた)

絨毯爆撃pushの例

いまmasterブランチに、未プッシュのコミットがあるとします。

ここで、新たにbr1ブランチを作ってチェックアウトします。
$ git checkout -b br1 master
$ git branch
   * br1
     master
br1ブランチでコミットを作ります。
echo hello >> hello.txt
git add .
git ci   -m "add file"
引数なしでプッシュします。
git push
すると、どこに何がpushされると思いますか?

実は、master -> masterにpushされます。
masterがまだpushできる状態でない場合、これはかなり痛い。すごく痛い。頭が頭痛でおなかが腹痛。

しかもpushしたかった当のbr1ブランチはpushされないというオチ。(リモートにbr1ブランチがない限りは)

この挙動は大半のユーザの期待とは異なるのではないでしょうか。

対処法

その1:ブランチ名を明示的に指定する
git push origin br1
これならpushの標的狙い撃ちなので、期待を裏切られる心配はありません。
デメリットはタイプ数が多いことです。(リモート名もタイプしないといけない)
その2:デフォルトの挙動を"upstreamモード"に変更する
git config --global push.default upstream
git push
こうすれば、カレントブランチとリモートブランチの間に「追跡関係」がある場合のみ、カレントブランチのpushが行われます。
その3:デフォルトの挙動を"currentモード"に変更する
git config --global push.default current
git push
こうすればカレントブランチのpushのみが行われます。
その4:デフォルトの挙動を"simpleモード"に変更する(ただしGit1.7.11以降のみ)
git config --global push.default simple
git push
simpleモードとは、「カレントブランチと同名のリモートブランチが存在する場合のみ、カレントブランチのpushが行われる」モードだそうです。
`simple` - like `upstream`, but refuses to push if the upstream branch's name is different from the local one. This is the safest option and is well-suited for beginners. It will become the default in Git 2.0. https://github.com/git/git/blob/master/Documentation/config.txt

公式アナウンスによれば、Git次期バーション(おそらく2.0)あたりからこの"simple"モードがデフォルトになるそうです。
今からこの設定にして馴れておくのがよいでしょう。

参考

カテゴリ:

人気記事