撤回操作
撤回场景
场景一:工作区改动未 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