编程教育资源分享平台

网站首页 > 后端开发 正文

Git学习笔记 003 Git进阶功能 part4 重置

luoriw 2024-01-31 12:28:57 后端开发 12 ℃ 0 评论

Git背后的三个文件集合

Git默认有三个文件集合,第一个是工作目录。也就是我们能看到的本地文件夹。第二个是索引(index)指向的缓冲区。第三个是HEAD指针指向的上一次成功commit后的文件集合状态。具体如下表:

一切在本地的针对Git的操作,都是在这三个文件集合间发生的。工作流程如下

为了完全展示reset的功能,新建立一个空的仓库作为示例

执行git init命令

$ git init

Initialized empty Git repository in C:/study/gitee/ResetTestRepository/.git/

确认状态

$ git status

On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

添加一个文件file.txt,此时的三个文件及和的状态如下

执行add命令,将file.txt文件添加到缓存区

$ git add file.txt

确认状态

$ git status

On branch master

No commits yet

Changes to be committed:

(use "git rm --cached <file>..." to unstage)

new file: file.txt

此时文件集合状态如下

执行commit命令,提交文件

$ git commit file.txt -m "1st commit"

[master (root-commit) 8547f17] 1st commit

1 file changed, 0 insertions(+), 0 deletions(-)

create mode 100644 file.txt

确认状态

$ git status

On branch master

nothing to commit, working tree clean

文件集合状态,8547f是第一次提交的SHA-1编码

修改工作目录的file.txt文件,看作v2版本

确认状态

$ 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: file.txt

no changes added to commit (use "git add" and/or "git commit -a")

再次添加进缓存

$ git add file.txt

确认状态

$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

modified: file.txt

文件集合

提交

$ git commit file.txt -m "2nd commit"

[master 86f4c3b] 2nd commit

1 file changed, 1 insertion(+)

确认状态

$ git status

On branch master

nothing to commit, working tree clean

86f4c是第二次提交的SHA-1编码

重复上述步骤,进行3次提交。之后的文件结合状态如下

确认一下提交的状态可知,现在HEAD指向了最新的提交

$ git log --oneline

0606a6e (HEAD -> master) 3rd commit

86f4c3b 2nd commit

8547f17 1st commit

到此位置,准备工作已经做完了。

第一步,移动HEAD指针

reset 命令所作的第一步是移动HEAD指针。和checkout命令不同,checkout命令是将HEAD指针移动到其他分支上。而reset是将HEAD指针移动到统一分支的其他版本上。

$ git reset --soft HEAD~

这里的~表示上一个版本。如果想直接reset到其他版本可以使用SHA-1编码

确认一下提交的状态, 发现HEAD指向了第二次提交

$ git log --oneline

86f4c3b (HEAD -> master) 2nd commit

8547f17 1st commit

此时的文件集合

本质上,这个命令是撤销了第三次提交。

第二步,更新索引

第一步执行之后,缓存区保存的信息还是第三次提交的。如果想把HEAD指针,和缓存区(索引)也返回到第二次提交的状态可以使用如下命令

$ git reset HEAD~

Unstaged changes after reset:

M file.txt

执行之后,提示有一个文件没有被add进缓存。

此时的文件集合

第三部,更新工作目录

如果想把工作目录也返回到第二次时的状态,则需要使用如下命令。

$ git reset --hard HEAD~

HEAD is now at 86f4c3b 2nd commit

回顾

  1. 若指定了 --soft,则执行上述第一步
  2. 若指定了 --mixed或者不指定参数,则执行上述第一步和第二步
  3. 若指定了 --hard或者不指定参数,则执行上述三步都会被执行

带有路径的重置

reset也支持重置某一个文件或者目录,可以使用如下命令

$ git reset 8547f17 -- file.txt

Unstaged changes after reset:

M file.txt

执行了这个命令,其实是从之前成功提交的版本中,将这个文件取回到了缓存区。这个命令和add命令正好是相反的。

reset某个文件之后,可以直接执行commit命令使其反映到最新的HEAD中。

合并提交

想把多次提交合并为一次提交,可以使用如下的命令组合。比如这时我添加了file2.txt文件,并且作为第五次提交。这时想把从第三次提交到第五次提交合并为一个新的提交

$ git reset --soft 86f4c3b

$ git commit -m "6th commit"

[master 376f50d] 6th commit

2 files changed, 1 deletion(-)

create mode 100644 file2.txt

确认状态发现,第三次到第五次已经全都默认删除了,只保留了合并后的第六次提交。

$ git log --oneline

376f50d (HEAD -> master) 6th commit

86f4c3b 2nd commit

8547f17 1st commit

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言