git 多种撤销修改的场景

74 阅读3分钟

引言

最近在使用git 指令时,遇到了一些问题,特写此文记录一下。内容覆盖的范围包括:撤销提交的修改、删除所有未跟踪文件、删除本地修改等

git checkout

git checkout这个指令对于使用git 操作的伙伴肯定都是十分熟悉的了,在这之前我对它的了解一直是只限于切换分支

有一天,我突然遇到了想要将已被git跟踪并且修改的文件进行撤销操作的时候,我才发现,原来git checkout还有这功能~

git checkout -- 文件名:用于撤销对已跟踪文件的未提交修改

拓展

Git 2.23版本之后,git switchgit restore被用来代替某些git checkout的用法

  • git switch,更专注于分支切换的操作,不像git checkout功能繁杂
  • git restore,用于撤销对文件的更改,将指定文件还原到最近一次提交的状态

提示

git checkout --对于未跟踪的文件不会生效,因为它只能操作已经被Git跟踪的文件

git restore既可以用于撤销对已跟踪文件的未提交修改,也可以用于处理未跟踪文件

git clean

当你在工作区新增了一些文件,然后发现突然不需要了,这些文件是新增的,还并未被git跟踪,可以使用git clean指令来实现功能

# 删除文件
git clean -f

# 删除文件夹、文件
git clean -df

git reset

当执行git commit -m ""指令提交了当前的文件修改,但突然发现这些修改不需要了,如果你使用IDEA开发,那么可以直接图形化操作,但是现在需要通过指令来实现,直接通过git reset HEAD~来回退到上一个版本,如果要回退多个版本使用git reset HEAD~n

git reset用于将分支的指针移动到不同的提交。它可以在移动指针的同时修改暂存区和工作目录

提示:git commit这个命令用于将暂存区的内容提交为一个新的版本或提交

git revert

git revert用于创建一个新的提交,以撤销之前的提交。它不是移动指针,而是在历史中添加一个新的提交,该提交是前一个提交的逆操作

拓展

git stash

当在git pull代码存在冲突时,可以先git stash当前的修改,然后再git pull,pull 完代码后git stash pop将之前的修改恢复,这时再手动 merge 代码即可

趣事分享

当执行了git reset HEAD~指令后突然意识到自己没有commit(没有新增一个commit 版本),只是add了修改内容,然后你执行git status指令后便会惊奇地发现多了很多修改,代码回退到了上一个版本(但不是你以为的上一个版......),遇到这种情况不要慌张,有时脑子一抽很正常,但是脑抽后要保持冷静,好好思考一下操作后发生了什么事情

显而易见,工作区的代码回退到了push代码的版本,而你的目的就是保持上次已经push代码后的版本状态,当前本地的修改都不需要保留,那么就可以直接删除这些被git跟踪的已修改文件,重新pull一下,然后本地代码就和远程代码又保持一致了

提示:对于遇到这种情况的git操作,谨慎push,先冷静思考

小结

  • git checkout -- <file> 用于撤销对已跟踪文件的未提交修改
    • git switch 用于切换分支
    • git restore 用于撤销修改
  • git clean -f 用于删除工作目录中未跟踪的文件
  • git reset 用于回退到某个提交的操作,用于修改本地记录,不让该提交有历史保留
  • git revert 用于撤销某个提交的操作,撤销已经 push 的提交,历史记录不会改变,还会新增一个提交的历史记录