git pushの使い方|基本から安全な強制pushまで完全解説

ローカルで作成したコミットをリモートリポジトリに反映したい。チームメンバーと変更を共有したい。そんなときに使うのがgit pushコマンドです。

この記事では、git pushの基本的な使い方から、よくあるエラーの対処法、安全に強制pushする方法まで、実践的なコード例とともに解説します。Git初心者の方も、すでに使っているけれど「なんとなく」で済ませている方も、この機会にgit pushをマスターしましょう。

目次

git pushとは

git pushは、ローカルリポジトリの変更内容をリモートリポジトリにアップロードするコマンドです。git fetchgit 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 pushgit 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 rebasegit 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-branch

Permission 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.com

Everything up-to-date

pushするものがない場合に表示されます。

Everything up-to-date

新しいコミットがない、またはすでにpush済みの状態です。git statusgit logで現在の状態を確認しましょう。

git status
git log --oneline -5

push.default設定でデフォルト動作をカスタマイズ

引数なしでgit pushを実行したときの動作は、push.default設定で変更できます。

# 現在の設定を確認
git config push.default

主な設定値

simple(デフォルト): 現在のブランチを、同名のリモートブランチにpushします。上流ブランチが設定されていない場合はエラーになります。最も安全な設定です。

git config --global push.default simple

current: 現在のブランチを、同名のリモートブランチにpushします。上流ブランチの設定は不要です。

git config --global push.default current

upstream: 現在のブランチを、設定された上流ブランチに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 statusgit logで状況を確認することが大切です。

参考リンク

より詳しく学びたい方は、以下のドキュメントを参照してください。

Git公式ドキュメント – git-pushでは、すべてのオプションと詳細な動作仕様を確認できます。Atlassian Git Tutorialは図解が豊富でわかりやすい解説があります。GitHub Docs – Pushing commitsでは、GitHub固有の機能についても学べます。

さらに深く学びたい方へ

この記事で紹介した技術をマスターするには、体系的な学習が重要です。独学で挫折しそうな方は、現役
エンジニアから直接学べるプログラミングスクールも検討してみてください。

現場で通用するスキルを身につけるなら

DMM WEBCAMPのカリキュラムは、実際の開発現場を想定したチーム開発も経験できます。ポートフォリオ制作
支援もあり、転職活動で差をつけられます。

未経験から4ヶ月でエンジニアとして活躍できるレベルまで成長可能です。

実務レベルのWeb開発スキルを習得するなら

RUNTEQは、1000時間の圧倒的学習量で、現場で即戦力となるWebエンジニアを育成します。Ruby on
Railsに特化し、実際のWebサービス開発を通じて実践力を養います。

卒業生の多くが自社開発企業への転職に成功している実績があります。

じっくり理解を深めたい方へ

この記事で紹介した内容を確実に身につけるには、分からない点をすぐに質問できる環境が重要です。CodeCa
mpなら、現役エンジニアとのマンツーマンレッスンで、あなたのペースで着実にスキルアップできます。

朝7時〜夜23時まで、365日受講可能なので、仕事や学業と両立しながら学習を進められます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次