git push の使用方法

git push <remote> <branch>

付随するすべてのコミットおよび内部オブジェクトと共に指定したブランチを にプッシュするコマンドです。このコマンドを実行すると、プッシュ先のリポジトリにローカルブランチが作成されます。コミットが誤って上書きされるのを防止するために、Git ではプッシュ先リポジトリにおける統合処理が早送りマージ以外である場合にはプッシュが拒否されます。

git push <remote> --force

上のコマンドと同様ですが、早送りマージ以外の場合にも強制的にプッシュが実行されます。プッシュ操作によって何が起こるかを完全に理解している場合以外は --force フラグを使用しないでください。

git push <remote> --all

すべてのローカルブランチを指定したリモートリポジトリにプッシュするコマンドです。

git push <remote> --tags

ブランチをプッシュしたり、--all オプションを指定したりしても、それだけでタグが自動的にプッシュされることはありません。--tags フラグを指定することで、すべてのローカルタグをリモートリポジトリに送ることができます。

git push に関する話

git push は、ローカルの変更を中央リポジトリに公開、アップロードするとき、最もよく使用されるコマンドです。ローカルリポジトリに変更を加えたあと、push コマンドを実行すると、変更をリモートのチームメンバーと共有できます。

git push を使用して変更を公開

上図は、ローカルの master が中央リポジトリの master を追い越して進行し、その状態で git push origin master コマンドを実行して変更を公開すると何が起こるかを示しています。git push がリモートリポジトリ内で git merge master コマンドを実行する場合と本質的に同等であることに留意してください。

git push と同期

ベアリポジトリにプッシュ

強制プッシュ

Git では、プッシュの結果として早送りマージ以外の処理が必要となる場合、中央リポジトリの上書きを防止するためにプッシュリクエストは拒否されます。したがって、リモートリポジトリとローカルリポジトリが分岐状態にある場合は、最初にリモートブランチをプルしてローカルブランチにマージし、その後再度プッシュを試みる必要があります。これは、SVN でチェンジセットをコミットする前のローカルリポジトリをリモートリポジトリに同期する際に svn update コマンドを使用する場合と似ています。

--force フラグを指定すると、この制限が解除され、リモートリポジトリのブランチをローカルリポジトリのブランチに一致させるため、最後にプルした時点以降にリモートリポジトリで変更が発生していた場合はそれらがすべて削除されます。強制プッシュが必要となる唯一のケースは、公開したばかりのコミットに不具合が見つかり、git commit --amend コマンドまたはインタラクティブリベースを使用して、それを修正した場合です。ただしこの場合でも、--force オプションを適用する前に、不具合のあるブランチをプルした開発者は一人もいないと確信できる場合に限り実行します。

デフォルトの git push

次の例は、ローカルな作業成果を中央リポジトリに公開する一般的な方法を示しています。最初に、ローカルの master を間違いなく最新状態にするために、中央リポジトリの master をフェッチし、ローカルな変更をその上にリベースします。ここでコミットを共有する前にインタラクティブリベースを活用してコミットを整理するとよいでしょう。次に git push コマンドを使用してローカルの master 上のコミットをすべて、中央リポジトリに送ります。

git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main

ローカルの master が最新状態になっていることはすでに確認しているため、マージは必然的に早送りマージとなり、git push を実行しても、先に述べた早送りマージ以外の統合処理に起因する問題は発生しません。

修正後の強制 push

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin main

上の例では、コミット履歴を持つ既存のリポジトリでの実行を前提としています。前回のコミットを更新するために、git commit --amend を使用したあと、--force オプションを使用して、修正後のコミットを強制プッシュしています。

リモートブランチまたはタグを削除

会計上または組織の事情により、ブランチのクリーンアップが必要になることがあります。ブランチを完全に削除するには、ローカルとリモートでの削除が必要です。

git branch -D branch_name
git push origin :branch_name

上のコマンドでは "branch_name" というリモートブランチが削除され、前にコロン (:) の付いたブランチ名を git push に渡すことで、このリモートブランチが削除されます。