0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[プロジェクト] デプロイ後Git Pushができない時 - HTTP 400エラー解決記 - HabitFlow 開発記 (2編)

0
Posted at

現場とコードの間 - 7ngenious
2025.02.11

🎉 デプロイ成功!でも...

夕方7時30分。Vercelデプロイが完了した。

✅ Deployment: Ready
✅ URL: https://habitflow-mvp.vercel.app
✅ Status: 200 OK

実際にアクセスしてみると完璧に動作する。習慣を追加して、チェックして、グラフも出る。

「あとはREADMEを更新して終わりだ!」

ClaudeがREADME.mdを作ってくれた。プロジェクト説明、スクリーンショットセクション、技術スタック、ロードマップまできれいに整理されていた。

git add README.md
git commit -m "📝 Docs: README更新(開発状況チェックリスト追加)"
git push origin main

そしてエラーが発生した。


❌ エラー:「Everything up-to-date」なのに上がらない?

~/habitflow-mvp   main  git push origin main
オブジェクトを列挙中: 14、完了。
オブジェクト数を数える中: 100% (14/14)、完了。
Delta compression using up to 8 threads
オブジェクトを圧縮中: 100% (12/12)、完了。
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet
オブジェクトを書き込み中: 100% (12/12)、3.21 MiB | 5.02 MiB/s、完了。
Total 12 (delta 3)、reused 0 (delta 0)、pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date

?????

  • オブジェクトを圧縮中: 100% → 圧縮は成功
  • 3.21 MiB → データは転送試み
  • error: RPC failed; HTTP 400 → エラー発生
  • Everything up-to-date → でも完了?

最初の反応:「何?」

GitHubに行って確認した。READMEは依然として基本Viteテンプレートのままだった。

# React + Vite

This template provides a minimal setup to get React working in Vite...

Pushができなかったのだ。


🔍 原因を探す:5つの仮説

仮説 1:node_modulesがGitに含まれた

証拠:3.21 MiB転送試み(READMEだけ変わったのにおかしい)

# 確認
git ls-files | grep node_modules

# 結果:(何も出ない)

❌ これではなかった。


仮説 2:Vercelデプロイとタイミング衝突

考え:デプロイ中にpushして衝突?

# Vercelダッシュボード確認
https://vercel.com/dashboard

# 状態:Ready(デプロイ完了)

❌ これもではなかった。


仮説 3:Git Bufferサイズ不足

証拠:3.21 MiBを転送しようとして失敗

# Bufferサイズ確認
git config --get http.postBuffer

# 結果:(設定されていない = デフォルト値1MB)

🤔 可能性がある!


仮説 4:Credential(認証情報)問題

考え:途中でSSHに変えようとして失敗した記憶

# リモートURL確認
git remote -v

# 結果:
origin  git@github.com:7ngenious/habitflow-mvp.git (fetch)
origin  git@github.com:7ngenious/habitflow-mvp.git (push)

SSHに変わっていた!

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

# 結果:
git@github.com: Permission denied (publickey).

💡 これだ!


仮説 5:ローカルとリモートが合わない

# ローカルコミット
git rev-parse HEAD
# 00c9cb9d1e0048e2a6169f99a8b781aea7284bdd

# リモートコミット
git rev-parse origin/main
# b253349a94d9203fb5ba02d4401ec21821531134

# 違う!

✅ 確認:実際にpushができなかったのが正しい。


💊 解決試み 1:SSH鍵設定(失敗)

試み

# SSH鍵生成
ssh-keygen -t ed25519 -C "your.email@example.com"

# 公開鍵確認
cat ~/.ssh/id_ed25519.pub

問題:GitHubに登録しないといけないが、今すぐ複雑だ。

決定:一旦HTTPSに戻ろう。


✅ 解決方法:HTTPS + Buffer増加

Step 1: HTTPSにリモートURL変更

# SSH → HTTPS
git remote set-url origin https://github.com/7ngenious/habitflow-mvp.git

# 確認
git remote -v
# origin  https://github.com/7ngenious/habitflow-mvp.git (fetch)
# origin  https://github.com/7ngenious/habitflow-mvp.git (push)

Step 2: Credentialキャッシュ初期化

# 既存認証情報削除
git credential reject << EOF
protocol=https
host=github.com
EOF

理由:以前保存された認証情報が期限切れになった可能性がある


Step 3: HTTP Bufferサイズ増加

# デフォルト1MB → 500MBに増加
git config --global http.postBuffer 524288000

# 確認
git config --get http.postBuffer
# 524288000

なぜ必要か?

  • READMEだけ変わったがGitは全体履歴を考慮
  • 以前のコミットのメタデータ含む
  • 圧縮されたオブジェクトが1MBを超える可能性がある

Step 4: 再度push!

git push origin main

# Username入力要請
Username for 'https://github.com': 7ngenious

# Password入力要請(Personal Access Token!)
Password for 'https://7ngenious@github.com': ghp_xxxxxxxxxxxxx

重要:PasswordはGitHubパスワードではなくPersonal Access Token


Personal Access Token生成

  1. https://github.com/settings/tokens アクセス
  2. "Generate new token (classic)" クリック
  3. Note: habitflow-mvp
  4. Expiration: 90 days
  5. 権限: repo 全体チェック
  6. "Generate token" クリック
  7. トークンコピー(二度と見られない!)

最終push

git push origin main

# 結果:
オブジェクトを列挙中: 5、完了。
オブジェクト数を数える中: 100% (5/5)、完了。
Delta compression using up to 8 threads
オブジェクトを圧縮中: 100% (3/3)、完了。
オブジェクトを書き込み中: 100% (3/3)、15.42 KiB | 15.42 MiB/s、完了。
Total 3 (delta 2)、reused 0 (delta 0)、pack-reused 0
remote: Resolving deltas: 100% (2/2)、completed with 2 local objects.
To https://github.com/7ngenious/habitflow-mvp.git
   b253349..00c9cb9  main -> main

🎉 成功!


🎓 原因整理

実際の原因は3つの組み合わせ

  1. SSH設定失敗

    • 途中でSSHに変えようとして失敗
    • SSH鍵がないのにURLだけ変わった
    • Permission denied (publickey)
  2. HTTP Buffer不足

    • デフォルト1MBでは不足
    • 3.21 MiB転送試みて失敗
    • RPC failed; HTTP 400
  3. Credentialキャッシュ問題

    • 以前の認証情報が期限切れ
    • 新しいトークン必要
    • キャッシュ初期化必要

🔧 解決策要約

# 1. HTTPSに変更
git remote set-url origin https://github.com/7ngenious/habitflow-mvp.git

# 2. Credential初期化
git credential reject << EOF
protocol=https
host=github.com
EOF

# 3. Buffer増加
git config --global http.postBuffer 524288000

# 4. push(Token入力)
git push origin main

💡 学んだこと

Gitの動作原理

Gitはデルタ(変更分)だけ転送するのではない

  • 全体オブジェクトグラフ考慮
  • 圧縮されたパックファイル生成
  • メタデータ含む

だから小さな変更も大きなデータになり得る


SSH vs HTTPS

項目 SSH HTTPS
初期設定 複雑(鍵生成/登録) 簡単(Tokenのみ)
認証 自動(鍵ベース) 毎回(Token入力)
セキュリティ 高い 中間(Token管理)
速度 速い 普通
ファイアウォール 遮断される可能性 ほとんど通過

結論

  • 個人プロジェクト → HTTPS(簡便)
  • 会社/チーム → SSH(セキュリティ)

HTTP 400エラーの様々な原因

HTTP 400 = "Bad Request"

可能な原因:

  1. 認証失敗(Credential)
  2. Bufferサイズ超過
  3. 誤ったリクエスト形式
  4. ネットワークタイムアウト
  5. プロキシ/ファイアウォール問題

デバッグ順序:

  1. 認証確認(git remote -vssh -T
  2. Buffer増加
  3. ネットワーク確認
  4. リモートリポジトリ状態確認

"Everything up-to-date"の意味

このメッセージが出る場合:

  1. ✅ 実際に同期された(正常)
  2. ❌ push失敗したがGitが混乱している(非正常)

確認方法:

# ローカルとリモート比較
git fetch origin
git log origin/main..HEAD

# 出力があれば → まだpushされていない
# 出力がなければ → すでにpushされた

🚀 予防法

これからはこうしよう

1. 最初からBuffer設定

git config --global http.postBuffer 524288000

2. 認証方式を明確に

  • SSH使用:鍵を先に設定
  • HTTPS使用:Token先に生成

3. push前に確認

# リモートURL確認
git remote -v

# 認証テスト
git ls-remote origin

# ローカル-リモート比較
git fetch origin
git status

4. 定期的な同期

# 作業前
git pull origin main

# 作業後
git push origin main

📊 所要時間

19:30 - READMEコミット試み(失敗)
19:35 - 最初の再試行(失敗)
19:40 - node_modules確認(違う)
19:45 - Vercelデプロイ確認(違う)
19:50 - SSH問題発見
20:00 - SSH鍵生成試み(複雑)
20:10 - HTTPS転換決定
20:15 - Credential初期化
20:20 - Buffer増加
20:25 - Token生成
20:30 - 最終push成功! 🎉

総所要時間:1時間

初めて経験するエラーなので時間がかかったが、今なら5分で解決できる。


🤔 もしこの方法もダメなら?

Plan B: 小さなテストpush

# 1. 小さなファイル生成
echo "# Test" > test.txt

# 2. コミット
git add test.txt
git commit -m "test: pushテスト"

# 3. push
git push origin main

# 成功すれば → 問題は特定ファイル
# 失敗すれば → 問題はGit設定

Plan C: 強制push

# 注意:他の人が作業中でない時のみ!
git push origin main --force

Plan D: 新しいブランチで迂回

# 1. 新しいブランチ
git checkout -b readme-update

# 2. push
git push origin readme-update

# 3. GitHubでPull Request
# 4. Merge

Plan E: GitHubウェブで直接修正

1. https://github.com/7ngenious/habitflow-mvp
2. README.md クリック
3. 鉛筆アイコン(Edit)
4. 内容修正
5. Commit changes

最後の手段だが確実だ!


💭 振り返り

デバッグの重要性

エラーは学びの機会だ。

今回学んだこと:

  • Gitの内部動作原理
  • SSH vs HTTPSの違い
  • HTTP Bufferの役割
  • Credential管理
  • 体系的なデバッグアプローチ

製造現場のトラブルシューティングと似ていた。

PLCエラーが発生した時も:

  1. エラーメッセージ確認
  2. 可能な原因列挙
  3. 一つずつ検証
  4. 根本原因を探す
  5. 再発防止策準備

Claudeの助け

AIなしで一人だったら?

  • Googleで3時間以上
  • Stack Overflow 10個以上のタブ
  • 様々な試みの後諦め
  • 結局ウェブで修正

Claudeと一緒に:

  • 体系的なデバッグガイド
  • 各解決策の理由説明
  • 段階別コマンド提供
  • 1時間で解決

諦めないこと

3回目のpush失敗した時の考え:

「そのままGitHubウェブで修正して終わろうか?」

しかし我慢した。

理由:

  1. これは学習機会だ
  2. 次回また経験する可能性がある
  3. 根本原因を知りたい
  4. ブログネタだ(笑)

🎯 次のステップ

HabitFlow完成

Phase 1.1 - ポートフォリオ整理

  • README更新 ✅
  • スクリーンショット追加(3枚)
  • GitHub About設定
  • ブログポスティング(この記事!)

Phase 1.2 - 機能追加

  • 習慣修正機能
  • メモ機能
  • ダークモード

Phase 2.0 - バックエンド連動

  • Spring Boot API
  • MySQL連動
  • JWT認証

🔗 プロジェクトリンク


📝 終わりに

「エラーは敵ではなく師だ」

今回のエラーを通じて:

  • Gitをより深く理解した
  • SSHとHTTPSの違いを学んだ
  • 体系的なデバッグ方法を習得した
  • 諦めない粘り強さを育てた

そしてブログネタも得た。 😄


シリーズ完結

  • 0編:習慣を「感じられる」ように
  • 1編:バイブコーディングで1日でMVP完成
  • 2編:デプロイ後Git Pushができない時 - HTTP 400エラー解決記(現在)

Tags: #Git #トラブルシューティング #HTTP400 #GitHub #SSH #HTTPS #デバッグ #エラー解決


📌 クイック解決チートシート

# Git Push HTTP 400エラー解決

# 1. HTTPSに変更
git remote set-url origin https://github.com/USERNAME/REPO.git

# 2. Credential初期化
git credential reject << EOF
protocol=https
host=github.com
EOF

# 3. Buffer増加
git config --global http.postBuffer 524288000

# 4. push(Token必要!)
git push origin main

# Token生成:https://github.com/settings/tokens

次回同じエラーに遭遇する誰かにこの記事が役立つことを願う! 🙏

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?