概述
这三个命令都可以用于撤销。
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) |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。