revert
git revert <commit>
生成一个撤消了commit
引入的修改的新提交,然后应用到当前分支。
commit
可以通过使用git log
来查看
revert
是提交一个 撤销了更改的 新提交,而不是从项目历史中移除这个提交。这会避免Git丢失项目历史,是一种比较安全的方式。
reset
git reset
重设暂存区,但不改变工作区,匹配最近的一次提交。
git reset --hard
重设暂存区和工作区,匹配最近的一次提交。--hard
会使git更改工作区中的文件。确定要扔掉本地的开发进度再使用。
git reset <commit>
将暂存区重设到这个提交,但不改变工作区。
所有commit
之后的更改会保留在工作区中,适用于重新提交更干净的项目历史。
git reset --hard <commit>
将暂存区和工作区都重设到这个提交。
git reset <file>
从暂存区移除某个文件,但不改变工作区。
reset 和 revert
git revert
可以针对历史中任何一个提交,而git reset
只能从当前提交向前回溯。比如,你想用 git reset 重设一个旧的提交,你不得不移除那个提交后的所有提交,再移除那个提交,然后重新提交后面的所有提交。
revert
被设计为撤销公开的提交的安全方式,reset
被设计为重设本地更改。
因为两个命令的目的不同,它们的实现也不一样:reset
完全地移除了一堆更改,而revert
保留了原来的更改,用一个新的提交来实现撤销。
查看之前的内容
检出提交
git checkout <commit>
使用checkout commit
可以便捷地将commit
加载到电脑上。
而且检出提交是一个只读操作,在查看其他commit
的时候不会对你当前的状态(比如master分支)产生影响。
在检出提交的时候,HEAD
直接指向检出的提交。而不是指向分支。(分离HEAD)
检出文件
git checkout <commit> <file>
会将工作区中的file
文件变成commit
中的那个文件,并将它加入暂存区。
这会对你当前的工作区中的文件产生影响。