タイトル: リポジトリへのプッシュ
SEOタイトル: Git push 完全ガイド (リモート同期)
| この記事の要点 |
|
基本: git push
ローカルブランチのコミットをリモートリポジトリに送るコマンド。チーム共有の起点になる操作です。
# リモート origin の main ブランチへ
git push origin main
# 現在のブランチを同名でリモートへ
git push origin HEAD
# 短縮形(追跡設定済なら)
git push
初回 push と追跡設定(-u)
新しいローカルブランチを初めてリモートに push するときは -u (--set-upstream) で追跡関係を作ります。以降は git push / git pull だけで動きます。
# 新ブランチ作成
git checkout -b feature/login
# 初回 push(-u で追跡設定)
git push -u origin feature/login
# 以降は省略可
git push
git pull
# 追跡設定だけ後付け
git branch --set-upstream-to=origin/feature/login
# 現在の追跡先確認
git branch -vv
主なオプション
| オプション | 動作 |
|---|---|
-u / --set-upstream | 追跡先設定(初回 push 用) |
--all | 全ローカルブランチを push |
--tags | タグも一緒に push |
--follow-tags | 注釈付きタグ(annotated)のみ push |
--delete branchname | リモートブランチ削除 |
--force / -f | 強制 push(危険) |
--force-with-lease | 安全な強制 push(推奨) |
-n / --dry-run | 実際には push せず動作確認 |
-v / --verbose | 詳細表示 |
タグの push
# タグ作成
git tag v1.0.0
git tag -a v1.0.0 -m "Release 1.0.0" # 注釈付き(推奨)
# タグだけ push(デフォルトの push にタグは含まれない)
git push origin v1.0.0
git push origin --tags # 全タグ
git push --follow-tags # 注釈付きタグのみ
# リモートタグ削除
git push origin --delete v1.0.0
git push origin :refs/tags/v1.0.0 # 旧書き方
リモートブランチの削除
# 推奨
git push origin --delete feature/login
# 旧書き方(同じ意味)
git push origin :feature/login
# ローカルも消す
git branch -d feature/login
force-with-lease: 安全な強制 push
rebase したブランチを push する際、リモートに自分が知らないコミットが来ていたら誰かの作業を消す事故になります。--force-with-lease はそれを防ぎます。
# ❌ 危険: 他人の commit を含めて全部上書き
git push --force origin main
# ✅ 安全: ローカルが知っているリモート状態と一致しなければ拒否
git push --force-with-lease origin feature/login
# Git 2.30+ では更に安全な --force-if-includes も併用可
git push --force-with-lease --force-if-includes origin feature/login
共有ブランチ(main / develop)には絶対に --force しないのが鉄則です。
リモートの設定確認
# リモート一覧
git remote -v
# origin git@github.com:user/repo.git (fetch)
# origin git@github.com:user/repo.git (push)
# リモート追加
git remote add upstream git@github.com:original/repo.git
# URL 変更(HTTPS ↔ SSH 切替)
git remote set-url origin git@github.com:user/repo.git
# リモート削除
git remote remove upstream
複数リモート(fork 運用)
OSS の fork 運用では、自分の fork が origin、本家が upstream という慣習です。
# 本家を upstream として追加
git remote add upstream https://github.com/original/repo.git
# 本家の最新を取り込み
git fetch upstream
git checkout main
git merge upstream/main
# 自分の fork に push
git push origin main
認証: HTTPS と SSH
| 方式 | 長所 | 注意 |
|---|---|---|
| HTTPS + PAT | ファイアウォール越えやすい | パスワード代わりに Personal Access Token 必須 |
| SSH 鍵 | 毎回認証不要、高速 | 鍵管理(ssh-add / config)が必要 |
| HTTPS + GitHub CLI | gh auth login で簡単 | gh コマンドの導入が必要 |
# SSH 鍵生成
ssh-keygen -t ed25519 -C "you@example.com"
# 公開鍵を GitHub の Settings → SSH and GPG keys に登録
cat ~/.ssh/id_ed25519.pub
# 接続テスト
ssh -T git@github.com
# → Hi user! You've successfully authenticated...
# HTTPS → SSH に切替
git remote set-url origin git@github.com:user/repo.git
push を rebase で前処理(履歴をきれいに)
# main を最新化
git fetch origin
git rebase origin/main # feature の上から main 最新コミットの上に積み直す
# コンフリクト解決後
git rebase --continue
# force-with-lease で push(rebase 後は履歴が書き換わるので force 必須)
git push --force-with-lease origin feature/login
よくあるエラー
| エラー | 原因 | 対処 |
|---|---|---|
rejected (non-fast-forward) | リモートに新しい commit がある | git pull --rebase してから push |
rejected (fetch first) | 同上 | pull / fetch + rebase |
permission denied (publickey) | SSH 鍵未設定 / 鍵間違い | ssh-add, 鍵を GitHub に登録 |
remote: HTTP 403 | 権限なし or PAT 期限切れ | PAT 再発行 / 権限確認 |
protected branch hook declined | ブランチ保護で直接 push 禁止 | PR を作って merge |
FAQ
Q: 全ブランチを一括 push したい
A: git push --all origin。タグも含めるなら git push --all --tags origin。
Q: push 前に hook で lint や test を走らせたい
A: .git/hooks/pre-push に書くか、Husky / lefthook で管理。CI でも走らせて二重防御。
Q: 巨大ファイルを誤って push してしまった
A: git filter-repo で履歴から削除して force push。一度公開された情報はキャッシュ済かもしれないので注意。