Skip to main content

撤回操作

撤回场景

场景一:工作区改动未 add 还原工作区修改

git checkout -- README.md

场景二:已 add 未 commit 还原工作区成 stage 但 stage 不变

git checkout -- README.md

场景三:已 add 未 commit 工作区不变撤销 stage(即撤销 add)

# 只撤销该文件的 add
git reset HEAD README.md

# 如果撤销 stage 暂存区所有的 add
# 撤销 stage 暂存区所有的 add
git reset HEAD

场景四:已 add 未 commit 还原工作区成最近一次 commit 的版本

# 这个相当于场景三和场景一的结合
git reset HEAD README.md
git checkout -- README.md

场景五:已 add 已 commit 将整个版本回退到上一次 commit 的版本且工作区保留最新代码

# reset 不带有模式默认就是 --mixed,表示保留工作区
git reset HEAD^

场景六:已 add 已 commit 将某个文件回退到上一次 commit 的版本且工作区保留最新代码

# 回退某个文件版本(其实本质上是无法回退一个文件的版本,因为版本是针对于整个仓库而言。该文件当前依旧是当前版本,该操作只不过是把该文件上一个版本的内容存进了现在的 stage 暂存区内罢了,同时工作区的代码保持不动)
git reset HEAD^ README.md

# 提交暂存区的代码,让文件变成上一个版本的模样,最终在结果上表现为该文件版本回退了,但是我们查看该文件的 log 信息,发现它的版本实际上是不减反增的
git commit -m "commit file"

场景七:已 add 已 commit 将整个版本回退成上一次 commit 的版本且工作区也被还原

# 整个场景可以与前面的前面的场景进行比较,我们发现都是要求还原成上一个版本,但是这个要求工作区的修改全部不保存在工作区中,也就是工作区也还原成上一个版本,这也是--mixed(默认可以不加)与--hard的区别所在,mixed 表示工作区的一切变动得到保留,hard 表示回退的很彻底,工作区和暂存区都被回退了,我们建议使用 mixed 默认方式,这样更保险!
git reset --hard HEAD^

场景八:已 add 已 commit 将整个版本回退到某次 commit 的版本且工作区保留最新代码

git reset [commit 版本号]

总结

当我们想要把工作区的内容还原成最近一版工作区我们可以使用 checkout 命令

git checkout -- [文件路径]

(注:一旦这个文件被 add 就表示工作区已经更新了一次,还原工作区只能还原成最新的那一版)

当我们想要对整个仓库进行版本回退我们可以使用 reset 命令

git reset [commit 版本号]

(注:强烈建议不用加 --hard,若还原成上一个版本,版本号用 HEAD^ 即可)

当我们想要对仓库某一个文件进行版本回退我们可以用 reset 操作单独文件,来将该文件的某次版本保存进当前 stage 暂存区中

git reset [commit 版本号] [文件名]
git commit -m "该文件变成以前的版本"

(注:本质上并不会回退,该文件依旧是当前版本,只不过某次版本存放在了 stage 暂存区中,我们下一步再 commit 即可让该文件变成以前的版本)

当我们想要对仓库某个文件 add 提交进行撤销,我们也可以用 reset [当前版本号] 的操作

git reset HEAD [文件名]

(注:不得不注意的是git reset [版本号]操作单独文件是比较特殊的,因为原则上单个文件不存在版本回退操作,但限于需求,若是想将该文件回退到以往的版本,此操作的结果是工作区保持不变,当前版本不变,当前 stage 暂存区变成目标版本;若版本号为当前版本 HEAD,此操作的结果是工作区保持不变,当前版本不变,当前 stage 暂存区清空,其实本质就是体现在 stage 区域是之前的版本还是被清空罢了)

相关指令

主要用到 git reset指令

  • --soft - 仅仅只是撤销已提交的版本库,不会修改暂存区和⼯作区
  • --mixed - 仅仅只是撤销已提交的版本库和暂存区,不会修改⼯作区
  • --hard - 彻底将⼯作区、暂存区和版本库记录恢复到指定的版本库

经常提交的时候会将一写大文件一起提交了,比如100mb的pdf文档,50mb的jpg大图等

# 使用 --soft 回退到对应的提交
git reset --soft xxxxxx

# 查看当前提交了些什么文件
git status

# 删除暂存区中的文件
git rm --cache *.pdf
git rm --cache *.jpg

# 重新提交
git commit -m xxxx

# 回到最新分支
git reset --hard

#

场景1

什么都还没提交,仅修改本地文件,想撤回某个文件或者所有修改

对应指令:

git 

场景2

仅仅进行了git add .

场景3

git add .git commit之后,将此次commit进行撤销,且保留当前硬盘的修改

操作代码:

git reset --soft HEAD~1