本文主要来介绍一下 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. what's the difference amount of pdf, epub, and mobi format

    what's the difference amount of pdf, epub, and Mobi format What is the difference between pdf, epub ...

  2. IM & WebSockets

    IM & WebSockets WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API ht ...

  3. PWA & bug

    PWA bug https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps https://learning.xgqfrms.x ...

  4. 如何在数据库中进行RBAC权限应用

    上周我们发了一篇关于"删库跑路"引发了大家对于数据安全的思考,而权限管理又跟数据安全密不可分.权限管理作为数据系统的重要组成部分,通过控制账号的可支配能力,防止因用户操作不当导致的 ...

  5. JMM内存模型相关笔记整理

    JMM 内存模型是围绕并发编程中原子性.可见性.有序性三个特征来建立的 原子性:就是说一个操作不能被打断,要么执行完要么不执行,类似事务操作,Java 基本类型数据的访问大都是原子操作,long 和 ...

  6. 《容器高手实战: Dockerfile最佳实践》

    Dockerfile最佳实践一个容器对应一个进程一个Docker容器应该只对应一个进程,也就是一个Docker 镜像一般只包含一个应用的制品包(比如.jar). 在需要组合多个进程的场景,使用容器组( ...

  7. Python 股票市场分析实战

    目标: 1.股票数据获取 2.历史趋势分析及可视化 3.风险分析 实验数据:来源于Yahoo Finance / Stooq,该网站提供了很多API接口,本文用的工具是pandas-datareade ...

  8. python进阶(2)python最常用的模块

    math math.ceil(a): 用来返回≥a的最小整数 math.floor(a):用来返回≤a的最大整数 round(a [,b]) 如果没有参数b,只有a,round()作用是四舍五入 如果 ...

  9. plsql连接oracle出现问题总结

    https://blog.csdn.net/yali1990515/article/details/46874511

  10. HashMap扩容后是否需要rehash?

    需要,因为要重新计算旧数组元素在新数组地址.HashMap在JDK1.8中的rehash算法(也就是扩容后重新为里面的键值对寻址的算法)进行优化.hash寻址算法是 index =(n - 1) &a ...