開発ブログ
Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

git push の基本動作と主要オプションまとめ

最終更新:2018-04-18 by Joe

Git を使った開発で最もよく利用するオプションの一つ「git push」。基本動作のおさらいと、よく利用するオプションをまとめました。

git push の概要

git push はリモートレポジトリを更新するGitコマンドです。ローカルで開発を行って作成されたコミット履歴と関連連する参照(e.g ブランチ名)を任意のリモートに送信することで、そのリモートの履歴を更新できます。

それでは、コマンドの具体例を見ていきます。

指定したブランチを、同名のリモートブランチに push する

こちらは、最も典型的な git push の利用例です。

// origin の master を更新する
git push origin master

下記のようなイメージで、指定したローカルブランチ(master)の履歴を、リモートにある同名のブランチ(master)に送信します。

git push のイメージ図

基本的には「ローカルにあって、リモートに存在しない履歴」を送信してやるイメージです。(そうでない場合はエラーになります)

ローカル、リモートブランチをそれぞれ指定して push する

「git push <リモート> <ブランチ名>」は、通常は第二パラメータで指定したブランチと同じ名前のリモートを更新しますが、「:(コロン)」を用いれば、push 先となるリモートブランチを明示的に指定する事もできます。

// ローカルのmasterブランチを、リモートのmasterブランチにpush 
git push origin master:master

Git では、push先が指定されなかった場合、実際はconfigの設定値「remote.<リモート名>.push」の設定値を参照する仕様です(が、この設定値が書き込まれているケースは稀でしょう。)

さらに、「remote.<リモート名>.push」の設定値が見つからなければ、その次に「push.default」の設定値を参照しますが、その値も見つからない場合は、最終的に現在のブランチを、同名の上流ブランチに push する事になります。(これは、push.default の値が「simple」に設定されているときと同じ動作です)

設定値の詳細は Git ドキュメントをご覧下さい。

git push でのコロンの使い方?

git push では、「:(コロン)」を使った表現は、リモートブランチの削除コマンドとしても利用できます。

// リモートブランチ「tmp」を削除
git push origin :tmp

コロンの前にブランチ名が指定されていませんが、これは「空」を意味します。「空をリモートに送信する」すなわた、指定したリモートブランチを消去するという意味になります。ブランチの削除に関しては、後述の「--delete」オプションもありますので、どちらを使っても構いません。

「上流ブランチ」に push する

上述の git push はパラメータを省略することができます。

// リモートとブランチ名を省略してpush
git push

上記のように省略された場合、まず、リモートレポジトリは、現在のブランチに関する設定値である「branch.<ブランチ名>.remote」が参照され、もし設定値がない場合は、デフォルトで「origin」がPush先のレポジトリになります。)またブランチは、ブランチに関する別の設定値「branch.<ブランチ名>.merge」の値が参照され、そこが push 先になります。

なお上記の2つの値で設定されたリモートレポジトリにあるブランチは、そのブランチの「上流ブランチ」と呼ばれます。上流ブランチは下記ような方法で設定できます:

  1. git push に「-u / --set-upstream」オプションを付けて push を完了する
  2. git branch <ブランチ名> --set-upstream-to=<ブランチ名> / -u=<ブランチ名>」 を実行する
  3. git branch --track <ブランチ> <ブランチ>コマンドを実行する

もし上記のそれぞれの値が設定されていれば、例えば、.git/gitcofig に下記のように書き込まれているはずです。

上流ブランチの設定値。push 先は自動的にここになる。
ローカルmasterブランチの上流ブランチが「originのmasterブランチ」に設定されている

上流ブランチに関して、より詳しくは、こちらをご一読下さい。

上流ブランチの確認方法

上流ブランチ設定状況は「git branch -vv」で確認できます。「[ ](角括弧)」でかこまれた値が、上流ブランチです。

$ git branch --vv
  master  b104f69 [origin/master] Add the search filter.
* prod    a03b925 [origin/prod] 

フックの利用

git push の実行時に特定の動作を関連付けることができます。

git push の主要なオプション

git push を強制する「--force, -f」

git push は「-f」オプションで強制できます。

// git pushを強制するオプション (2つは同義)
git push -f origin master
git push --force origin master

上流ブランチを設定する「-u , --set-upstream」

下記のpushコマンドに「-u」オプションをつければ、同名の上流ブランチを設定できます。上述の通り、git push が成功すれば、その後はパラメータを省略して push できるようになりますので、設定しておきましょう。

git push -u origin master
git push --set-upstream origin master

指定したブランチを削除する「--delete」

--delete オプションで、指定したリモートブランチを削除することができます。

// origin の cool-feature ブランチを削除
git push origin --delete cool-feature

すべてのブランチを push する「--all」

--all でローカルのすべてのブランチを push します。この場合、ブランチ名は指定することができません。この場合 config の push.default の設定値があれば、それに応じて振る舞いが変わります。

// すべてのローカルブランチをorigin に Push
git push --all origin

リモートに存在しないブランチを削除する「--prune」

ローカルに存在するが、リモートに存在しないブランチを削除します。

// すべてのローカルブランチをorigin に Push
git push --prune origin

すべてのタグを push する「--tag」

すべてのタグをpushします。

// すべてのローカルブランチをorigin に Push
git push --tags origin
git push を強制する時の注意

通常、チームで開発していると、みんなが参照するブランチ(例えばmasterブランチ)があるはずです。

あなたの都合でmasterを勝手に強制上書きすると、他のメンバーの人がfetchしてローカルに落としたmasterの履歴と、リモートにあるmasterの履歴が異なってしまいます。それを、あなたの先輩が気づかずに、古いmasterに徹夜して重要な修正をたくさん追加して、ローカルで入念にテストして、朝方くたくたになって、Pushすると・・・、コンフリクトがででています・・。あなたが勝手に歴史を書き換えたからです。先輩は、存在しない歴史(=消された古いコミット)の上に自分の変更をたくさん積み重ねてしまったため、リベースが大変です。あなたは、次の日、説教部屋に呼び出されてしまいました。。

さて、今回は、先輩とあなたの間だけの話でしたが、チームの規模が大きくなればなるほど、このような事件に巻き込まれれる人や、被害が増えてしまいます。

git push -f は、通常のチームでの共有しているブランチ行う時は、注意が必要です。

もし共有されているブランチの修正の必要が生じたら、できるだけ歴史を書き換えることなく、その修正を「新しいコミット」にして、追加Pushして下さい。そうすれば、チームメンバーが、その修正コミットだけを後からマージし易いはずです。

git push に関する参考情報

Git Documentサイトです。

閉じる