Li Jiaheng's blog
1255 字
6 分钟
Git(3)·撤销与版本回退
2023-05-25

撤销命令速查#

按命令来说:

git restore file  
从暂存区拉取文件恢复工作区  
git restore --staged file  
从当前版本树中拉取文件,恢复暂存区,不动工作区!  
git checkout -- file  
从暂存区拉取文件恢复工作区  
git reset HEAD file  
从当前HEAD目录树中获取文件恢复暂存区,但不动工作区。  

关于git reset —soft/mixed/hard参考
但是这里面没有强调会丢失回滚范围中所有commit的问题。

所有“提交编号”中,HEAD^ 表示回退到上一个commit!  
  
git reset --soft 提交编号  
将HEAD重置为和提交编号时的状态一致,reset之前的HEAD中与转换到(提交编号)的目录树中的区别会放进暂存区,工作区不变。  
这同样会丢失回退到的提交编号与之前编号之间所有的提交,但是因为差异都放在了暂存区,所以可以根据需要仅删除不需要的修改,然后再次commit即可。因为一般只回退一个版本,所以没什么问题!  
git reset --mixed 提交编号  
将HEAD与暂存区重置为和提交编号时的状态一致,工作区不变。  
git reset --hard 提交编号  
将HEAD、暂存区、工作区都存为和提交编号一致,这会真正丢失提交编号到当前HEAD中的所有commit,真的会丢掉!  
 git reset --hard是真正完全回到了过去某个状态,期间的一切修改都丢了!  
不过也可以用git reflog 查看撤销,撤销撤销操作。  
  
git revert commit_id  
不会撤销刚才的提交,只是把之前版本拉过来,顺延为下一个版本(新建了一个)  

不小心错误 git reset --hard 之后,可以用 git reflog 查看完整的记录,找到想要回去的任意版本,用最前面那串数字为哈希值,再次 git reset --hard hash 即可!

关于git rm

git rm <file>  
把暂存区与工作区的这个文件删除。  
git rm --cached <file>  
把暂存区中的这个文件删除,但是不动工作区。  

  • 加了不想要的文件,删除它。

如果还没有add入暂存区,可以用 git clean <file> -f 清理没有被跟踪的工作区文件。应该可以直接在目录下 rm ?

如果已经add如入暂存区,用git rm --cached <file> 删掉暂存区中的某个文件。 git rm 表示删除成分,--cached选择暂存区。

不能直接修改版本库中HEAD的目录树内容,提交后暂存区和HEAD目录树一致,可以git rm --cached <file> 删除暂存区的相应文件后,再次提交为新版本。或者干脆回退!

  • 对一些文件做了不想要的修改,想撤回。

如果这个修改没有被add到暂存区git checkout -- <file> 用暂存区的文件替换掉工作区中的相应文件,相当于复原。
也可以用 git restore <file> 用暂存区的文件替换掉工作区文件(因为这个修改还没有加入暂存区)。

如果这个修改已经被add到暂存区git reset HEAD <file> 用版本库中当前版本的 file,替换掉暂存区的相应文件。相当于撤销了对这个文件的add。但工作区不变,需要进一步用git checkout等修改。 git reset HEAD 撤销对当前暂存区的一切修改,但同样不改工作区. 也可以git restore --staged <file> 撤回add。

  • 对于版本库操作,回退版本。

已提交,但没Push
git reset --soft <提交编号> 撤销刚才的提交,但不撤销 add。(是否可以省略编号?)版本号也许是跳到这个版本号,撤销刚才的提交,但不会撤销版本号之后的、刚才提交之前的提交。

git reset --mixed <提交编号>撤销提交与add。提交编号的意义与上面相同。

已push
git reset --hard <提交编号> 撤销并舍弃版本编号之后的所有提交。
git push -f 强制推送到远程。但是之前的所有提交都被覆盖。因为提交记录不一样了,所以只能强制push。

git revert <提交编号> 撤销提交编号的提交,但是保留提交记录。这时候相当于把前面的一个版本完整拿过来放到了下一个版本,可以直接Push。

可以用 git reflog 查看所有提交与撤销等。

git reset --soft commit_id 回退到之前版本,从记录中撤销刚才的提交。此时本地暂存区没变。  
git reset --hard commit_id 回退到之前版本,撤销从这个之前版本到刚才提交的所有提交。  
git revert commit_id 不撤销刚才的提交,把前面的版本复制过来成为下一个版本。  
  
只有提交记录覆盖了远程仓库才能直接Push,否则必须 git push -f,这很危险。  
Git(3)·撤销与版本回退
https://namisntimpot.github.io/posts/tools/git/撤销与版本回退/
作者
Li Jiaheng
发布于
2023-05-25
许可协议
CC BY-NC-SA 4.0