git pushの使い方とオプション一覧!-uの意味やエラー・force対策まで完全解説

コマンドリファレンス

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes
    1. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  1. 参考・参照リンク
  2. 関連コマンド
    1. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    2. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  3. 参考・参照リンク
  4. 関連コマンド
    1. Q2. コミット(git commit)せずに git push するとどうなりますか?
    2. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    3. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  5. 参考・参照リンク
  6. 関連コマンド
  7. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  8. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  9. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  10. 参考・参照リンク
  11. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  12. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  13. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  14. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  15. 参考・参照リンク
  16. 関連コマンド
  17. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  18. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  19. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  20. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  21. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  22. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  23. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  24. 参考・参照リンク
  25. 関連コマンド
    1. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    2. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  26. 参考・参照リンク
  27. 関連コマンド
  28. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  29. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  30. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  31. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  32. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  33. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  34. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  35. 参考・参照リンク
  36. 関連コマンド
    1. Q2. コミット(git commit)せずに git push するとどうなりますか?
    2. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    3. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  37. 参考・参照リンク
  38. 関連コマンド
  39. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  40. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  41. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  42. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  43. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  44. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  45. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  46. 参考・参照リンク
  47. 関連コマンド
  48. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  49. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  50. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  51. 参考・参照リンク
  52. 関連コマンド
  53. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  54. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  55. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  56. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  57. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  58. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  59. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  60. 参考・参照リンク
  61. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  62. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  63. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  64. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  65. 参考・参照リンク
  66. 関連コマンド
  67. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  68. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  69. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  70. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  71. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  72. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  73. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  74. 参考・参照リンク
  75. 関連コマンド
    1. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    2. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  76. 参考・参照リンク
  77. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  78. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  79. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  80. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  81. 参考・参照リンク
  82. 関連コマンド
  83. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  84. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  85. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  86. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  87. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  88. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  89. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  90. 参考・参照リンク
  91. 関連コマンド
    1. Q2. コミット(git commit)せずに git push するとどうなりますか?
    2. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    3. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  92. 参考・参照リンク
  93. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  94. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  95. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  96. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  97. 参考・参照リンク
  98. 関連コマンド
  99. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  100. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  101. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  102. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  103. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  104. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  105. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  106. 参考・参照リンク
  107. 関連コマンド
  108. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  109. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  110. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  111. 参考・参照リンク
  112. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  113. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  114. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  115. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  116. 参考・参照リンク
  117. 関連コマンド
  118. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  119. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  120. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  121. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  122. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  123. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  124. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  125. 参考・参照リンク
  126. 関連コマンド
    1. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    2. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  127. 参考・参照リンク
  128. 関連コマンド
  129. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  130. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  131. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  132. 参考・参照リンク
  133. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  134. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  135. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  136. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  137. 参考・参照リンク
  138. 関連コマンド
  139. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  140. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  141. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  142. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  143. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  144. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  145. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  146. 参考・参照リンク
  147. 関連コマンド
    1. Q2. コミット(git commit)せずに git push するとどうなりますか?
    2. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    3. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  148. 参考・参照リンク
  149. 関連コマンド
  150. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  151. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  152. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  153. 参考・参照リンク
  154. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  155. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  156. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  157. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  158. 参考・参照リンク
  159. 関連コマンド
  160. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  161. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  162. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  163. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  164. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  165. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  166. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  167. 参考・参照リンク
  168. 関連コマンド
    1. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    2. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  169. 参考・参照リンク
  170. 関連コマンド
    1. Q2. コミット(git commit)せずに git push するとどうなりますか?
    2. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    3. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  171. 参考・参照リンク
  172. 関連コマンド
  173. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  174. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  175. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  176. 参考・参照リンク
  177. 関連コマンド
    1. 公開済みコミットを消さずに取り消す方法(git revert)
  178. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  179. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  180. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  181. 参考・参照リンク
  182. 関連コマンド
  183. 構文(Syntax)と主要オプション一覧
    1. 主なオプション一覧
  184. git pushとは?コミットとの決定的な違いと仕組み
    1. ワークツリー/ステージ/ローカル/リモートの関係
    2. commitとpushの違い(「コミットしたのに共有されない」の原因)
    3. なぜ「pushする前にpull/fetch」が必要なのか?
  185. 初回プッシュと -u(–set-upstream)オプションの役割
    1. 初回プッシュの基本手順(クイックスタート)
    2. git push -u origin <branch> の意味とメリット
    3. -u を付け忘れた場合の後付け方法
    4. 追跡ブランチの確認(git branch -vv)
  186. 強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)
    1. git push --force (-f) がなぜ危険なのか?
    2. より安全な代替案:git push --force-with-lease
    3. 公開済みコミットを消さずに取り消す方法(git revert)
  187. 【トラブルシューティング】git pushでよく発生するエラーと解決策
    1. エラー①: ! [rejected] ... (non-fast-forward) / fetch first
    2. エラー②: fatal: The current branch has no upstream branch
    3. エラー③: error: src refspec main does not match any
    4. エラー④: Permission denied (publickey) / 認証エラー
    5. エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)
    6. エラー⑥: fatal: 'origin' does not appear to be a git repository
  188. 目的別!git pushの実務レシピ集
    1. レシピ1: 新規ブランチを作成してリモートへpushする
    2. レシピ2: リモートブランチを削除する
    3. レシピ3: タグを作成してリモートにpushする
    4. レシピ4: ローカルと異なる名前のリモートブランチへpushする
    5. レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する
  189. よくある質問(FAQ)
    1. Q1. git push -u は毎回実行する必要がありますか?
    2. Q2. コミット(git commit)せずに git push するとどうなりますか?
    3. Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?
    4. Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?
  190. 参考・参照リンク
  191. 関連コマンド
  192. 関連記事

参考・参照リンク

関連コマンド

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

git push コマンドは、ローカルリポジトリで作成したコミットをリモートリポジトリ(GitHubやGitLabなど)へ送信・反映させるための重要コマンドです。
本記事では、git push の基本的な使い方から、初回プッシュ時に必須となる -u--set-upstream)オプションの仕組み、安全な開発に不可欠な --force の危険性と --force-with-lease の使い分け、さらによくあるエラー(rejectedやupstream未設定など)のトラブルシューティングまでを分かりやすく解説します。

構文(Syntax)と主要オプション一覧

git push [オプション] [リモート名] [ブランチ名]

主なオプション一覧

オプション説明使用例
(なし)追跡ブランチ(upstream)が設定済みのリモート・ブランチへ pushgit push
<リモート> <ブランチ>指定したリモートとブランチへ pushgit push origin main
-u / --set-upstream上流ブランチ(追跡関係)を設定して push(初回推奨)git push -u origin feature-a
--force / -fリモートの履歴を強制上書き(※危険)git push --force origin feature-a
--force-with-leaseリモートが変更されていない場合のみ安全に強制 pushgit push --force-with-lease origin feature-a
--allすべてのローカルブランチを一度に pushgit push --all origin
--tagsローカルの全タグを pushgit push --tags
--follow-tagsコミットと関連する注釈付きタグのみを一緒に pushgit push --follow-tags
--deleteリモートブランチまたはタグを削除git push origin --delete feature-old
--dry-run実際には送信せず、何が push されるか事前確認git push --dry-run origin main

git pushとは?コミットとの決定的な違いと仕組み

ワークツリー/ステージ/ローカル/リモートの関係

Gitでファイルを変更してからリモートリポジトリに反映されるまでには、4つのエリアが存在します。

  • ワークツリー(作業ディレクトリ): 実際にファイルを編集・作成する場所
  • ステージ(インデックス): git add でコミット対象として登録する一時領域
  • ローカルリポジトリ: git commit で自分のPC内に変更履歴を記録・確定する場所
  • リモートリポジトリ: git push でチーム共有やバックアップのためにサーバー(GitHub等)へ送信する場所

全体的なデータの流れは以下のようになります。

[ ワークツリー ] ──( git add )──> [ ステージ ] ──( git commit )──> [ ローカル履歴 ] ──( git push )──> [ リモート ]

commitとpushの違い(「コミットしたのに共有されない」の原因)

初心者がよく戸惑うのが「git commit をしたのにGitHubやGitLabのプルリクエストに変更が反映されない」という問題です。

git commit はあくまで手元のPC内(ローカル)に履歴を保存する操作です。他のメンバーやWeb上のリモートリポジトリへ変更を公開するには、必ず git push を実行してデータをアップロードする必要があります。

なぜ「pushする前にpull/fetch」が必要なのか?

チーム開発では、自分が作業している間に他のメンバーがリモートリポジトリを更新していることがあります。リモートの履歴が自分のローカルより進んでいる状態のまま git push しようとすると、Gitは履歴の整合性を保つために push を拒否(rejected)します。

そのため、安全に push するには、あらかじめ git fetch または git pull --rebase で最新のリモート変更を取り込んでから push するのが基本のルールです。

初回プッシュと -u(–set-upstream)オプションの役割

初回プッシュの基本手順(クイックスタート)

ローカルで新規プロジェクトを作成し、GitHubなどのリモートリポジトリへ初めて push するまでの手順は次の通りです。

# 1. ローカルリポジトリの初期化とファイル生成
git init
echo "# My Project" > README.md

# 2. ステージングと初回コミット
git add README.md
git commit -m "feat: initial commit"

# 3. デフォルトブランチ名を main に設定
git branch -M main

# 4. リモートリポジトリの登録(HTTPSまたはSSH)
git remote add origin https://github.com/username/repository.git

# 5. 上流ブランチを設定して初回push
git push -u origin main

git push -u origin <branch> の意味とメリット

-u オプション(--set-upstream の略)は、ローカルブランチに対してリモートの「上流ブランチ(追跡ブランチ)」を関連付ける設定を行います。

初回に git push -u origin main を実行しておくと、Gitは「ローカルの main ブランチは origin/main を追跡する」と記憶します。これにより、次回以降は引数を省略して単に:

git push
git pull

と入力するだけで、正しく該当するリモートブランチとの送信・受信が行えるようになります。

-u を付け忘れた場合の後付け方法

もし初回 push 時に -u を付け忘れて単に git push origin main と実行した場合でも、後から簡単に追跡設定を追加できます。

# 方法1: 再度 -u を付けて push する
git push -u origin main

# 方法2: git branch コマンドで上流ブランチを直接設定する
git branch --set-upstream-to=origin/main main

追跡ブランチの確認(git branch -vv)

各ローカルブランチがどのリモートブランチを追跡しているかは、git branch -vv コマンドで確認できます。

$ git branch -vv
* main     a1b2c3d [origin/main] feat: add new header
  feature  e5f6g7h [origin/feature: ahead 1] update docs

ブランチ名の横に [origin/main] のように表示されていれば、上流ブランチが正常に設定されています。

強制プッシュ(–force)の危険性と安全な代替案(–force-with-lease)

git push --force (-f) がなぜ危険なのか?

git push --force(または -f)は、リモートリポジトリの履歴をローカルの状態で強制的に書き換える・上書きするコマンドです。

ローカルで git rebasegit reset を行って履歴を整えた後に使われることがありますが、チーム開発で軽易に使用すると重大な問題を引き起こします。

  • 他人のコミットを消去してしまう: 他のメンバーがリモートに push していたコミットが存在しても、それを完全に上書き抹消してしまいます。
  • チーム全体の環境壊滅: 他のメンバーのローカル履歴とリモート履歴に整合性がなくなり、コンフリクトや混乱が発生します。

より安全な代替案:git push --force-with-lease

強制 push が必要な場合、--force の代わりに必ず **--force-with-lease** オプションを使用するのが世界共通のベストプラクティスです。

git push --force-with-lease origin feature-branch

--force-with-lease の仕組み:
自分が最後にリモートを fetch してから、他の人がさらに新しいコミットを push していないかをチェックします。もし他の人が更新していた場合は push を自動拒否 してくれるため、他人の作業結果を意図せず消してしまう事故を防止できます。

公開済みコミットを消さずに取り消す方法(git revert)

すでにリモートへ push してしまったコミットを取り消したい場合は、強制 push で履歴を書き換えるのではなく、打ち消しコミットを作成する git revert を使うのが安全です。

# 指定したコミットの変更を打ち消すコミットを作成
git revert <コミットハッシュ>

# 通常通り push(強制 push は不要)
git push

git revert であれば過去の履歴を壊さず安全に変更を元に戻せるため、共同開発や本番環境でのデプロイブランチ(main / master)で推奨されます。

【トラブルシューティング】git pushでよく発生するエラーと解決策

エラー①: ! [rejected] ... (non-fast-forward) / fetch first

エラーメッセージ例:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing

【原因】
リモートリポジトリに、あなたのローカルPCには存在しない最新コミット(他のメンバーの変更やWeb画面でのREADME追加など)があるためです。

【解決策】
リモートの最新状態を取り込んでから再 push します。

# リモートの変更を取り込む(rebaseが推奨)
git pull --rebase origin main

# コンフリクトがなければそのまま push
git push origin main

エラー②: fatal: The current branch has no upstream branch

エラーメッセージ例:

fatal: The current branch feature-login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature-login

【原因】
新規作成したローカルブランチに、上流ブランチ(-u)がまだ登録されていない状態で単に git push と入力したためです。

【解決策】
エラーメッセージの提示通り、-u(または --set-upstream)オプションを指定して push します。

git push -u origin feature-login

エラー③: error: src refspec main does not match any

エラーメッセージ例:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repository.git'

【原因】
以下のいずれかが原因です。

  • ローカルでまだ1つも git commit を実行していない
  • 指定したブランチ名(main)が存在せず、ローカルのブランチ名が master になっている

【解決策】
git statusgit branch で現在のブランチ名とコミットの有無を確認します。

# コミットが存在することを確認
git log

# ブランチ名を main に変更して push
git branch -M main
git push -u origin main

エラー④: Permission denied (publickey) / 認証エラー

エラーメッセージ例:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

【原因】
SSH接続用の鍵(公開鍵)がGitHub/GitLabに登録されていないか、認証トークン(PAT: Personal Access Token)が無効になっているかです。

【解決策】
SSHキーの設定または接続確認を行います。

# SSHの接続テスト
ssh -T git@github.com

# 成功メッセージ「Hi username! You've successfully authenticated...」が出ればOK

未登録の場合は ssh-keygen で公開鍵を生成し、GitHubの 設定(Settings > SSH and GPG keys)に登録してください。

エラー⑤: remote: Protected branch hook declined (保護ブランチエラー)

エラーメッセージ例:

remote: Personal account rules or branch protection rules prohibit pushing to main.
! [remote rejected] main -> main (protected branch hook declined)

【原因】
GitHub等のリポジトリ設定で main / master ブランチへの直接 push が禁止(保護ルール適用)されているためです。

【解決策】
直接 push せず、機能ブランチを作成して push し、プルリクエスト(PR)を作成してコードレビュー・マージを行います。

# 作業ブランチを作成して切替
git switch -c feature/my-update

# トピックブランチを push
git push -u origin feature/my-update
# その後、GitHub上でプルリクエストを作成

エラー⑥: fatal: 'origin' does not appear to be a git repository

【原因】
リモート名 `origin` が登録されていないか、リポジトリURLが間違っています。

【解決策】
登録情報を確認し、正しいURLを設定します。

# リモート一覧とURLの確認
git remote -v

# 正しいURLでリモートを追加(未登録の場合)
git remote add origin https://github.com/username/repository.git

# すでに誤ったURLが登録されている場合の変更方法
git remote set-url origin https://github.com/username/repository.git

目的別!git pushの実務レシピ集

レシピ1: 新規ブランチを作成してリモートへpushする

# ブランチ作成と切り替え
git switch -c feature/user-auth

# 変更を加えた後コミット
git add .
git commit -m "feat: add user auth logic"

# 上流設定付きでpush
git push -u origin feature/user-auth

レシピ2: リモートブランチを削除する

マージ済みの不要になったリモートブランチを削除する手順です。

# リモートブランチの削除(推奨記法)
git push origin --delete feature/user-auth

# 昔からあるコロンを用いた同等記法
git push origin :feature/user-auth

レシピ3: タグを作成してリモートにpushする

リリースバージョンなどを管理する「タグ」は、通常の git push では送信されません。

# 1. 注釈付きタグを作成(推奨)
git tag -a v1.0.0 -m "Release version 1.0.0"

# 2. 特定のタグのみ push
git push origin v1.0.0

# ローカルにある全タグを一括 push
git push --tags

# コミットと関連する注釈付きタグのみ一緒に push
git push --follow-tags

レシピ4: ローカルと異なる名前のリモートブランチへpushする

リファスペック(ローカル名:リモート名)を使ってブランチ名を指定します。

# ローカルの dev ブランチをリモートの feature-dev へ push
git push origin dev:feature-dev

レシピ5: Fork(フォーク)リポジトリから本家(upstream)へ連携する

OSS開発やフォーク運用では、自分のフォークリポジトリを `origin`、本家リポジトリを `upstream` として登録します。

# 本家リポジトリを upstream として追加
git remote add upstream https://github.com/original-owner/repo.git

# 自分のフォーク(origin)へ push
git push -u origin feature-fix

# 本家の最新変更を取り込む場合
git fetch upstream
git merge upstream/main

よくある質問(FAQ)

Q1. git push -u は毎回実行する必要がありますか?

いいえ、初回のみで大丈夫です。
新しいブランチを作成して最初に push する時だけ -u を付けておけば、次回以降はそのブランチ上で単に git push と打つだけで自動的に同じリモートブランチへ送信されます。

Q2. コミット(git commit)せずに git push するとどうなりますか?

「Everything up-to-date」(すべて最新です)と表示され、何も送信されません。
git push はローカルリポジトリに保存されたコミットを送信するコマンドです。ワークツリーやステージ上の未コミットな変更は送信されないため、必ず事前に git addgit commit を行なってください。

Q3. 誤って –force でリモート履歴を上書きしてしまった場合の復旧方法は?

他のチームメンバーのローカル環境に消えてしまったコミットが残っていれば、そのメンバーから再 push してもらうか、git reflog コマンドで消去前のコミットハッシュを探して復元が可能です。

# 過去のHEADの移動履歴を確認
git reflog

# 上書き前の状態にローカルを戻して再push
git reset --hard HEAD@{1}
git push --force-with-lease origin branch-name

Q4. 大容量ファイル(動画・Zipなど)で push がエラーになる場合は?

GitHub等では1ファイル100MB以上のファイルは push できません。大容量ファイルを扱う場合は **Git LFS(Large File Storage)** を導入してください。

# Git LFS のインストールと設定
git lfs install
git lfs track "*.zip"
git add .gitattributes

参考・参照リンク

関連コマンド

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント