文章目录
前言
前情提要:Git应用详解第三讲:本地分支的重要操作
git
作为一款版本控制工具,其最核心的功能就是版本回退,没有之一。熟悉git
版本回退的操作能够让你真真正正地放开手脚去开发,不用小心翼翼,怕一不小心删除了不该删除的文件。本节除了介绍版本回退的内容之外,还会介绍stash
的使用。
一、版本回退
在git
中永远有后悔药可吃,总是可以回到版本库的某一个时刻,这就叫做版本回退;
如上图所示:当前master
分支指针指向D
,通过版本回退可以使master
指向C
、B
或A
。进行版本回退的命令大体上有三种:reset
、revert
和checkout
。下面就来一一讲解:
Ⅰ.git reset
1.参数
reset
命令可以添加很多参数,常用的有--mixed
、--soft
和--hard
三种。下图为一次完整提交的四个阶段:
三个参数大体上的区别为:
--mixed
:为默认值,等同于git reset
。作用为:将文件回退到工作区,此时会保留工作区中的文件,但会丢弃暂存区中的文件;--soft
:作用为:将文件回退到暂存区,此时会保留工作区和暂存区中的文件;--hard
:作用为:将文件回退到修改前,此时会丢弃工作区和暂存区中的文件;
下面就来详细地讲解它们的使用方法:
首先在master
分支进行四次提交,每次提交在test.txt
中添加一行文本信息:
--mixed
该参数为默认值,作用为:将文件回退到工作区中:如下图所示,将test.txt
文件回退一次提交:
可以看到第四次提交对test.txt
的修改操作被回退到了工作区当中,并且保留了工作区中第四次提交对test.txt
所做的修改,所以工作区中的test.txt
文件内容与回退前一致。
--soft
该参数的作用为:将文件回退到暂存区中:如下图所示,将test.txt
文件回退一次提交:
可以看到第四次提交对test.txt
的修改操作被回退到了暂存区当中,并且保留了工作区和暂存区中第四次提交对test.txt
所做的修改,所以,工作区中的文件内容与回退前一致。
--hard
该参数的作用为:将文件回退到修改前:如下图所示,将test.txt
文件回退一次提交:
可以看到test.txt
直接回到了进行第四次提交前,此时删除了工作区和暂存区中第四次提交对test.txt
所做的修改。所以,工作区变得干净了,test.txt
文件内容回退到刚完成第三次提交时。
2.写法
为了方便演示reset
的各种使用方法,下面的指令都采用--hard
参数。
git reset --hard HEAD^
该命令的作用为回退一次提交:
回退后的状态为:
可以看到,该方法会同时改变了HEAD
和master
指针的指向;
git reset --hard HEAD^^
该命令的作用为回退两次提交:
回退后的状态为:
同样,使用--hard
参数回退,工作区是干净的;可以看到,该方法也会同时改变HEAD
和master
指针的指向;
git reset --hard HEAD~n
该命令的作用为回退n
次提交:
可以看到使用了--hard
参数,回退结果符合预期,并且该方法也会同步修改HEAD
和分支master
指针的指向。
注意:该方式只能向前回退,不能向后回退。
上述命令中的
HEAD
可以更换为分支名,比如master
:git reset --hard master~n
该命令表示将
master
分支回退n
次提交。由于HEAD
始终指向当前分支,所以使用分支名和使用HEAD
效果是一样的。
git reset --hard commit_id
**该指令的作用为回退到指定的commit id
的提交版本;由于commit id
是不会重复的,一般只需要写前几(6
)位就可以识别出来。通过commit id
的回退方式既可以向前回退,也可以向后回退。**如下所示,从1st commit
往后回退到4th commit
,其中4th commit
的commit id = bdb373...
。
为了熟悉该指令,我们分两种方式进行回退:使用--hard
参数与使用默认参数。
-
使用
--hard
参数从图中可以看出:通过第四次提交的
commit_id: bdb373
顺利地从第一次提交向后回退到了第四次提交,并且工作区干净。该方法也同时修改了HEAD
和分支master
的指向,具体过程为: -
使用默认参数
可以看到切换回了
4th commit
,但是工作区的test.txt
文件并没有变化;这是因为,在4th -> 1st
的过程中,需要在工作区中删除test.txt
文件中的2nd line、3rd line、4th line
。通过默认参数--mixed