ローカルで作成したコミットをリモートリポジトリに反映したい。チームメンバーと変更を共有したい。そんなときに使うのがgit pushコマンドです。
この記事では、git pushの基本的な使い方から、よくあるエラーの対処法、安全に強制pushする方法まで、実践的なコード例とともに解説します。Git初心者の方も、すでに使っているけれど「なんとなく」で済ませている方も、この機会にgit pushをマスターしましょう。
git pushとは
git pushは、ローカルリポジトリの変更内容をリモートリポジトリにアップロードするコマンドです。git fetchやgit pullがリモートからローカルへの同期であるのに対し、git pushはローカルからリモートへの同期を担当します。
チーム開発では、自分の作業をメンバーに共有するために必ず使うコマンドです。個人開発でも、GitHubやGitLabにコードをバックアップしたり、CI/CDパイプラインを動かしたりするために欠かせません。
基本的な使い方
git push origin mainを理解する
最も基本的なgit pushコマンドは以下の形式です。
git push origin mainこのコマンドは「originというリモートリポジトリに、mainブランチをpushする」という意味になります。originはリモートリポジトリの名前(エイリアス)で、git cloneしたときに自動的に設定されます。
基本的なワークフロー
実際の開発では、以下のような流れでgit pushを使います。
# ファイルを編集した後
git add .
git commit -m "feat: ユーザー認証機能を追加"
git push origin mainコミットを作成してからpushするという順序が重要です。git pushはコミット済みの変更のみをリモートに送信します。
よく使うオプション
-u(–set-upstream):上流ブランチを設定する
新しいブランチを初めてpushするときは、-uオプションを使うと便利です。
git push -u origin feature-loginこのオプションを付けると、ローカルブランチとリモートブランチの紐付け(トラッキング)が設定されます。一度設定すれば、以降は引数なしでgit pushやgit pullを実行できるようになります。
# -u設定後は引数なしでOK
git push
git pull
–delete:リモートブランチを削除する
マージ済みのフィーチャーブランチなど、不要になったリモートブランチは--deleteオプションで削除できます。
git push origin --delete feature-oldコロン記法でも同じことができます。
git push origin :feature-old–tags:タグをpushする
通常のpushではタグは送信されません。タグをリモートに反映するには--tagsオプションを使います。
git push origin --tags特定のタグだけをpushしたい場合は、タグ名を直接指定します。
git push origin v1.0.0–dry-run:実行前に確認する
何がpushされるか事前に確認したいときは、--dry-runオプションが役立ちます。
git push --dry-run origin main実際にはデータを送信せず、実行した場合の結果だけを表示します。大きな変更をpushする前の確認に便利です。
強制pushの正しい使い方
なぜ強制pushが必要になるのか
git rebaseやgit commit --amendでコミット履歴を書き換えた場合、通常のpushは拒否されます。これはGitが履歴の整合性を保護しているためです。
# rebase後にpushしようとすると...
git push origin main
# ! [rejected] main -> main (non-fast-forward)このようなケースで強制pushが必要になります。
–force(非推奨)
--forceオプションを使うと、リモートの状態を無視して強制的にpushできます。
# 危険:他の開発者の変更を上書きする可能性あり
git push --force origin mainただし、このオプションはチーム開発では危険です。他のメンバーがpushした変更を知らずに上書きしてしまう可能性があるからです。
–force-with-lease(推奨)
より安全な強制pushには--force-with-leaseを使います。
git push --force-with-lease origin mainこのオプションは、リモートブランチが自分の想定通りの状態である場合にのみ強制pushを実行します。他の開発者が変更をpushしていた場合は失敗するため、意図しない上書きを防げます。
さらに安全性を高めたい場合は、--force-if-includesを組み合わせます。
git push --force-with-lease --force-if-includes origin mainバックグラウンドでgit fetchが実行されていた場合でも、適切に検出してくれます。
よくあるエラーと対処法
non-fast-forwardエラー
最も遭遇しやすいエラーがこれです。
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'origin'このエラーは、リモートに自分が持っていないコミットが存在することを示しています。他の開発者がすでにpushしている状態です。
対処法1: pullしてからpushする(推奨)
git pull origin main
# 必要に応じてコンフリクトを解決
git push origin main対処法2: rebaseしてからpushする
履歴をきれいに保ちたい場合は、rebaseを使います。
git pull --rebase origin main
# 必要に応じてコンフリクトを解決
git push origin main対処法3: 強制pushする(注意が必要)
自分だけが使っているブランチで、履歴を書き換えた場合に限り、強制pushを使います。
git push --force-with-lease origin feature-branchPermission denied (publickey)
SSH認証に問題がある場合に発生します。
Permission denied (publickey).
fatal: Could not read from remote repository.SSH鍵が正しく設定されているか確認しましょう。GitHubの場合は、Settings → SSH and GPG keysで公開鍵が登録されているか確認してください。
# SSH接続のテスト
ssh -T git@github.comEverything up-to-date
pushするものがない場合に表示されます。
Everything up-to-date新しいコミットがない、またはすでにpush済みの状態です。git statusやgit logで現在の状態を確認しましょう。
git status
git log --oneline -5push.default設定でデフォルト動作をカスタマイズ
引数なしでgit pushを実行したときの動作は、push.default設定で変更できます。
# 現在の設定を確認
git config push.default主な設定値
simple(デフォルト): 現在のブランチを、同名のリモートブランチにpushします。上流ブランチが設定されていない場合はエラーになります。最も安全な設定です。
git config --global push.default simplecurrent: 現在のブランチを、同名のリモートブランチにpushします。上流ブランチの設定は不要です。
git config --global push.default currentupstream: 現在のブランチを、設定された上流ブランチにpushします。ブランチ名が異なっていても動作します。
git config --global push.default upstream自動で上流ブランチを設定する
Git 2.37以降では、push.autoSetupRemoteを設定すると、新しいブランチのpush時に自動で上流ブランチが設定されます。
git config --global push.autoSetupRemote trueこの設定をしておくと、-uオプションを毎回付ける必要がなくなります。
Refspec:高度なpush操作
基本的なRefspec
Refspec(参照仕様)を使うと、より細かいpush操作が可能になります。基本形式は<src>:<dst>です。
# ローカルのmainをリモートのmainにpush(通常のpushと同じ)
git push origin main:main
# ローカルのdevelopをリモートのmainにpush
git push origin develop:main
# HEADをリモートのmainにpush
git push origin HEAD:mainリモートブランチ名を変えてpush
ローカルとリモートで異なるブランチ名を使いたい場合に便利です。
# ローカルのfeature-xをリモートのfeature/xとしてpush
git push origin feature-x:feature/x複数のブランチを一度にpush
git push origin main develop feature-branchすべてのブランチをpushしたい場合は--allオプションを使います。
git push origin --allベストプラクティス
push前にやるべきこと
pushする前に、最新の変更を取り込んでおくとコンフリクトを減らせます。
git fetch origin
git status何をpushするか確認してから実行する習慣をつけましょう。
git log origin/main..HEAD --oneline安全なpushのための心がけ
共有ブランチ(mainやdevelop)への直接pushは避け、フィーチャーブランチで作業してプルリクエストを作成するフローがおすすめです。GitHubやGitLabでブランチ保護ルールを設定しておくと、誤った操作を防げます。
強制pushが必要な場合は、必ず--force-with-leaseを使いましょう。チームで作業している場合は、強制pushする前にメンバーに一声かけるとトラブルを防げます。
コミットの整理
pushする前に、WIP(Work In Progress)コミットは整理しておくときれいな履歴を保てます。
# 直前の3コミットをまとめる
git rebase -i HEAD~3ただし、すでにpush済みのコミットを書き換える場合は強制pushが必要になるため、注意が必要です。
よくある質問
git pushとgit push originの違いは?
git pushは上流ブランチが設定されている場合にのみ動作します。git push origin mainのように明示的に指定すると、上流ブランチの設定に関係なく動作します。初めてのpushや上流が未設定の場合は、明示的な指定が必要です。
pushを取り消すには?
すでにpushしてしまったコミットを取り消すには、git revertで打ち消しコミットを作成するか、git resetで履歴を巻き戻して強制pushする方法があります。チーム開発ではgit revertが安全です。
# 打ち消しコミットを作成(安全)
git revert HEAD
git push origin main
# 履歴を巻き戻す(注意が必要)
git reset --hard HEAD~1
git push --force-with-lease origin main特定のコミットだけをpushできる?
直接的にはできませんが、ブランチを作成してcherry-pickする方法があります。
git checkout -b hotfix main
git cherry-pick <commit-hash>
git push origin hotfixまとめ
git pushはシンプルなコマンドですが、オプションや設定を理解することで、より安全で効率的なGit運用ができるようになります。
最初はgit push origin mainの基本形を覚え、慣れてきたら-uオプションやpush.autoSetupRemote設定で効率化していきましょう。強制pushが必要な場面では、必ず--force-with-leaseを使うことを習慣にしてください。
エラーが発生しても焦らず、まずはgit statusやgit logで状況を確認することが大切です。
参考リンク
より詳しく学びたい方は、以下のドキュメントを参照してください。
Git公式ドキュメント – git-pushでは、すべてのオプションと詳細な動作仕様を確認できます。Atlassian Git Tutorialは図解が豊富でわかりやすい解説があります。GitHub Docs – Pushing commitsでは、GitHub固有の機能についても学べます。



