よくあるGitトラブル
Gitを使っていると、様々なトラブルに遭遇します。適切な対処法を知っていれば、慌てずに解決できます。
🚫 よくあるエラー
- 「fatal: not a git repository」
- 「error: failed to push some refs」
- 「merge conflict」で作業が止まる
- コミットしたはずのファイルが消えた
認証・接続エラー
1. Permission denied (publickey)
# SSHキーの確認
ls -la ~/.ssh/
# SSHキーの生成
ssh-keygen -t ed25519 -C "your-email@example.com"
# SSHエージェントに追加
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 公開鍵をコピー(GitHubに登録)
cat ~/.ssh/id_ed25519.pub
# 接続テスト
ssh -T git@github.com
2. HTTPSの認証エラー
# 認証情報のキャッシュ
git config --global credential.helper cache
# macOSの場合
git config --global credential.helper osxkeychain
# Windowsの場合
git config --global credential.helper wincred
# 認証情報をリセット
git config --global --unset credential.helper
プッシュ・プルのエラー
1. rejected - non-fast-forward
# エラー例
! [rejected] main -> main (non-fast-forward)
# 解決方法1: プルしてからプッシュ
git pull origin main
# コンフリクトがあれば解決
git push origin main
# 解決方法2: リベースしてプッシュ
git pull --rebase origin main
git push origin main
# 解決方法3: 強制プッシュ(注意!)
git push --force-with-lease origin main
2. refusing to merge unrelated histories
# 異なる履歴を持つリポジトリのマージ
git pull origin main --allow-unrelated-histories
# コンフリクトを解決してコミット
git add .
git commit -m "Merge unrelated histories"
コミット関連のトラブル
1. コミットメッセージの修正
# 直前のコミットメッセージを修正
git commit --amend -m "新しいメッセージ"
# 過去のコミットメッセージを修正
git rebase -i HEAD~3
# エディタでrewordを選択
2. 間違ったファイルをコミット
# コミットからファイルを除外(履歴は残る)
git rm --cached sensitive-file.txt
git commit --amend
# 完全に履歴から削除(危険!)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch sensitive-file.txt" \
--prune-empty --tag-name-filter cat -- --all
3. コミットの取り消し
# コミットを取り消し(変更は残る)
git reset --soft HEAD~1
# コミットとステージングを取り消し
git reset HEAD~1
# すべてを取り消し(危険!)
git reset --hard HEAD~1
ブランチ・マージのトラブル
1. detached HEAD状態
# 現在の状態を確認
git status
# HEAD detached at abc1234
# 解決方法1: 新しいブランチを作成
git checkout -b new-branch
# 解決方法2: 既存のブランチに戻る
git checkout main
# 解決方法3: 変更を保存してから戻る
git stash
git checkout main
git stash pop
2. マージの中止
# マージ中の状態を確認
git status
# マージを中止
git merge --abort
# リベースを中止
git rebase --abort
# cherry-pickを中止
git cherry-pick --abort
データ復旧
1. 削除したブランチの復旧
# 最近の操作履歴を確認
git reflog
# 削除したブランチのコミットを探す
git reflog | grep "branch-name"
# ブランチを復旧
git checkout -b recovered-branch abc1234
2. 失われたコミットの復旧
# すべての到達不可能なオブジェクトを表示
git fsck --full --no-reflogs --unreachable --lost-found
# コミットの内容を確認
git show <commit-hash>
# コミットを復旧
git cherry-pick <commit-hash>
3. 破損したリポジトリの修復
# リポジトリの整合性チェック
git fsck --full
# オブジェクトデータベースの修復
rm -f .git/index
git reset
# packファイルの再構築
git repack -a -d
# 完全な再クローン(最終手段)
mv broken-repo broken-repo-backup
git clone <remote-url> broken-repo
実践演習
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
予防策
1. 定期的なバックアップ
# リモートリポジトリの追加
git remote add backup https://backup-server.com/repo.git
# すべてのブランチとタグをバックアップ
git push backup --all
git push backup --tags
# 自動バックアップスクリプト
cat > backup.sh << 'EOF'
#!/bin/bash
git push backup --all
git push backup --tags
echo "Backup completed at $(date)"
EOF
2. 設定の最適化
# fsckを自動実行
git config receive.fsckObjects true
git config fetch.fsckObjects true
git config transfer.fsckObjects true
# reflogの保持期間を延長
git config gc.reflogExpire "90 days"
git config gc.reflogExpireUnreachable "30 days"
3. エイリアスの活用
# 便利なエイリアスを設定
git config --global alias.unstage 'reset HEAD --'
git config --global alias.undo 'reset --soft HEAD~1'
git config --global alias.recommit '!git add -A && git commit --amend --no-edit'
git config --global alias.backup '!git push backup --all && git push backup --tags'
トラブルシューティングのチェックリスト
問題が発生したら
-
状態を確認
git status git log --oneline -10 git reflog -10
-
エラーメッセージを読む
- エラーの内容を正確に把握
- 検索して解決策を調査
-
バックアップを作成
cp -r .git .git.backup git branch backup-$(date +%Y%m%d%H%M%S)
-
段階的に解決
- 一度に一つの問題を解決
- 各ステップで状態を確認
-
最終手段
- リモートから再クローン
- バックアップから復元
まとめ
Gitのトラブルシューティングは、経験と知識が重要です。主なポイント:
- 慌てない: ほとんどの問題は解決可能
- reflogは味方: 履歴は簡単には失われない
- バックアップ: 重要な作業前は必ずバックアップ
- 予防が大切: 適切な設定とワークフロー
これらの知識があれば、どんなトラブルも恐れる必要はありません。
次の最終レッスンでは、これまでの知識を統合した「チーム開発シミュレーション」を行います。