git を使っているとよく出てくる
git push origin master
といった
git push origin <リモートBranch名>
の記述。
実はこの記述は省略系だったのをご存知でしょうか。
git push origin <Branch> は省略系
実はgitさんがよしなに足してくれているのです。
git push origin master → git push origin HEAD:refs/heads/master
だいたいはこんな感じにしてくれます。(もしかすると若干違うかも。。)
HEADで今のコミットをした位置を表していているので、リモートにはこの位置でpushしますよ
という意味になっています。
なので、HEADの記載の場所はハッシュ値でもOKです。
何も書かなければ今編集しているであるファイルのHEADの位置を自動でやってくれます。
そして本来リモートにpushする際は
HEAD:refs/heads
を付けなければいけません。
ただgitが賢いので普通に使う際には省略してもよしなにやってくれるみたいです。
gitってすごい!
git push origin <Branch> を使う際のルール
ただ、よしなにやってくれるには、ルールがあります。
ローカルのブランチ名とリモートにpushする際の名前を同じにしなければなりません。
どういうことかというと、
ローカルでのブランチ名前を「aaa」で作業している場合に、リモートブランチ「bbb」にpushはできません。
$ git push origin bbb
リモートに存在しないブランチなので
error: failed to push some refs to ‘https://github.com/~~
と怒られてしまいました。
仮にブランチ「bbb」をリモートで作成して
ローカルブランチ「aaa」からpush( git push origin bbb )してみると
Everything up-to-date
と表示されました。
おそらくローカルブランチ「aaa」からリモートブランチ「aaa」にpushしようとしているのかな?
作業しているローカルブランチは「bbb」なのに。。
別のブランチにpushする
これまでの説明で実は、git push oritin <Branch名>は省略系だということと
ローカルブランチ名と別のリモートブランチ名にはpushができないということがわかりました。
ただ、このできないというのは省略系を使った場合です。
正式のを書いてあげれば、別のリモートブランチへでもpushすることが可能なのです。
ローカルブランチは「aaa」でリモートブランチ「bbb」にpushしてみます。
$ git push origin HEAD:refs/heads/bbb
To https://github.com/~~
* [new branch] HEAD -> bbb
とプッシュが成功して、新しいブランチが作成されました。
ちなみにローカルでのブランチ状態を確認してみると
$ git branch
* aaa
master
「bbb」ブランチがローカルでは作られていません!
リモートブランチのみに「bbb」ブランチが存在している状態になっているのです。
色々と使い道がありそう。。
所感
gitはよしなにやってくれるので
今まではgit push origin <Branch名>が正しい書き方だと思っていたが、
間違えて覚えていたことが分かった。
git の正式な書き方が分かるだけでも、色々と便利そう。
リモートにだけブランチを作ったりできるので、
作業途中のものをpushしないといけない場合にといったときに使えそう。
git 奥深し。
コメント