Close

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 ロゴ
ソリューションを見る

Bitbucket Cloud での Git の使用方法についてのチュートリアルです。

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

git push に関する話


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

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

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

git push と同期


git push は、Git の「同期」プロセス全体で使用する多くのコンポーネントの 1 つです。同期コマンドは、git remote コマンドを使用して設定されたリモート・ブランチで動作します。git push は「アップロード」コマンドで、git fetchgit 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 についての継続的な更新をご覧ください。

一面のツールを使ってコラボレーションしている人たち

Bitbucket ブログ

DevOps のイラスト

DevOps ラーニング パス

Demo Den アトラシアン・エキスパートによる機能デモ

Bitbucket Cloud が、Atlassian Open DevOps とどのように連携するか

DevOps ニュースレター購読

Thank you for signing up