1. 暂存区概念
- 工作区(Working Directory)
通俗点来说,进行代码编写的文件都属于工作区。比如新建个项目,根目录为learngit
,learngit
文件夹就是一个工作区,然后我们会在learngit
项目创建文件、编写代码,这些操作都是在工作区进行的。
- 暂存区(Repository)
在工作区修改文件后,通过git add
命令,可以将修改添加到暂存区;但是执行git commit
命令后,会将暂存区清空。
- 版本库(Repository)
在learngit
目录下,通过git init
创建git本地仓库后,会多出一个隐藏目录.git
,.git
就是git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
我们把文件往Git版本库里添加的时候,是分两步执行的:
- 用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
2. Git添加修改到版本库
- 创建git本地仓库
//在合适的目录下创建learngit目录,在learngit目录下创建git仓库
$ git init
//创建文件
$ touch test.txt
//编辑test.txt文件,添加内容“Hello World”
$ vim test.txt
- 将文件添加到暂存区
git add test.txt
- 将修改提交到版本库
git commit -m "First commit"
3. 撤销工作区修改
对于test.txt
,经过不断的修改提交,已经有了一个稳定的版本,无需再进行修改。但是你不小心作了一点改动,在git add
之前,你发现了这个改动:
$ git status
//Changes not staged for commit:
// (use "git add <file>..." to update what will be committed)
// (use "git restore <file>..." to discard changes in working directory)
// modified: test.txt
此时,可以使用git diff
命令查看文件的修改:
//HEAD表示版本库的当前版本
$ git diff HEAD test.txt
//输出日志
//diff --git a/test.txt b/test.txt
//index e69de29..e965047 100644
//--- a/test.txt
//+++ b/test.txt
//@@ -0,0 +1 @@
//+Hello
git告诉我们,在test.txt
文件中增加了“Hello”,而我们是不需要这个改动的。幸好这时候还没有执行git add
命令,那么使用git checkout --
命令撤销修改就可以了:
$ git checkout -- test.txt
4. 撤销暂存区的修改
假设,对test.txt
文件修改后,并且执行git add
命令添加到了暂存区,这时候撤回修改:
//1.先执行 git reset HEAD filename,撤销暂存区的修改
$ git reset HEAD filename
//2.撤销工作区修改
$ git checkout --filename
5. 撤销commit
假设修改了test.txt
文件,并且执行git add
和git commit
命令,将修改提交到了版本库,这时候想回到上个版本,可以使用git reset --hard
命令:
$ git reset --hard HEAD^
在Git中,用HEAD
表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是
HEAD^^
。当然也可以不使用HEAD
,而是使用git的哈希值:
//查看提交记录
$ git log
//输出日志如下
commit 090650d054954b9bc48132e6b095f76791efc6c9 (HEAD -> main)
Author: aaa <aaa@aaa.com>
Date: Fri Jun 23 20:42:27 2022 +0800
修改test.txt
commit 168563df7667d6617e1cbe73a3201e4a5b9bf698
Author: aaa <aaa@aaa.com.cn>
Date: Fri Jun 22 20:04:15 2022 +0800
First commit
//这时候就可以使用git哈希值回到任一版本
$ git reset --hard 090650d054954b9bc48132e6b095f76791efc6c9
对于git reset
命令,有3种参数可选 --soft、--mixed、--hard:
- soft,
仅仅移动版本库HEAD指针,其他什么事都不做,即暂存区、工作区不会重置
- mixed
reset默认的,移动版本库HEAD指针,重置暂存区,但不重置工作区。就比如说你从当前版本回退到历史版本,你工作区更改的文件和代码都是不会变成历史版本的。
- hard
移动版本库HEAD指针,重置暂存区和工作区。 彻底回退到某个版本,本地的代码也会变为某个版本的内容,此命令慎用! 如果真要使用,建议先commit提交一份到本地库里,后悔再git reset回去
6. 总结
- 什么是暂存区?
项目目录可以看作是一个工作区,对项目中所有文件的修改都是在工作区进行;执行git add
命令后,会将修改的文件放到暂存区;执行git commit
命令后,会将修改的文件更新到版本库,同时清空暂存区内容。
- 不小心改乱了工作区内容,如何撤销?
$ git checkout -- filename
- 不小心改乱了工作区内容,并且执行
git add
命令添加到了暂存区,如何撤销?
//1.先执行 git reset HEAD filename,撤销暂存区的修改
$ git reset HEAD filename
//2.撤销工作区修改
$ git checkout --filename
- 已经提交了不合适的修改到版本库时,如何撤销?
$ git reset --hard commit_id
网友评论