上一篇有提到, add 到暂存区的改动可以撤销,同样已经Commit的改动同样有可能有要撤销回退的状况。
暂存区回退
命令行:
git reset HEAD – filename
Git GUI 界面操作
1. 选中需要unstage的文件
2. 菜单 Commit–>Unstage From Commit
以上一篇的project 1的 file1.txt文件为例,
1. 改动文件: 新增一行:second Line
2. 添加到暂存区
3. 回退: git reset HEAD – file1.txt
从暂存区撤回,之前文件做过的修改还会保持。
Git reset
以上只是Git 撤销的一种用法, Git Rest有三种模式:
mixed - 默认
soft
hard
mixed 模式, 默认模式
git reset 如果不加其他参数或是加上 mixed使用的都是这种模式。
- 准备工作
将project1的file1文件提交三次, 使用:
git log –graph –one
命令查看一下提交记录 (单行,图形化显示)
D:\gitworkspace\project1>git log –graph –oneline
* c51c220 third commit
* 7e6fea3 second commit
* 6661de3 file1 add
修改文件,添加一行: four Line
并add 到暂存区。现在要回退到第二次提交
git reset –mixed 7e6fea3
这里的版本号也可以使用 HEAD^替代。(不过笔者的使用好像是有点问题)
HEAD指向当前版, HEAD^ 上一版, HEAD^^上上一版…
使用git show HEAD , HEAD已经指向第二次提交了。执行完成之后,变化如下:
- 暂存区的内容撤销了
- 工作区的文件没有变化, 也就是添加的那一行还在
- 使用git log 查看, 只有两条提交的记录了。
- 使用git diff 比较差异,版本库是使用第二版和本地文件进行比较。
删除第三行后, add后提交。再看一下log
D:\gitworkspace\project1>git log –graph –oneline
* db34463 four commit
* 7e6fea3 second commit
* 6661de3 file1 add
第三次的提交就从版本库中去掉了。
soft 模式
准备工作
在file1.txt 新增一行: five linegit add 到暂存区
- 执行: git reset –soft 7e6fea3
也就是回退一个版本。 执行完成之后:
- 暂存区的内容还在(不同与mixed 模式)
- 使用git diff –cached 比较一下暂存区与版本库的差别。
版本库使用的是回退的版本(与mixed相同)
D:\gitworkspace\project1>git diff –cached
diff –git a/file1.txt b/file1.txt
index 68d1742..80554e6 100644
— a/file1.txt
+++ b/file1.txt
@@ -1,2 +1,4 @@
first Line
-second Line
\ No newline at end of file
+second Line
+four line
+five line
\ No newline at end of file
提交更改
git commit -m “five commit”
6.看一下记录, 库中上一版的记录没有了。
git log –graph –oneline
hard 模式
准备工作
修改file1.txt , 新增 six Line, 并add到暂存区回退上一版,执行
git reset –hard 706fea3执行效果
- 缓存区内容没有了(与mixed同)
- 工作区的内容也被回退的版本替换了。
也就是说, 使用库的指定版本完全替换。
总结
git reset –soft : 不改变暂存区, 仅仅将Commit回退
git reset –mixed : 不改变工作区,覆盖暂存区
git reset –hard : 改变工作区,覆盖暂存区