学习笔记——Git中比较容易犯错的指令

62 阅读3分钟

在之前的学习中,我对于git的一些基础命令有了基本的认识。但是在实际应用中,我却发现有些命令不是想象中的那么简单,在执行前需要谨慎,以下来做个总结

一、git reset 和 git revert

问题来源

• git reset:经常被误用,导致代码回退后丢失重要修改

• git revert:被误认为和 reset 功能相同,但它实际上是通过“撤销提交”的方式生成一个新的提交

区别

• git reset:直接修改历史版本,适合本地仓库清理,不推荐在团队协作中使用

• git revert:安全地在版本历史中添加撤销记录,适合协作开发

容易出错的场景

假设当前有三次提交:

A -> B -> C (HEAD)

若想回退到 B 的状态:

  1. 如果使用 git reset --hard B:

• HEAD 会指向 B,C 的提交记录会丢失

• 若没有备份或其他分支指向 C,则无法恢复

  1. 如果使用 git revert C:

• 会生成一个新的提交 C',用来撤销 C 的内容

二、git checkout 和 git switch

问题来源

• git checkout 是一个多功能命令,但正因为如此,它容易被误用。例如切换分支时,

git checkout <branch_name>

• 恢复文件时:

git checkout -- <file_name>

容易出错的场景

  1. 文件丢失问题

当你执行 git checkout -- 时,会直接用版本库中的文件覆盖当前工作区中的文件。这个操作是不可逆的,未保存的修改会丢失。

  1. 混淆分支切换和文件恢复

同一个命令既可以用来切换分支,又可以用来恢复文件,容易引起混乱

Git的新版本中引入了更明确的命令,故建议用以下更明确的命令:

• git switch:专用于分支切换

• git restore:专用于恢复文件

三、git pull

问题来源

git pull 是一个高频指令,用于同步远程仓库的更改到本地。但它实际上是 git fetch 和 git merge 的组合,直接拉取并合并代码,这可能导致冲突或意外覆盖

容易出错的场景

  1. 强行合并导致冲突

当远程分支和本地分支都有修改时,git pull 会直接尝试合并,若出现冲突,必须手动解决

  1. 历史记录被污染

如果团队多人协作,直接拉取并合并可能让主分支的提交记录变得凌乱

建议

  1. 使用 git fetch + git rebase 代替 git pull,避免合并提交:
    git fectch
    git rebase origin/main
    
  2. 如果习惯使用 git pull,建议添加 --rebase 参数:
    git pull --rebase
    

四、git push --force

问题来源

git push --force 是一个强制推送的命令,可以覆盖远程仓库的历史记录。在某些情况下会导致他人的工作成果丢失,因此需要谨慎使用。

容易出错的场景

  1. 覆盖远程分支

假设你的同事刚刚在远程分支上提交了一个新功能,而你本地的分支版本较旧。使用 git push --force 后,你的旧版本会覆盖远程的新版本,导致同事的工作丢失。

  1. 误操作导致团队数据丢失

在多人协作的项目中,强推可能会引起混乱,甚至无法恢复远程仓库的部分历史记录。

建议

  1. 使用 --force-with-lease 替代 --force

    git push --force-with-lease
    
  2. 在强推之前,始终备份或同步远程分支:

    git fetch origin
    git rebase origin/main