Git 问题大全:100个实际开发中最常见的错误与修复命令
问题: 不小心在 main 分支提交了功能代码。解决:解决:解决:解决:解决:解决:解决:解决:恢复:恢复:处理:解决:查看:解决:解决:解决:解决:原因: 远程比本地新。解决:解决:检查远程 URL:重新添加 SSH key。解决:警告: 会覆盖团队提交。命令:恢复:恢复: 如果有备
一、提交与回退类问题
1. 提交错了分支
问题: 不小心在 main 分支提交了功能代码。
解决:
git checkout -b feature/temp # 新建分支保存提交 git checkout main git reset --hard HEAD~1 # 删除错误提交
2. 提交信息写错了
解决:
git commit --amend -m "正确的提交信息"
3. 想撤销上一次提交,但保留代码
解决:
git reset --soft HEAD^
4. 想完全撤销上一次提交(包括文件)
解决:
git reset --hard HEAD^
5. 提交了不该提交的大文件
解决:
git filter-repo --path largefile.zip --invert-paths
6. 想撤销多个提交
解决:
git reset --hard HEAD~3
7. 想撤销已推送的提交
解决:
git revert <commit-id> git push origin main
8. 想只修改上一次的文件但不更改提交信息
解决:
git add . git commit --amend --no-edit
二、分支与合并类问题
9. 删除了错误的分支
恢复:
git reflog git branch restore <hash>
10. 误删远程分支
恢复:
git fetch origin git checkout -b feature/login origin/feature/login
11. 合并冲突
处理:
git status # 手动修改冲突部分 git add . git commit -m "解决冲突"
12. 想取消一次错误的合并
解决:
git merge --abort
13. 忘记合并哪个分支
查看:
git branch --merged
14. 合并后发现错误,想回退
解决:
git reset --hard HEAD@{1}
15. Rebase 后历史混乱
解决:
git rebase --abort git pull --rebase origin main
16. 分支改名
解决:
git branch -m old-name new-name git push origin :old-name new-name git push origin -u new-name
17. 想让本地分支跟踪远程分支
解决:
git branch --set-upstream-to=origin/dev dev
三、远程仓库与推送类问题
18. 推送时提示 non-fast-forward
原因: 远程比本地新。
解决:
git pull --rebase origin main git push origin main
19. 推送被拒绝:权限不足
解决:
-
检查远程 URL:
git remote -v -
重新添加 SSH key。
20. 推送错了分支
解决:
git push origin --delete main git push origin feature/login
21. 想强制推送本地历史覆盖远程
警告: 会覆盖团队提交。
命令:
git push origin main --force
22. 提交被覆盖或丢失
恢复:
git reflog git checkout <commit-id>
23. 想将本地所有分支同步到远程
git push --all origin
24. 拉取更新但不自动合并
git fetch origin
四、文件与暂存区问题
25. 想取消已暂存的文件
git restore --staged <file>
26. 想放弃对文件的修改
git restore <file>
27. 想还原文件到某个版本
git checkout <commit> -- path/to/file
28. 文件误删
git checkout HEAD -- <file>
29. 不小心删除 .git 目录
恢复: 如果有 .git 备份可恢复;否则项目无法继续版本控制。
30. 想忽略某类文件
创建 .gitignore:
__pycache__/ *.log node_modules/
五、Tag 与版本发布问题
31. 想删除远程标签
git push origin :refs/tags/v1.0
32. 想重命名标签
git tag new v1.0 git tag -d v1.0 git push origin :refs/tags/v1.0 git push origin new
33. 想查看标签对应提交
git show v1.0
六、冲突与协作问题
34. 冲突太多不想解决
解决: 保留当前版本
git merge --strategy-option ours
保留对方版本:
git merge --strategy-option theirs
35. 同步分支时遇到 “divergent branches”
git pull --rebase origin main
36. 提交后发现文件遗漏
git add . git commit --amend
37. 同时修改文件名和内容导致冲突
手动解决后执行:
git add oldname newname git commit
七、性能与仓库体积问题
38. 仓库太大
git gc --aggressive
39. 想删除历史中的大文件
git filter-repo --path file.zip --invert-paths
40. 想查看仓库体积最大文件
git rev-list --objects --all | sort -k2 | uniq -c | sort -nr | head
41. 想压缩对象包
git repack -ad
八、历史记录与追踪
42. 想查看文件的修改历史
git log --follow file.txt
43. 想查看谁修改了哪一行
git blame app.py
44. 想查找引入 Bug 的提交
git bisect start git bisect bad git bisect good v1.0
45. 想可视化历史
git log --graph --oneline --decorate --all
九、Rebase 与历史清理问题
46. rebase 过程中出错
git rebase --abort
47. rebase 完成后忘记 push
git push origin branch --force
48. 想合并多个提交
git rebase -i HEAD~3
49. 想修改老提交的信息
git rebase -i HEAD~5 # 将目标提交标记为 edit git commit --amend git rebase --continue
十、GitHub / CI 问题
50. Actions 构建失败
检查日志或手动触发:
gh workflow run deploy.yml
51. SSH 连接失败
解决:
ssh -T git@github.com
重新生成 key:
ssh-keygen -t rsa -C "you@example.com"
52. HTTPS 推送频繁要求输入密码
解决:
git config --global credential.helper store
53. 想切换 SSH 与 HTTPS
git remote set-url origin git@github.com:user/repo.git
十一、恢复与应急技巧
54. 找回被删除提交
git reflog git checkout <hash>
55. 恢复整个分支
git checkout -b restore <hash>
56. 查看当前 HEAD 指向
cat .git/HEAD
57. 游离 HEAD 恢复为分支
git checkout -b newbranch
58. 误删远程仓库文件
解决: 从其他开发者或备份恢复。
十二、安全与权限管理
59. 禁止强制推送主分支
GitHub 设置 → Branch Protection → 禁用 --force
60. 提交签名
git commit -S -m "安全签名提交"
61. 检查是否包含敏感信息
trufflehog git file://$(pwd)
十三、Hook 与自动化异常
62. pre-commit 无效
确保文件权限正确:
chmod +x .git/hooks/pre-commit
63. 想禁用 Hook
git commit --no-verify
十四、协作冲突场景(多人开发)
64. A 推送后 B 冲突
解决:
git pull --rebase origin main
65. A 删除文件但 B 修改了
解决:
手动恢复文件,然后重新合并。
66. 合并时大量文件无关变化
原因: 不同系统换行符
解决:
git config --global core.autocrlf false
十五、GitOps 与部署问题
67. 自动部署未更新
解决: 检查 YAML 中镜像标签是否随提交更新。
68. 回滚失败
argocd app rollback app-name --to-revision 3
69. CI/CD 触发条件错误
解决: 确认 on.push.branches 指定正确分支。
十六、底层修复与恢复
70. 发现 .git 文件损坏
修复:
git fsck --full git gc --prune=now
71. 丢失 HEAD 文件
手动恢复:
echo "ref: refs/heads/main" > .git/HEAD
72. 想查看所有对象
git rev-list --all
73. 想列出悬空对象
git fsck --lost-found
74. 想彻底删除历史提交
git filter-repo --force --invert-paths --path sensitive.txt
75. 想导出整个仓库为单文件
git bundle create project.bundle --all
十七、性能优化与大项目建议
76. 加快克隆速度
git clone --depth=1
77. 检查仓库状态
git count-objects -v
78. 合并大项目历史
git merge --squash
79. 批量删除旧分支
git branch | grep 'feature/' | xargs git branch -D
80. 清除缓存文件
git clean -fd
十八、日常效率技巧
81. 一行显示最后修改人
git log -1 --format='%an' -- <file>
82. 一行显示文件修改时间
git log -1 --format='%ai' -- <file>
83. 显示最近10次提交
git log -10 --oneline
84. 快速查看当前分支名
git rev-parse --abbrev-ref HEAD
85. 查找提交关键词
git log --grep "fix"
86. 临时保存当前工作
git stash
87. 恢复暂存内容
git stash pop
88. 删除所有 stash
git stash clear
89. 统计提交次数
git shortlog -s -n
90. 统计某人提交数
git shortlog -s -n --author="Alice"
参考案例:www.oicsi.cn
十九、常见错误信息与修复命令
| 错误信息 | 原因 | 解决命令 |
|---|---|---|
fatal: Not a git repository |
当前目录不在 Git 项目中 | cd 到正确路径 |
fatal: refusing to merge unrelated histories |
不同历史分支合并 | git merge --allow-unrelated-histories |
fatal: pathspec did not match |
文件路径错误 | 检查大小写与路径 |
error: Your local changes... |
有未提交修改 | git stash && git pull |
detached HEAD |
HEAD 游离状态 | git checkout -b newbranch |
二十、团队合作与预防建议
-
每次推送前执行
git pull --rebase; -
绝不在 main 上直接提交;
-
提交前运行本地测试;
-
代码合并必须经过 PR 审查;
-
每周清理无用分支;
-
定期执行
git gc; -
每个版本都打标签并记录 changelog。
更多推荐


所有评论(0)