🔧 第十五章:常见问题与排错 —— 救命锦囊
问题一:Detached HEAD(游离的 HEAD)
bash
# 场景:你 checkout 了一个具体的提交
git checkout a1b2c3d
Note: switching to 'a1b2c3d'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
# 别慌!Detached HEAD 只是说你没有在任何分支上。
# 如果你想在这个基础上开发,创建一个新分支:
git switch -c my-experiment
# 如果你只是想看看,切回正常分支就行:
git switch main💡 提示: Detached HEAD 本身不是错误!它在查看历史、调试旧版本代码时很有用。只有在 detached 状态下做了提交又没有创建分支,那些提交可能会"丢失"(其实 reflog 还能找到)。
问题二:合并冲突解不开
bash
# 如果冲突太复杂,不想解了,回到合并前的状态
git merge --abort
# 如果是 rebase 时的冲突
git rebase --abort
# 如果是 cherry-pick 时的冲突
git cherry-pick --abort问题三:"丢失"了提交
bash
# 场景:git reset --hard 之后发现还有东西需要
# 第 1 步:不要关闭终端!不要执行其他命令!
# 第 2 步:查看 reflog
git reflog
f4e5d6c HEAD@{0}: reset: moving to HEAD~1
d4e5f6a HEAD@{1}: commit: feat: 这个提交被 reset 了
f4e5d6c HEAD@{2}: commit: feat: 添加欢迎语
a1b2c3d HEAD@{3}: commit (initial): feat: 创建首页
# 第 3 步:找到丢失的提交
git show d4e5f6a
# 第 4 步:恢复
# 方式 A:直接 reset 回去
git reset --hard d4e5f6a
# 方式 B:创建一个新分支指向那个提交
git branch recovery d4e5f6a问题四:push 被拒绝
bash
# 场景:git push 被拒绝了
git push
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:xiaoming/网站.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally.
# 原因:远程仓库有你本地没有的提交
# 解决方式 1:先 pull 再 push(推荐)
git pull --rebase origin main
git push
# 解决方式 2:如果只是修改了旧提交需要强制推送
# ⚠️ 危险!只在自己的分支上使用!
git push --force-with-lease origin feature/my-branch⚠️ 注意: git push --force是危险操作,它会覆盖远程的提交。如果一定要强制推送,使用--force-with-lease,它会在远程有新的提交时阻止你覆盖——比--force多了一层安全网。
问题五:提交了不该提交的文件
bash
# 场景:不小心把 .env 文件提交了(里面有密码!)
# 第 1 步:从 Git 中移除(但保留本地文件)
git rm --cached .env
rm '.env'
# 第 2 步:添加到 .gitignore
echo ".env" >> .gitignore
# 第 3 步:提交这个修改
git add .gitignore
git commit -m "chore: 移除 .env 文件并添加到 gitignore"
# 第 4 步:如果已经 push 到远程,历史里还有!
# 需要用 git filter-branch 或 BFG 清理历史:
# 推荐使用 BFG Repo-Cleaner(更简单快速)
# java -jar bfg.jar --delete-files .env
# ⚠️ 重要:如果密码已经泄露,立即修改密码!
# 清理历史只是手段,更换密码才是根本。问题六:权限被拒绝(Permission denied)
bash
# SSH 方式的权限问题
git push
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
# 排查步骤:
# 1. 检查 SSH 密钥是否存在
ls -la ~/.ssh/
total 16
drwx------ 2 xiaoming xiaoming 4096 Jun 20 10:00 .
-rw------- 1 xiaoming xiaoming 411 Jun 20 10:00 id_ed25519
-rw-r--r-- 1 xiaoming xiaoming 102 Jun 20 10:00 id_ed25519.pub
-rw-r--r-- 1 xiaoming xiaoming 812 Jun 20 10:00 known_hosts
# 2. 测试 SSH 连接
ssh -T git@github.com
Hi xiaoming! You've successfully authenticated, but GitHub
does not provide shell access.
# 3. 如果连接失败,检查 ssh-agent 是否运行
eval "$(ssh-agent -s)"
Agent pid 12345
# 4. 添加密钥到 ssh-agent
ssh-add ~/.ssh/id_ed25519