第 8 课:常见错误与解决方案

即使是经验丰富的开发者,也会经常遇到 Git 报错。

Git 本身并不可怕,大多数问题都有固定的原因和解决办法。

本课将学习开发中最常见的 Git 错误,以及对应的处理方案。


8.1 推送失败:Updates Were Rejected

这是新手最常见的问题。


执行:

git push origin main

报错:

! [rejected] main -> main (fetch first)

error: failed to push some refs

或者:

Updates were rejected because the remote contains work that you do not have locally.

为什么会出现?

假设:


远程仓库:

A → B → C

本地仓库:

A → B

同事已经提交:

C

但你本地没有。


此时直接:

git push

Git 会拒绝。


原因:

防止覆盖别人的代码

正确解决方案

先拉取:

git pull origin main

如果没有冲突:

git push origin main

即可。


流程:

git pull
     ↓
解决冲突(如果有)
     ↓
git push

错误示范

很多人直接:

git push -f

这是:

强制覆盖远程仓库

风险:

可能覆盖同事代码

企业项目中慎用:

git push --force

8.2 Pull 时产生冲突

执行:

git pull

出现:

CONFLICT (content)
Automatic merge failed

说明:

发生代码冲突

原因:

你和同事修改了同一位置。


例如:

同事:

String name = "Tom";

修改:

String name = "Jerry";

你修改:

String name = "Mike";

Git 无法判断保留谁。


解决步骤

打开冲突文件:

<<<<<<< HEAD

String name = "Mike";

=======

String name = "Jerry";

>>>>>>> main

手动修改:

String name = "Jerry";

或者:

String name = "Mike";

删除:

<<<<<<<
=======
>>>>>>>

标记。


提交:

git add .

git commit -m "解决代码冲突"

8.3 提交信息写错了

例如:

提交:

git commit -m "fix buggggg"

发现拼写错误。


修改最近一次提交:

git commit --amend -m "fix bug"

查看:

git log --oneline

即可看到新信息。


注意事项

如果已经:

git push

到远程。


修改后需要:

git push --force

团队开发时需谨慎。


8.4 不小心提交了不该提交的文件

例如:

.env

里面包含:

数据库密码

Redis密码

JWT密钥

结果:

git add .

git commit

提交了。


从 Git 中移除

执行:

git rm --cached .env

提交:

git commit -m "移除环境配置文件"

然后:

.env

加入:

.gitignore

以后不会再次提交。


8.5 删除文件但保留本地文件

普通删除:

git rm file.txt

效果:

Git删除

本地也删除

如果只想:

Git删除

本地保留

执行:

git rm --cached file.txt

8.6 想查看某个文件是谁写的

非常实用。


执行:

git blame UserService.java

输出:

a1b2c3d (张三 2026-06-01) public class UserService

b2c3d4e (李四 2026-06-02) login()

作用:

查看每一行是谁修改的

企业排查 Bug 高频使用。


8.7 想查看是谁删除了代码

查看历史:

git log -p 文件名

查看:

谁删了

什么时候删的

为什么删的

8.8 误删文件怎么办?

假设:

rm UserService.java

文件没提交。


恢复:

git checkout -- UserService.java

或者新版:

git restore UserService.java

恢复到最近一次提交状态。


8.9 提交后发现代码丢了

查看历史:

git log --oneline

找到正确版本:

a1b2c3d

恢复:

git reset --hard a1b2c3d

⚠️ 注意:

会丢弃当前未提交修改

8.10 查看所有操作记录

即使:

reset

删除分支

误操作

也能找回来。


查看:

git reflog

输出:

a1b2c3d HEAD@{0}

b2c3d4e HEAD@{1}

c3d4e5f HEAD@{2}

作用:

记录HEAD移动历史

堪称:

Git 后悔药

8.11 Git 最常见报错总结


远程领先:

Updates were rejected

解决:

git pull

git push

冲突:

CONFLICT

解决:

手动修改

git add

git commit

提交信息错误:

commit message wrong

解决:

git commit --amend

误提交文件:

git rm --cached

误删文件:

git restore 文件名

误回退:

git reflog

8.12 企业开发中的经验

不要轻易:

git push -f

不要直接修改:

main

提交前:

git diff

检查代码。


提交后:

git log --oneline

检查记录。


出现问题:

git reflog

先看历史。


大多数 Git 问题:

都能恢复

课后练习(必做)

练习 1:创建远程仓库

在 Gitee 或 GitHub 创建:

git-demo

空仓库。


练习 2:克隆项目

git clone 仓库地址

练习 3:创建 README

创建:

README.md

内容:

# 我的第一个 Git 项目

提交:

git add .

git commit -m "初始化项目"

推送:

git push origin main

练习 4:创建功能分支

git checkout -b feature/demo

修改:

这是功能分支的修改

提交:

git add .

git commit -m "添加功能分支内容"

推送:

git push -u origin feature/demo

练习 5:模拟 Pull Request

提交 PR。


合并到:

main

练习 6:同步主分支

git checkout main

git pull origin main

练习 7:删除功能分支

本地:

git branch -d feature/demo

远程:

git push origin --delete feature/demo

本课总结

掌握以下命令:


拉取并解决推送失败:

git pull

git push

修改提交信息:

git commit --amend -m "新的提交信息"

从 Git 中移除文件:

git rm --cached 文件名

查看文件责任人:

git blame 文件名

查看操作历史:

git reflog

恢复误删文件:

git restore 文件名

牢记:

遇到报错不要慌

先看提示

再查历史

绝大多数情况都能恢复

至此,你已经完成 Git 基础到团队协作的完整学习路线。

你已经具备:

  • 独立管理代码仓库
  • 团队协作开发
  • 分支管理
  • 冲突处理
  • Bug 修复
  • 问题排查

这些能力已经足以应对绝大多数校招、实习和中小型项目开发场景。