对于前端开发者来说,Git 是日常工作中最亲密的伙伴。无论是多人协作、版本回溯,还是部署上线,都离不开它的支持。然而,Git 的灵活也带来了不少“暗坑”——刚改好的代码不小心被覆盖、提交信息写错、分支混乱、合并冲突……几乎每个前端人都曾边改边查、边查边“挂”在搜索引擎上。
与其每次都临时 Google 浪费时间,不如提前掌握以下 10 个最常见的 Git 踩坑场景,并收藏这份速查表,让日常操作从此高效又安心。
1. 误把所有文件都 git add 了
场景:执行 git add . 后,发现 node_modules、dist 等不该跟踪的文件被加入暂存区。
解法:立刻用 .gitignore 排除文件,并执行 git rm -r --cached node_modules 将其从暂存区移除但仍保留在本地。之后再重新 add 需要的文件。
2. 提交后发现忘了加某个文件
场景:git commit -m "fix: 修改样式" 后意识到漏了 style.css。
解法:不要慌张。先 git add style.css,再执行 git commit --amend --no-edit,就能把新改动合并到上一次提交中,且无需修改提交信息。
3. 代码写在了错误的分支上
场景:在 master 上写了新功能,但本该在 feature/login 分支开发。
解法:使用 git stash 暂存当前工作区,然后切换到正确分支 git checkout feature/login,再 git stash pop 恢复代码。小技巧:git stash save "描述" 可以给暂存加备注。
4. 合并冲突时一脸懵
场景:git merge 后出现 <<<<<<< HEAD 标记,不知道如何解决。
解法:用 git merge --abort 回到合并前的状态。想保留冲突标记并手动修复?打开文件,删除标记和不需要的代码后保存,再 git add 和 git commit。可配合 VS Code 等可视化工具快速处理。
5. 想撤销工作区未提交的修改
场景:改了一堆代码但没提交,现在想全部撤回。
解法:对单个文件执行 git checkout -- <file>,用最新版本覆盖;如果已暂存,先 git restore --staged <file> 再恢复。统一撤回所有修改:git reset --hard HEAD(慎重!会丢失工作区改动)。
6. 想回退到之前的提交并删除之后的所有修改
场景:连续提交了 3 个错误 commit,想回到第 1 个 commit 的状态。
解法:git reset --hard HEAD~3 退回到前 3 个提交之前。⚠️ 注意:--hard 会彻底丢弃更改,如果已经 push 到远程,请用 git push --force(需团队协调)或用 git revert 更安全。
7. 误删分支后找不到 commit
场景:git branch -D feature 删除了一个未合并的分支,发现上面的提交很重要。
解法:用 git reflog 查看所有历史操作,找到被删分支的最后一个 commit hash,然后 git checkout -b feature <hash> 即可恢复。reflog 是 Git 的“后悔药”。
8. push 后才发现包含敏感信息或大文件
场景:不小心把 .env 或 100MB 的日志文件上传到远程仓库。
解法:若未公开,可用 git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch .env' 重写历史;更推荐使用 BFG Repo-Cleaner。注意:这会导致所有协作者强制拉取新历史,务必提前沟通。
9. 直接 git pull 导致本地未提交的改动被覆盖
场景:在本地改了代码没提交,执行 git pull 后提示冲突或自动合并覆盖。
解法:养成习惯——在 pull 之前先 git stash 或 git commit。如果已经冲突,用 git stash list 找回暂存内容。更优雅的方式:git fetch + git rebase,但同样要先处理本地变化。
10. 子模块(submodule)管理混乱
场景:克隆了一个包含子模块的项目,但子模块目录是空的,或子模块代码不是最新。
解法:克隆后执行 git submodule update --init --recursive 拉取所有子模块。想要更新子模块到最新:进入子模块目录 git pull,再回到主仓库提交变更。
速查表(收藏级)
| 问题 | 解决命令 |
|---|---|
| 误 add | git rm -r --cached + 更新 .gitignore |
| 补提交 | git add . + git commit --amend |
| 错分支 | git stash → git checkout 正确分支 → git stash pop |
| 合并冲突 | git merge --abort 或手动解决后 git add && git commit |
| 撤销工作区 | git checkout -- <file> 或 git restore <file> |
| 回退提交 | git reset --hard HEAD~n |
| 恢复分支 | git reflog → git checkout -b 分支名 <hash> |
| 清除历史大文件 | git filter-branch / BFG |
| pull 前保护 | git stash / git commit 先 |
| 子模块更新 | git submodule update --init --recursive |
写在最后
Git 的学习曲线确实有些陡峭,但绝大多数“坑”都有固定的套路可循。收藏这份速查表,当你下次再遇到类似问题时,不必再打开 Google 从头翻起——一秒定位,快速解决。希望这篇文章能帮你省下那些本应用来写代码的时间。毕竟,前端的世界里,还有更多有趣的事情等着我们去探索。