本文主要来介绍一下 Git 的内部状态管理系统。它利用基于节点和指针的数据结构来跟踪及管理编辑操作的时间线。

对本地项目而言,任一时刻,Git 处于三种状态中的一种:工作区状态、暂存区状态和提交区状态。

下面利用新建项目来演示一下不同状态及其转换。

1. Initialize the project

$ mkdir git_tree_test && cd git_tree_test

$ git init
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示: git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示: git branch -m <name>
已初始化空的 Git 仓库于 /Users/phillee/git_tree_test/.git/ $ git status
位于分支 master
尚无提交
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

这时我们初始化了一个本地项目,默认创建 master 分支,尚无文件跟踪及提交。

2. The Working Directory

$ touch reset_lifecycle_file

$ git status
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容) reset_lifecycle_file 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

现在我们为项目新增了文件 reset_lifecycle_file ,尚未提交,当前位于工作区(Working directory)。博客园代码显示系统太垃圾了,这时的 reset_lifecycle_file 应该是红色的,表示还没有被跟踪。

3. Staging Index

$ git add reset_lifecycle_file 

$ git status
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: reset_lifecycle_file

所有变动的文件,Git 都记录在一个区域,叫做"暂存区"(Staging index)。我们通过 git add 指令将工作区中的内容保存到暂存区,这时已经实现了对文件的跟踪,但还没有请求提交。这时候的文件已经被跟踪了,reset_lifecycle_file 应该是绿色的。

4. Commit History

$ git commit -m "init commit"
[master(根提交) 88b5382] init commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 reset_lifecycle_file $ git status
位于分支 master
无文件要提交,干净的工作区

暂存区保留变动的文件信息,等到修改结束添加到"提交历史"(Commit history)中,这就相当于当前项目的一个快照(snapshot)。

项目提交历史就是由不同时间的快照构成。Git 可以根据此提交信息将项目恢复到任意一个快照状态。

5. Reverse state switching

前面叙述并展示了三种状态之间的前向转换,现在我们反过来看一下,如何将当前状态转换成其父状态。

$ touch gitadd_test_file
$ vim gitadd_test_file

新建一个测试文件并利用该文件进行不同状态之间转换的实验。

  • i 键进入编辑模式;
  • 键入 Hello world!
  • esc 退出编辑模式;
  • shift+;进入命令编辑模式;
  • 键入x回车即可保存到文件并退出vim
$ git status
位于分支 master
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
gitadd_test_file 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) $ git add gitadd_test_file
$ git commit -m "add one file for test"
[master d97ee77] add one file for test
1 file changed, 1 insertion(+)
create mode 100644 gitadd_test_file $ git log --oneline
d97ee77 (HEAD -> master) add one file for test
88b5382 init commit

按步骤2-4的方式将新创建的文件添加到提交历史中。现在我们尝试将已经提交 commit 但尚未 push 到远端仓库的状态返回到暂存区状态。此时的gitadd_test_file为绿色。

$ git reset --soft 88b538
$ git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
新文件: gitadd_test_file

如上结果所示,这时已经处于 git commit 命令之前的状态,达到此结果使用的是 git reset --soft 指令。

该操作会保留文件的改动及索引状态,撤销完成后将回到添加改动的状态。注意与接下来要使用的 git reset --hard 之间的区别。此时的gitadd_test_file为绿色。

$ git restore --staged gitadd_test_file
$ git status
位于分支 master
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
gitadd_test_file 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

通过 git restore --staged 指令,我们得以将暂存区状态返回到工作区状态,也就是 git add 之前的状态。此时的gitadd_test_file为红色。

$ git add gitadd_test_file
$ git commit -m "add test file for git add test"
[master d535a57] add test file for git add test
1 file changed, 1 insertion(+)
create mode 100644 gitadd_test_file $ git log --oneline
d535a57 (HEAD -> master) add test file for git add test
88b5382 init commit
$ git reset --hard 88b538
HEAD 现在位于 88b5382 init commit
$ git status
位于分支 master
无文件要提交,干净的工作区

注意这里是将 gitadd_test_file 重新添加到暂存区,然后保存到提交历史中。从提交历史中的状态直接返回到 git add 之前的状态使用的指令是 git reset --hard ,该指令强制将 HEAD 指针指向提交历史线中的前一个提交状态,会连同我们刚才新建的文件一起全部撤销。这是一个比较危险的举动,使用的时候要注意场合。当然即使这么操作了也并非就不能复原了,只是会多几步操作而已。

(全文完)


span-dol { color: rgba(55, 126, 127, 1) }
span-red { color: rgba(205, 59, 82, 1) }
span-gre { color: rgba(84, 165, 89, 1) }

本文作者 :phillee

发表日期 :2021年3月30日

本文链接https://www.cnblogs.com/phillee/p/14598437.html

版权声明 :自由转载-非商用-非衍生-保持署名(创意共享3.0许可协议/CC BY-NC-SA 3.0)。转载请注明出处!

限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

.outter_box { text-align: center }
.button { background-color: rgba(83, 168, 73, 1); border: none; border-radius: 6px; color: rgba(255, 255, 255, 1); padding: 9px 24px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px }
.img_box { border: none; color: rgba(255, 255, 255, 1); text-align: center; vertical-align: middle }
.demo { width: 208px; height: 260px; margin: 0 auto }
.demo img { -webkit-filter: drop-shadow(2px 2px 5px rgba(0,0,0,.5)); filter: drop-shadow(2px 2px 5px rgba(0,0,0,.5)) }

感谢您的支持

¥ 打赏

微信支付

Git基础知识之内部状态管理系统的更多相关文章

  1. Git基础知识与常用命令

    一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...

  2. 3.Git基础-查看当前文件状态、跟踪新文件、暂存文件、忽略文件、提交更新、移除文件、移动文件

    1.检查当前文件状态 --  git status  git diff  git diff --staged   git status :我们可以使用 git status 来查看文件所处的状态.当运 ...

  3. git基础知识

    Git的两大功能 1.协作开发 2.版本控制 版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都 ...

  4. Vue 2.0入门基础知识之内部指令

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一 ...

  5. git基础知识总结

    1,clone git clone https://github.com/KoMiles/helloword helloword 2,pull git pull 3,commit git commit ...

  6. git 基础知识

    git 分布式版本控制系统 git三棵树: 工作目录 红色 等待添加到暂存区域 需执行git add filename 命令添加到暂存区 暂存区域 绿色 文件等待被提交 需执行 git commit ...

  7. git下的团队合作模型及git基础知识汇集

    https://www.atlassian.com/git/tutorials/syncing/git-fetch Syncing svn使用单个中央库来作为开发者之间沟通的桥梁,而协同合作是通过在开 ...

  8. Django框架基础知识11-会话状态保持及表单

    浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...

  9. Git基础知识 —— 获取Git仓库

    前言 官方提供了两种获取Git仓库的方法,第一种是在本地现有项目目录下导入所有文件到Git中,第二种就是从Git仓库中clone项目到本地 这里就不说Git的安装了哈,有需要的小伙伴可以查看该博文:h ...

随机推荐

  1. Flutter web & Flutter

    Flutter web & Flutter Google I/O 2019 recap & GDG shanghai flutter 与 Android 原生,应用应用,性能对比, d ...

  2. 2019 front-end job Interview

    2019 front-end job Interview 2019 前端面试题 掘金 https://juejin.im/tag/面试 https://juejin.im/post/5c875791e ...

  3. nasm astrset_s函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  4. Renice INC:法国葡萄酒为什么独占世界鳌头?

    提起葡萄酒,许多人首先想到的就是法国.法国有着悠久的酿酒历史和精湛工艺,"82年的拉菲"几乎成了大众认识葡萄酒的代名词.市面上的进口葡萄酒琳琅满目,原产国众多,意大利.西班牙.美国 ...

  5. 【HTB靶场系列】靶机Carrier的渗透测试

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...

  6. 微信小程序(二十)-UI组件(Vant Weapp)-02使用

    1.按钮使用 https://vant-contrib.gitee.io/vant-weapp/#/button 1.全局引入,在app.json中引入组件 "usingComponents ...

  7. Redis操作指南

    目录 Redis安装与使用教程 一.Redis介绍 1.redis安装 2.redis与mysql的异同 3.redis与memcache的异同 二.Redis操作 1.启动服务 2.密码管理 3.连 ...

  8. Django之csrf中间件及auth模块使用

    目录 一.基于配置文件的编程思想 1. importlib 模块 2. 配置文件 二.跨站请求伪造(csrf) 1.csrf简介以及由来 2.Django中的csrf中间件如何使用 2.1 普通for ...

  9. JUC-ThreadLocalRandom

    目录 Radndom类的局限性 ThreadLocalRandom 这个类是在JDK7中新增的随机数生成器,它弥补了Random类在多线程下的缺陷. Radndom类的局限性 在JDK7之前包括现在j ...

  10. sqlyog如何增删改查?

    转: sqlyog如何增删改查? 下面是一道完整的 sqlyog 增删改查的练习, 顺着做下去,可以迅速掌握. 1. 创建部门表dept,并插入数据: 2. 创建emp员工表,并插入数据: sql 代 ...