常见问题 FAQ

基础

Git 常见问题 FAQ

❓ 最常被问到的问题

Q1: 冲突时,左边和右边哪个是我的代码?

A:

  • 左边(HEAD):你当前分支的代码(可能是你之前写的或之前拉取的)
  • 右边(Incoming):要合并进来的代码(通常是服务器上的新代码,别人提交的)

快速判断:

  • 看代码内容,哪个是你认识的、你写的
  • 看分支名称:>>>>>>> origin/main 表示服务器上的

Q2: 暂存区是什么?为什么需要它?

A: 暂存区是文件内容的快照(不是引用),作用是:

  1. 选择性提交 - 可以选择要提交哪些文件
  2. 预览内容 - 可以预览将要提交的内容
  3. 撤销操作 - 可以轻松撤销,不会影响工作区
  4. 分批次提交 - 可以分批次提交,保持清晰的提交历史

类比: 暂存区 = 照片(快照),不是镜子(引用)


Q3: Commit 和 Push 有什么区别?

A:

  • Commit = 保存到本地(你的电脑上的 .git 文件夹)
  • Push = 上传到服务器(GitHub/GitLab,其他人可以看到)

记住: Commit 是本地操作,Push 是远程操作!


Q4: 不 Pull 直接提交会怎样?

A: 可能的结果:

  1. 服务器没有更新:✅ 可以成功,但本地可能不是最新的
  2. 服务器有更新(不同文件):⚠️ 可能成功,但本地和服务器不同步
  3. 服务器有更新(同一文件):❌ 推送被拒绝,必须先 pull

最佳实践: 总是先 Pull,再 Push!


Q5: 如何删除暂存区中不想提交的文件?

A:

# 从暂存区移除单个文件(保留工作区修改)
git reset <>
 
# 从暂存区移除多个文件
git reset <文件1> <文件2>
 
# 清空整个暂存区
git reset

结果: 文件回到工作区,可以继续修改


Q6: Pull 后如何让本地代码变为最新?

A:

如果没有冲突:

  • ✅ 工作区自动更新为最新版本
  • ✅ 无需额外操作

如果有冲突:

  1. 解决冲突(编辑文件,删除冲突标记)
  2. git add <文件>(标记为已解决)
  3. git commit(完成合并)
  4. ✅ 工作区更新为最新版本

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

💡 关键理解

  1. Commit = 本地保存(你的电脑)
  2. Push = 远程上传(服务器)
  3. 暂存区 = 快照(照片),不是引用(镜子)
  4. 冲突 = Git 不知道如何自动合并
  5. Pull 前冲突可能在暂存区,Pull 后 Git 会清空暂存区,在工作区显示冲突标记

需要更多帮助?查看 快速解决方案完整指南