引数なしのgit 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"モードがデフォルトになるそうです。
今からこの設定にして馴れておくのがよいでしょう。
参考
- "Git Blame: Git 1.8.0-rc1 and 1.7.12.3"
- "見えないチカラ: 【翻訳】あなたの知らないGit Tips"
- "git push の警告 - metalglue"
- "git config -global push.default tracking - まつぼ x Web"
カテゴリ:
Git