👀

`git push` がlogが出ずにで止まる/リモート名抜けで失敗したときの原因と解決

に公開

【事例】git push がlogが出力せず無言で止まる/リモート名抜けで失敗したときの原因と解決(認証→SSH移行まで)

背景

個人学習用のMacで GitHub に git push したところ、端末が無言のまま数分待たされる、さらにその後にリモート名を誤って指定して失敗する、という現象に遭遇。
本記事では、初心者でも再現・対処できるように、切り分け手順から恒久対策までをまとめます。

本記事ではユーザー名/メール/鍵の指紋などのセンシティブ情報は
@<USERNAME><EMAIL@EXAMPLE.COM><FINGERPRINT>****** のように伏せ字にしています。


症状

  • git push origin <branch> 実行後、何も出力されずに待機

  • その後の操作で、こんなエラーが発生:

    fatal: 'feature/creation_train_game' does not appear to be a git repository
    fatal: Could not read from remote repository.
    

原因(結論)

  1. HTTPS 認証待ちが原因で無言に見えていた

    • GitHub は通常パスワード不可、Personal Access Token(PAT) が必要。
    • VS Code の Askpass ダイアログが裏で待機して、ターミナル側が無言に見える典型パターン。
  2. push 引数の順序ミス/リモート名指定漏れ

    • git push <remote> <branch><remote>(例: origin)を抜く・順序を逆にすると、Git がブランチ名をリモート名と勘違いして失敗。

まずの切り分け(最短ルート)

# 詳細ログ付き push(HTTPSなら通信・認証が見える化)
GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push -v origin <branch>

# 接続だけ試す(pushより軽い)→ ここで固まるなら通信/認証層が原因
git ls-remote origin -h

# リモートの方式(HTTPS or SSH)を確認
git remote -v
  • HTTP/2 401, www-authenticate: Basic realm="GitHub" が出たら認証で止まっているサイン。
  • すぐ解決したいなら SSH移行が手堅い(下記)。

実際のログ(伏せ字版)

Pushing to https://github.com/<USERNAME>/<REPO>.git
<= Recv header: HTTP/2 401
<= Recv header: www-authenticate: Basic realm="GitHub"
run_command: 'git credential-osxkeychain get'
.../VS Code.app/.../askpass.sh 'Username for '\''https://github.com'\'': '

401(未認証) で、GUIのaskpassがユーザー名の入力待ち。PAT をパスワード欄に入れる必要がある。


対処①:HTTPS のまま即時復旧(PAT を通す)

  1. 古いキャッシュを捨てる

    git credential reject <<<'url=https://github.com'
    
  2. GUI askpass を無効化して、ターミナルで聞かせる

    unset GIT_ASKPASS
    unset SSH_ASKPASS
    git config --global --unset core.askPass 2>/dev/null || true
    
  3. 再度 push(プロンプトが出たらユーザー名PATを入力)

    GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push -v origin <branch>
    

注意:パスワードではなく PAT をパスワード欄に入れる。
PAT は GitHub の Settings → Developer settings → Personal access tokens で作成(権限は必要最小限)。


対処②:恒久策として SSH に移行(推奨)

  1. 鍵生成(パスフレーズは推奨

    ssh-keygen -t ed25519 -a 100 -C "<EMAIL@EXAMPLE.COM>" -f ~/.ssh/id_ed25519
    
  2. エージェントへ読み込み(macOSのKeychainに覚えさせる)

    eval "$(ssh-agent -s)"
    ssh-add --apple-use-keychain ~/.ssh/id_ed25519
    ssh-add -l   # 指紋が出ればOK(<FINGERPRINT>)
    
  3. 公開鍵を GitHub に登録(Settings → SSH and GPG keys)

    pbcopy < ~/.ssh/id_ed25519.pub
    
  4. 接続テスト

    ssh -T git@github.com
    # Hi <USERNAME>! You've successfully authenticated, but GitHub does not provide shell access.
    
  5. リモートURLを SSH に変更

    git remote set-url origin git@github.com:<USERNAME>/<REPO>.git
    git remote -v  # git@github.com:... になっていればOK
    

つまずき②:fatal: '<branch>' does not appear to be a git repository

原因git push の引数順ミス/origin の抜け。
正しい形

git push -u origin <branch>   # 最初の一回は -u を付けて upstream を設定
# 次回以降は
git push

より安全な型(ブランチ名の打ち間違いを回避):

git push -u origin HEAD

再発防止の設定(超おすすめ)

# 新規ブランチを初めて push するとき、自動で upstream を設定(Git 2.37+)
git config --global push.autoSetupRemote true

これで初回 git push でも -u 相当になり、以後は git push だけでOK。
(古い Git では効かない場合あり)


確認すべきファイル/設定と意図

  • .git/config

    • [remote "origin"] url = git@github.com:<USERNAME>/<REPO>.git(SSHに統一)
  • ~/.ssh/id_ed25519 / ~/.ssh/id_ed25519.pub

    • 秘密鍵(権限 600)と公開鍵644)。公開鍵を GitHub に登録。
  • ~/.ssh/config(複数鍵運用や安定化に)

    Host github.com
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_ed25519
      AddKeysToAgent yes
      UseKeychain yes
    
  • 追跡ブランチの確認

    git rev-parse --abbrev-ref --symbolic-full-name @{u}
    # 未設定なら set-upstream する
    

運用時のコスト/注意点

  • HTTPS+PAT:GUI 依存で“無言ハング”に見えがち。Keychain 登録で軽減可。
  • SSH(ed25519):一度設定すれば快適・安全。パスフレーズ+ssh-agentで利便性と安全性を両立。
  • リモート名の統一(origin):ヒューマンエラー減。フォーク運用時は origin(自分)と upstream(元)を役割分担。
  • 巨大ファイルは LFS:push/clone の待ち時間が爆増するのを防ぐ(今回は未該当だが定石)。
  • サブモジュール:サブモジュール側を先に push → 親リポの参照更新、の順序を厳守。

参考リンク(公式)


まとめ

  • 無言停止はだいたい認証待ち。PAT か SSH を正しく通せば解消。
  • git push <remote> <branch><remote> を忘れない。初回に -u を付けるか、push.autoSetupRemote=true で再発防止。
  • 学習用PCでもSSH(ed25519)+ パスフレーズ + ssh-agentが鉄板です。

必要であれば、あなたの実際のログから機微情報を自動マスキングして Zenn 用に整形するスクリプト例も用意できます(シェル or Node)。

Discussion