warning: push.default is unsetが出る件について

Hokkaido.pm Casual#12でGit(version 1.8.1)を使ったデモをした時に、
git pushで警告が出たので、自分に宿題を出して調べてみました。

警告の内容ですが、要約するとこんな感じ。
どこにプッシュするかのデフォルト値がGit 2.0で”matching”から”simple”になるから、
“git help config”して、”push.default”を検索して、
“push.default”に値を設定しちゃいなYO!
(*1)

という訳なので、まず復習から。
入門Git(Amazon)の「リモートリポジトリのプッシュ定義」より、

$ git clone ../../Repo/Hello

のように、URLを指定してcloneした場合は、
どこにプッシュすべきかはclone元でいいよねってことで、
何か変更して、コミットして、プッシュするとclone元に反映される訳ですが、
その際のコマンドはこんな感じ。

$ git push origin master:master

でも、この前提として、
cloneするとclone元がoriginと名付けられて、
デフォルトのブランチ名がmasterで、
リモートのmasterをローカルに持ってきたので、
ローカルもmasterっていうブランチがあって、
なので、上記のコマンドでプッシュ出来るわけですね。

$ git push <remote name> <local branch>:<remote branch>

ローカルとリモートのブランチ名が一緒なので、

$ git push origin master

でもよくて、clone元も分かってるので、

$ git push

で良いわけですが、
このようにいろいろ省略した時に、
どういう挙動させるかの設定が”push.default”なわけですね。

結論は、警告と一緒に出ていて、

今まで通りが良いなら、
git config –global push.default matching

って書いてあるので、この通り実行すれば、
ローカルとリモートで両方に同じブランチ名があるものがプッシュされます。(*2)

ですが、ここからが重要です。
もし、masterで作業してコミットのみ行った状態で、
違うブランチに切り替えて、git pushするとします。
そして、”push.default”の値が”matching”の場合は、
masterではないブランチで作業しているにも関わらず、
ローカルとリモートで共通に存在するブランチ、
すなわちmasterがプッシュされるわけです。
(*3)
これを防ぐために、Git 2.0からデフォルトの動作をsimpleにするわけですね。

というわけで、オススメはこちら。

$ git config --global push.default simple

試しに、masterじゃないブランチ上で、git pushするとプッシュに失敗して、
引数にリモート名とブランチ名を設定するとプッシュ出来ました。
ちなみに、masterをチェックアウトしてからだとgit pushは成功します。

おしまい。

(*1) 間違ってそう・・・。
(*2) 自分の解釈で書いたけど合ってるかな?
(*3) もちろん、master以外も対象です

参考にさせて貰ったページ
引数なしのgit pushは危険なので気をつけましょう – DQNEO起業日記

Leave a Comment