一、关于几个分区的理解
graph LR
工作区-->|git add|暂存区
暂存区-->|git commit| 版本控制(分支)
1.1 缓冲区
git add //将工作区修改的内容添加到暂存区
1.2 分支
git commit //将暂存区的内容放到分支上
二、git reset
三、以一个实际的场景来说明这三种方式的区别
1. 创建一个readme.txt
文件,并写入Hello World
touch readme.txt && echo 'Hello World' >readme.txt
2. 将readme.txt 添加到缓冲区
git add readme.txt
3. 将readme.txt 提交到分支上
git commit -m '第一次提交'
4. 修改readme.txt内容为Hello World git
echo 'Hello World git' > readme.txt
5. 再次提交
git commit -am '第二次提交'
6. 查看git日志
$ git log
commit da464edc6e7ed9768d619d1ea5b61cbcf0dc48c4 (HEAD -> master)
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 15:39:54 2019 +0800
'第二次提交'
commit d719960a7d3422280bdf749448caf79010bfdb3b
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 15:25:30 2019 +0800
'第一次提交'
7.执行回退操作git reset --soft
,并查看git状态发现文件只需要提交,不需要添加到暂存区中
$ git reset --soft d719960a7d3422280bdf749448caf79010bfdb3b
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
8. 查看文件 文件内容没有修改
$ cat readme.txt
'Hello World git'
9. git reset --soft
将HEAD指向指定回退的分支上,但是暂存区和工作目录没有发生修改,回到之前的状态,只需要再次commit这个文件就可以了
10. 将文件再次提交之后,查看git日志
$ git commit -m '第三次提交'
[master 832e7e7] '第三次提交'
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit 832e7e768ff99e740b64541d23cdb314db027f87 (HEAD -> master)
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 15:51:55 2019 +0800
'第三次提交'
commit d719960a7d3422280bdf749448caf79010bfdb3b
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 15:25:30 2019 +0800
'第一次提交'
11. 执行第二次回退操作git reset -mixed
,查看git 状态,因为mixed是git reset的默认模式,所以可以不添加mixed
$ git reset d719960a7d3422280bdf749448caf79010bfdb3b
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ cat readme.txt
'Hello World git'
12. git 状态告诉我们需要添加到缓冲区并提交,查看文件的时候文件的内容没有发生改变,说明暂存区发生了改变,文件目录没有发生改变,我们回复之前的状态,需要再次添加和提交
13. git reset --hard
进行回退操作
$ git log
commit df64e2f8ccdf46dca8c67f92829de3ec263555c8 (HEAD -> master)
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 16:02:48 2019 +0800
'第四次提交'
commit d719960a7d3422280bdf749448caf79010bfdb3b
Author: 吴哲 <wuzhe1159@163.com>
Date: Fri Nov 8 15:25:30 2019 +0800
'第一次提交'
D:\tmp\git_test (master -> origin)
$ git reset --hard d719960a7d3422280bdf749448caf79010bfdb3b
HEAD is now at d719960 '第一次提交'
D:\tmp\git_test (master -> origin)
$ git status
On branch master
nothing to commit, working tree clean
$ cat readme.txt
'Hello World'
14. 通过git状态和查看文件,发现文件目录已经发生改变,执行完这个命令,之前将之后的提交内容全部删除,这个命令改变内容幅度最大
四、总结
1.mixed
将HEAD指向需要恢复的commit上,暂存区和工作目录都不生改变
2.soft
只是将HEAD指向需要恢复的commit上,在分支上内容退回到暂存区,工作目录没有发生改变
3.hard
HEAD指向需要恢复的commit,全部恢复恢复的commit的样子,之前的commit全部删除