Git のプッシュ
git push
コマンドは、ローカル・リポジトリ・コンテンツをリモート・リポジトリにアップロードするために使用されます。プッシュは、コミットをローカル・リポジトリからリモート・リポジトリに送る操作です。git fetch と対をなして、フェッチはコミットをローカル・ブランチにインポートするのに対し、プッシュはコミットをリモート・ブランチにエクスポートします。リモート・ブランチは、git remote コマンドを使用して設定されます。プッシュすると変更を上書きする可能性があります。プッシュするときは注意が必要です。これらの課題については、以下で説明します。
git push の使用方法
git push <remote> <branch>
付随するすべてのコミットおよび内部オブジェクトと共に、指定したブランチをプッシュするコマンドです。このコマンドを実行すると、プッシュ先のリポジトリにローカル・ブランチが作成されます。コミットが誤って上書きされるのを防止するために、Git ではプッシュ先リポジトリにおける統合処理が早送りマージ以外である場合にはプッシュが拒否されます。
git push <remote> --force
上のコマンドと同様ですが、早送りマージ以外の場合にも強制的にプッシュが実行されます。プッシュ操作によって何が起こるかを完全に理解している場合以外は --force
フラグを使用しないでください。
すべてのローカルブランチを指定したリモートリポジトリにプッシュするコマンドです。
git push <remote> --tags
関連資料
高度な Git ログ
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
ブランチをプッシュしたり、--all
オプションを指定したりしても、それだけでタグが自動的にプッシュされることはありません。--tags
フラグを指定することで、すべてのローカル タグをリモート リポジトリに送れます。
git push に関する話
git push
は、アップロード ローカルの変更を中央リポジトリに公開するために最も一般的に使用されます。ローカル リポジトリに変更を加えたあと、push コマンドを実行すると、変更をリモートのチーム メンバーと共有できます。
上図は、ローカルの main
が中央リポジトリの main
を追い越して進行し、その状態で git push origin main
コマンドを実行して変更を公開すると何が起こるかを示しています。git push
がリモート リポジトリ内で git merge main
コマンドを実行する場合と本質的に同等であることに留意してください。
git push と同期
git push
は、Git の「同期」プロセス全体で使用する多くのコンポーネントの 1 つです。同期コマンドは、git remote コマンドを使用して設定されたリモート・ブランチで動作します。git push
は「アップロード」コマンドで、git fetch と git pull は「ダウンロード」コマンドと考えられます。ダウンロードやアップロードでチェンジセットを移動すると、移動先で git merge を実行して変更を統合できます。
ベアリポジトリにプッシュ
よくある最新の Git の使用事例に、リモートでホスティングしている --bare
リポジトリを中央の origin リポジトリとして機能させる方法があります。この origin リポジトリは、Bitbucket などの信頼されたサード・パーティを使用して、オフサイトでホスティングされることがよくあります。プッシュはリモート・リポジトリのブランチ構造を変更する操作であるため、--bare
フラグを指定して作成したリポジトリにプッシュする方法が、最も安全性が高く一般的です。ベア・リポジトリは作業ディレクトリを持たないため、プッシュしても、作業中のディレクトリのコンテンツは一切変更されません。ベア・リポジトリの作成については、git init のチュートリアルを参照してください。
強制プッシュ
Git では、プッシュの結果として早送りマージ以外の処理が必要となる場合、中央リポジトリの上書きを防止するためにプッシュ リクエストは拒否されます。したがって、リモート履歴がローカル履歴から分岐している場合は、最初にリモート ブランチをプルしてローカル ブランチにマージし、その後再度プッシュを試みる必要があります。これは、SVN でチェンジセットをコミットする前の中央リポジトリと同期する際に svn update
コマンドを使用する場合と似ています。
--force
フラグを指定すると、この制限が解除され、リモート リポジトリのブランチをローカル リポジトリのブランチに一致させるため、最後にプルした時点以降に上流の変更が発生していた場合はそれらがすべて削除されます。強制プッシュが必要となる唯一のケースは、公開したばかりのコミットに不具合が見つかり、git commit --amend
コマンドまたはインタラクティブ リベースを使用して、それを修正した場合です。ただしこの場合でも、--force
オプションを適用する前に、不具合のあるブランチをプルした開発者は一人もいないと確信できる場合に限り実行します。
例
デフォルトの git push
次の例は、ローカルな作業成果を中央リポジトリに公開する一般的な方法を示します。最初に、ローカルの main を確実に最新のものにするために、中央リポジトリの main をフェッチし、ローカルな変更をその上にリベースします。ここでコミットを共有する前にインタラクティブ リベースを活用してコミットを整理するとよいでしょう。次に、git push
コマンドを使用してローカルの main 上のすべてのコミットを中央リポジトリに送ります。
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
ローカルの main が最新状態になっていることはすでに確認しているため、マージは必然的に早送りマージとなり、git push
を実行しても、先に述べた早送りマージ以外の統合処理に起因する問題は発生しません。
修正後の強制 push
git commit コマンドでは、前回のコミットをアップデートする --amend
オプションを指定できます。コミット・メッセージや新しい変更のアップデート時に、コミットを修正することはよくあります。コミットを修正すると、修正後のコミットとリモート・コミットが Git によってコンテンツの食い違いとして認識されるため、git push
が失敗します。修正されたコミットをプッシュするには、--force
オプションを使用する必要があります。
# 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
に渡すことで、このリモート ブランチが削除されます。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。