这三条命令都是撤销命令
背景知识
- HEAD
这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交
- Index
index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit
- Working Copy
working copy代表你正在工作的那个文件集
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。
1.git reset --soft xxx
-
移动HEAD所指向的分支,使分支指向该提交,而不改变索引和工作目录,即此时的暂存区、工作目录与使用该命令前一致。如下:
git reset --soft <commit>
-
刚开始有三个commit,对应三个消息,然后我们创建一个READ.md文件添加上去,在添加消息"add READ".
1 -
用
2git log
命令显示当前分支的历史commit
-
显示工作区与HEAD指向的commit之间的差异'git diff HEAD'
- 然后我们使用
git reset --soft 02797b
命令,到消息为add d这个版本,然后在使用git diff HEAD
查看,发现HEAD指向的02797b这个commit跟我们的现在工作区的差异,我们的工作区比HEAD指向的版本多了一个READ.md文件
-
所以--soft参数告诉Git重置HEAD到另外一个commit,但也到此为止。如果你指定--soft参数,Git将停止在那里而什么也不会根本变化。这意味着index,working copy都不会做任何变化,所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中。
图片.png
2.git reset --hard xxx
移动HEAD所指向的分支,使分支指向commit,并用commit快照的内容更新暂存区、工作目录。--hard标记是reset命令唯一危险的用法,它会强制覆盖工作目录、暂存区中的修改。这也是Git会真正销毁数据的仅有几个操作之一。如下:
git reset --hard <commit>
-
用
2git log
命令显示当前分支的历史commit
-
用
3git reset --hard 02797
命令回到02797commit,用git diff HEAD
查看,发现HEAD指向的02797b这个commit跟我们的现在工作区没有差别。
-
所以--hard参数将重置HEAD返回到另外一个commit,重置index以便反映HEAD的变化,并且重置working copy也使得其完全匹配起来。这是一个比较危险的动作,具有破坏性,数据因此可能会丢失!
4
3.git revert
-
git revert
的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。
-
我使用
5git revert -n版本号
反做
-
这里可能会发生冲突,所以我
touch READ.md
,然后git add .
,然后git commit -m "revert"
-
最后的效果
7
网友评论