git --- 回滚 restore, reset, revert
git revert
- git revert 是用于“反做”某一个版本,以达到撤销该版本的修改的目的
- 也就是git revert会生成一个新的commit, 而这个commit需要回滚的版本的内容是一样的
- 如下, 比如版本三的commit有问题, 需要进行版本回退, 则执行
git revert 版本二
这个命令, git会生成版本四, 而版本四的内容和版本二是一样的
Example
- 目前有一个greeting.txt文件, git 记录如图
- 使用
revert
恢复到最近一个commit之前的样子(commit 0343dc3)
- 查看git 记录以及greeting.txt的内容
- 注意: 如果要恢复到几个版本以前的状态, 尽量一个一个恢复, 避免冲突
- 比如要恢复到 fbc9245 之前的状态, 则先
revert 020cf2e --> revert 0343dc3 --> reevrt 2d73d74 ----> revert fbc9245
git restore
- git restore有两种用法
- 如果文件在工作区, 还没有被add进缓存区, 则
git restore
会直接丢弃目前工作区的更改- 如果文件在缓存区, 则需要使用
git restore --staged
将文件从缓存区移动回工作区
Example
git restore -- staged
- 现在有一个更改, 已经被加入进缓存区
- 使用
git restore --staged bar.txt
将文件移出缓存区, 放进工作区
git restore
- 使用
git restore
将工作区的代码丢弃, 恢复原状
Example: 恢复被删除的文件
git reset
git reset --soft
- 仅仅移动当前 Head 指针,不会改变工作区和暂存区的内容
- 之前commit的内容, 包括新增的文件,会被放进暂存区 (未commit)
Example:
- 现在工作区 有一个修改, 暂存区有一个修改
- git 记录如下
- 执行
git reset --soft HEAD~1
表示恢复到HEAD指针上一个版本- 暂存区和工作区的文件不会被改动, 仅仅是HEAD指针被移动了 而之前的commit (新加10.txt) 全部会被放进缓存区
- 注意此时的commit 10不会被丢弃,依然存在
- 如果在工作区或者缓存区的文件就是上次修改的文件,则会合并内容
- 10.txt 从modified变为 new file,但是内容没有被丢弃
git reset --mixed
- 移动当前 Head 指针
- 之前commit的内容会被放进工作区
- 目前缓存区的内容也会被放进工作区
- 新增的文件会变为untracked状态(也就是放进工作区)
Example
- 下面是mixed reset之前的状态
- 执行
git reset --mixed HEAD~1
- 原来在缓存区的 1.txt会被放进工作区,而原来的新文件10.txt会被变为untracked状态(放进工作区)
- 之前的commit内容 新文件 9.txt 也被直接变为untracked状态 (放进工作区)
git reset – hard
- 将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交,当前 HEAD 指针、工作区和暂存区内容全部改变
- 原有文件内容的变更 :修改内容丢失(修改的代码不会变成未add的状态)
- 目录结构的变更(增加或者删除文件):新增文件丢失、删除的文件相当于没删
Example
- 下面是hard reset之前的状态
- 执行 git reset --hard HEAD~1 之后,工作区和暂存区全部被清空,回到上一个commit
- 注意, commit 10不会被删除,依然存在