git的撤销操作:reset、checkout和revert

myshell

概述

这三个命令都可以用于撤销。

reset和checkout可以作用于commit或者文件,revert只能作用于commit。

commit级别的操作

reset

$ git checkout hotfix
$ git reset HEAD~2

git reset用于撤销未被提交到remote的改动,即撤销local的修改。除了移动当前分支的HEAD,还可以更改workspace和index:

  • --soft:修改HEAD,不修改index和workspace。

  • --mixed:修改HEAD和index,不修改workspace。默认行为。

  • --hard:修改HEAD、index、workspace。

git reset --mixed HEAD把index的内容退回到workspace中。
git reset --hard HEAD把index和workspace的修改全部撤销。

checkout

checkout作用于commit级别时,只是移动HEAD到不同的commit。如果有unstaged的文件,git会阻止操作并提示。如果使用commit id作为参数,可能会导致野指针。

revert

$ git checkout hotfix
$ git revert HEAD^^

revert通过新建一个commit来撤销一次commit所做的修改,是一种安全的方式,并没有修改commit history。

revert用于撤销committed changes,reset用于撤销uncommitted changes。

file级别的操作

reset

git reset <commit> <filename>只修改index去匹配某次commit。

git reset HEAD filename把文件从index退回workspace,并将更改保存在workspace中。

checkout

git checkout <commit> <filename>只修改workspace去匹配某次commit。

git checkout HEAD filename抹掉文件在workspace的修改。

总结

Command Scope Common use cases
git reset Commit-level Discard commits in a private branch or throw away uncommited changes
git reset File-level Unstage a file
git checkout Commit-level Switch between branches or inspect old snapshots
git checkout File-level Discard changes in the working directory
git revert Commit-level Undo commits in a public branch
git revert File-level (N/A)
阅读 13.6k

编程之路
记录成长
55 声望
2 粉丝
0 条评论
55 声望
2 粉丝
文章目录
宣传栏