Git撤销操作
Git 撤销操作
学习视频:十分钟学会常用git撤销操作,全面掌握git的时光机
初始状态
Disk
- Init
Staging(add)
- Init
Local-git(commit)
- Init
Remote-git(push)
- Init
情况一
仅对文件做了修改但未add, 想要返回到初始状态
状态如下
Disk
- Init — change
Staging(add)
- Init
Local-git(commit)
- Init
Remote-git(push)
- Init
想要删除此修改, 只需使用以下命令, <filename>
表示要恢复的文件名
1 | git checkout <filename> |
操作后恢复到原始状态
Disk
- Init~~ — change~~
Staging(add)
- Init
Local-git(commit)
- Init
Remote-git(push)
- Init
情况二
若文件已经add
状态如下
Disk
- Init — change
Staging(add)
- Init — change
Local-git(commit)
- Init
Remote-git(push)
- Init
- 若仅取消暂存, 可以使用下面的命令恢复
1 | git reset <filename> |
此操作仅会把文件重暂存区取出, 不会删除修改
操作后恢复到以下状态
Disk
- Init — change
Staging(add)
- Init~~ — change~~
Local-git(commit)
- Init
Remote-git(push)
- Init
- 若想要连修改一起撤回, 使用以下命令
1 | git checkout HEAD <filename> |
HEAD
表示最近的一次提交, 类似的HEAD~1
表示倒数第二次提交
情况三
更改已经提交, 也就是如下状态
Disk
- Init — change
Staging(add)
- Init — change
Local-git(commit)
- Init — change
Remote-git(push)
- Init
- 此时要想仅取消此提交不撤销更改, 使用以下命令
1 | git reset --soft HEAD~1 |
此时状态如下
Disk
- Init — change
Staging(add)
- Init — change
Local-git(commit)
- Init
—changeRemote-git(push)
- Init
- 若想要将暂存一起取消, 则不使用
--soft
参数, 即
1 | git reset HEAD~1 |
此时状态如下
Disk
- Init — change
Staging(add)
- Init
— changeLocal-git(commit)
- Init
—changeRemote-git(push)
- Init
- 若想完全回到上一次提交(本提交的前一次), 文件的修改也完全恢复到该次提交的状态. 使用以下命令
1 | git reset --hard HEAD~1 |
此时恢复到如下状态
Disk
- Init
— changeStaging(add)
- Init
— changeLocal-git(commit)
- Init
—changeRemote-git(push)
- Init
对于以上的恢复, 还有一种方式, 即在change
的基础上加一个-change
使文件在结果上恢复到上一次提交的状态
使用以下命令可以实现
1 | git revert HEAD |
效果如下
Disk
- Init — change —
-change
== InitStaging(add)
- Init — change—
-change
Local-git(commit)
- Init—change—
-change
Remote-git(push)
- Init
此命令还可以用于撤销之前的某一次提交的修改
例如, 当前状态如下
Disk
- Init — change1 —change2
Staging(add)
- Init — change1 —change2
Local-git(commit)
- Init — change1 —change2
Remote-git(push)
- Init
使用如下命令, 撤销change1
, <hash>
指要撤销提交的hash值
1 | git revert HEAD~1 |
达到如下效果
Disk
- Init — change1 —change2 —
-change1
Staging(add)
- Init — change1 —change2—
-change1
Local-git(commit)
- Init — change1 —change2—
-change1
Remote-git(push)
- Init
此命令在远程提交的撤销中起着重要作用, 见下文
情况四
修改已经push到了Github上
状态如下
Disk
- Init — change
Staging(add)
- Init — change
Local-git(commit)
- Init — change
Remote-git(push)
- Init — change
- 对于公有分支(不止一人使用该分支的情况), 只能使用
revert
1 | git revert HEAD |
恢复到如下状态
Disk
- Init — change —
-change
Staging(add)
- Init — change—
-change
Local-git(commit)
- Init—change—
-change
Remote-git(push)
- Init —change—
-change
- 对于个人分支,
reset
和revert
均可, 但若使用reset
恢复了提交, 在push时需要加上-f
1 | git push -f |
-f
表示强制, 在共有分支应避免使用, 或者禁止使用