リモート Git リポジトリ | git push
git push コマンド
push とは、ブランチをローカルリポジトリからリモートリポジトリへ書き込む操作を意味する。このコマンドは git fetch の反対であり、fetch がブランチをローカルリポジトリへ取り込む操作であるのに対し、push はブランチをリモートリポジトリへ送り出す操作である。このコマンドは変更の誤った上書きを引き起こす可能性があるため、使用時には注意が必要である。
使い方
git push <remote> <branch>
指定したブランチを、関連するすべてのコミットおよび内部オブジェクトとともに <remote> へ push するコマンドである。このコマンドを実行すると、push 先リポジトリにローカルブランチが作成される。変更の誤った上書きを防ぐため、Git は push 先リポジトリで fast-forward 以外の統合処理が必要な場合、push を拒否する。
git push <remote> --force
上のコマンドと似ているが、fast-forward でない場合でも強制的に push を実行する。push 操作によって何が起こるかを完全に理解している場合を除き、--force フラグを使ってはならない。
git push <remote> --all
すべてのローカルブランチを指定したリモートリポジトリへ push するコマンドである。
git push <remote> --tags
ブランチを push するだけでは、--all フラグを指定した場合でもタグは自動的には push されない。--tags フラグを指定すると、すべてのローカルタグをリモートリポジトリへ送信できる。
補足説明
git push の最も一般的な用途は、ローカル変更を中央リポジトリへ公開することである。ローカルで何度かコミットし、それを他の開発者と共有する段階になったら、必要に応じてインタラクティブ rebase で履歴を整理し、中央リポジトリへ push する。
Git チュートリアル: git push
チュートリアル図は、ローカルの master が中央リポジトリの master より進んでいる状態で、git push origin master を実行して変更を公開すると何が起こるかを示している。git push は本質的にはリモートリポジトリで git merge master を実行することと同等である点を覚えておこう。
強制 push
Git は、push の結果として fast-forward 以外の処理が必要になる場合、push 要求を拒否する。したがって、リモートリポジトリとローカルリポジトリが分岐している場合は、まずリモートブランチを取得してローカルブランチへマージし、その後もう一度 push を試す必要がある。これは SVN で変更をコミットする前に svn update でローカルリポジトリをリモートリポジトリと同期することに似ている。
--force フラグを指定するとこの制限が解除され、リモートリポジトリをローカルリポジトリに一致させる。最後に pull した時点以降にリモートリポジトリで変更が発生していた場合、それらはすべて削除される。強制 push が必要になる代表的なケースは、公開したばかりのコミットに欠陥が見つかり、git commit --amend やインタラクティブ rebase で修正した場合である。ただし、この場合でも --force を使う前に、欠陥のあるブランチを pull した開発者が誰もいないことを確認する必要がある。
push 先は bare リポジトリに限定する
push 先は、--bare フラグを指定して作成したリポジトリに限定すべきである。push はリモートリポジトリの構造を変更する操作なので、他の開発者の作業リポジトリへ push してはならない。bare リポジトリは作業ディレクトリを持たないため、他の開発者の作業を妨げることがない。
使用例
次の例は、ローカル作業の成果を中央リポジトリへ公開する一般的な方法を示している。まずローカルの master を確実に最新にするため、中央リポジトリの master を取得し、ローカル変更をその上へ rebase する。コミットを共有する前に、インタラクティブ rebase でコミットを整理するとよい。その後、git push でローカル master のすべてのコミットを中央リポジトリへ送る。
git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master
すでにローカル master が最新であることを確認しているため、統合は fast-forward になり、git push を実行しても前述の fast-forward 以外の統合処理による問題は発生しない。