常见问题 FAQ
基础
Git 常见问题 FAQ
❓ 最常被问到的问题
Q1: 冲突时,左边和右边哪个是我的代码?
A:
- 左边(HEAD):你当前分支的代码(可能是你之前写的或之前拉取的)
- 右边(Incoming):要合并进来的代码(通常是服务器上的新代码,别人提交的)
快速判断:
- 看代码内容,哪个是你认识的、你写的
- 看分支名称:
>>>>>>> origin/main表示服务器上的
Q2: 暂存区是什么?为什么需要它?
A: 暂存区是文件内容的快照(不是引用),作用是:
- 选择性提交 - 可以选择要提交哪些文件
- 预览内容 - 可以预览将要提交的内容
- 撤销操作 - 可以轻松撤销,不会影响工作区
- 分批次提交 - 可以分批次提交,保持清晰的提交历史
类比: 暂存区 = 照片(快照),不是镜子(引用)
Q3: Commit 和 Push 有什么区别?
A:
- Commit = 保存到本地(你的电脑上的 .git 文件夹)
- Push = 上传到服务器(GitHub/GitLab,其他人可以看到)
记住: Commit 是本地操作,Push 是远程操作!
Q4: 不 Pull 直接提交会怎样?
A: 可能的结果:
- 服务器没有更新:✅ 可以成功,但本地可能不是最新的
- 服务器有更新(不同文件):⚠️ 可能成功,但本地和服务器不同步
- 服务器有更新(同一文件):❌ 推送被拒绝,必须先 pull
最佳实践: 总是先 Pull,再 Push!
Q5: 如何删除暂存区中不想提交的文件?
A:
# 从暂存区移除单个文件(保留工作区修改)
git reset <文件>
# 从暂存区移除多个文件
git reset <文件1> <文件2>
# 清空整个暂存区
git reset结果: 文件回到工作区,可以继续修改
Q6: Pull 后如何让本地代码变为最新?
A:
如果没有冲突:
- ✅ 工作区自动更新为最新版本
- ✅ 无需额外操作
如果有冲突:
- 解决冲突(编辑文件,删除冲突标记)
git add <文件>(标记为已解决)git commit(完成合并)- ✅ 工作区更新为最新版本
Q7: 如何删除已提交到远程的文件?
A:
方法 1: 正常删除(推荐)
git rm unwanted_file.txt
git commit -m "Remove file"
git push结果: 文件从当前版本删除,但仍在历史中
方法 2: 从历史中删除(危险)
git filter-repo --path unwanted_file.txt --invert-paths
git push --force --all警告: 会重写历史,非常危险!
Q8: 强制推送什么时候用?
A:
使用场景:
- ✅ 修正错误的提交信息(个人分支)
- ✅ 清理提交历史(个人分支)
- ❌ 永远不要在主分支使用!
安全方式:
git push --force-with-lease # 更安全Q9: 暂存区和工作区有什么区别?
A:
| 特性 | 工作区 | 暂存区 |
|---|---|---|
| 位置 | 项目文件夹 | .git/index 文件 |
| 作用 | 你正在编辑的文件 | 准备提交的文件 |
| 可修改 | ✅ 随时修改 | ⚠️ 需要 git add 更新 |
| 持久性 | 永久(除非删除) | 临时(提交后清空) |
记住: 暂存区是快照(照片),不是引用(镜子)
Q10: 冲突解决后,文件还在暂存区吗?
A:
Pull 后(有冲突):
- 工作区:有冲突标记
- 暂存区:被清空了
解决冲突后:
- 需要重新
git add <文件>添加到暂存区 - 然后
git commit完成合并
🎯 快速参考
冲突解决流程
1. git pull(发现冲突)
↓
2. 查看冲突文件(git status)
↓
3. 打开文件,解决冲突(删除标记,保留最终代码)
↓
4. git add <文件>(标记为已解决)
↓
5. git commit(完成合并)
↓
6. git status(确认完成)
日常工作流程
开始工作 → git pull
修改代码 → git add . → git commit
推送前 → git pull(再次拉取)
解决冲突(如果有)→ git push
💡 关键理解
- Commit = 本地保存(你的电脑)
- Push = 远程上传(服务器)
- 暂存区 = 快照(照片),不是引用(镜子)
- 冲突 = Git 不知道如何自动合并
- Pull 前冲突可能在暂存区,Pull 后 Git 会清空暂存区,在工作区显示冲突标记