撤销命令速查
按命令来说:
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。
- 对于版本库操作,回退版本。
已提交,但没Pushgit reset --soft <提交编号>
撤销刚才的提交,但不撤销 add。(是否可以省略编号?)版本号也许是跳到这个版本号,撤销刚才的提交,但不会撤销版本号之后的、刚才提交之前的提交。
git reset --mixed <提交编号>
撤销提交与add。提交编号的意义与上面相同。
已pushgit 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,这很危险。