メインコンテンツへスキップ
レッスン 14 / 15推定時間: 30

トラブルシューティング

よくあるGitのエラーと問題を解決する方法を学び、トラブルに対処できるようになりましょう

このレッスンの学習目標

  • よくあるGitエラーの原因と対処法を理解する
  • 壊れたリポジトリを修復する方法を学ぶ
  • データ復旧の手順を習得する

よくある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'

トラブルシューティングのチェックリスト

問題が発生したら

  1. 状態を確認

    git status
    git log --oneline -10
    git reflog -10
  2. エラーメッセージを読む

    • エラーの内容を正確に把握
    • 検索して解決策を調査
  3. バックアップを作成

    cp -r .git .git.backup
    git branch backup-$(date +%Y%m%d%H%M%S)
  4. 段階的に解決

    • 一度に一つの問題を解決
    • 各ステップで状態を確認
  5. 最終手段

    • リモートから再クローン
    • バックアップから復元

まとめ

Gitのトラブルシューティングは、経験と知識が重要です。主なポイント:

  1. 慌てない: ほとんどの問題は解決可能
  2. reflogは味方: 履歴は簡単には失われない
  3. バックアップ: 重要な作業前は必ずバックアップ
  4. 予防が大切: 適切な設定とワークフロー

これらの知識があれば、どんなトラブルも恐れる必要はありません。

次の最終レッスンでは、これまでの知識を統合した「チーム開発シミュレーション」を行います。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行