Git基础知识之内部状态管理系统
本文主要来介绍一下 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基础知识之内部状态管理系统的更多相关文章
- Git基础知识与常用命令
一:相关概念: 1:工作区(Working Directory): 就是你在电脑里能看到的目录 2:版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. ...
- 3.Git基础-查看当前文件状态、跟踪新文件、暂存文件、忽略文件、提交更新、移除文件、移动文件
1.检查当前文件状态 -- git status git diff git diff --staged git status :我们可以使用 git status 来查看文件所处的状态.当运 ...
- git基础知识
Git的两大功能 1.协作开发 2.版本控制 版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都 ...
- Vue 2.0入门基础知识之内部指令
1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一 ...
- git基础知识总结
1,clone git clone https://github.com/KoMiles/helloword helloword 2,pull git pull 3,commit git commit ...
- git 基础知识
git 分布式版本控制系统 git三棵树: 工作目录 红色 等待添加到暂存区域 需执行git add filename 命令添加到暂存区 暂存区域 绿色 文件等待被提交 需执行 git commit ...
- git下的团队合作模型及git基础知识汇集
https://www.atlassian.com/git/tutorials/syncing/git-fetch Syncing svn使用单个中央库来作为开发者之间沟通的桥梁,而协同合作是通过在开 ...
- Django框架基础知识11-会话状态保持及表单
浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...
- Git基础知识 —— 获取Git仓库
前言 官方提供了两种获取Git仓库的方法,第一种是在本地现有项目目录下导入所有文件到Git中,第二种就是从Git仓库中clone项目到本地 这里就不说Git的安装了哈,有需要的小伙伴可以查看该博文:h ...
随机推荐
- Apple Support
Apple Support Send Files to Apple Support https://gigafiles.apple.com/#/customerupload refs 无法截屏 bug ...
- 使用 js 实现十大排序算法: 堆排序
使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...
- React render twice bug
React render twice bug React bug constructor render twice bug update render twice bug StrictMode htt ...
- W3C & 弹幕
W3C & 弹幕 弹幕用例规范 Draft Community Group Report 21 August 2020 refs https://w3c.github.io/danmaku/u ...
- Redux React & Online Video Tutorials
Redux React & Online Video Tutorials https://scrimba.com/@xgqfrms https://scrimba.com/c/cEwvKNud ...
- 比特币市场活跃,VAST发行在即!
截至1月25日13:30,BTC合约多空持仓人数比为1.44,市场做多人数占据优势:季度合约基差保持在1255美元上方,永续合约资金费率为正,交割及永续合约持仓总量为19.5亿美元,总体上多军占优:B ...
- PAA子公司在印度印度成立
近日PAA房产又有大动作啦!在一片期待中,印度分公司正式成立!这是集团继泰国.越南.韩国.上海.成都.中国香港.中国台湾等分公司成立之后的又一扛鼎力作,更是PAA集团全球化战略布局的重要举措. 印度分 ...
- Spring学习过程中遇到的No bean named 'beanId' is defined报错
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("bean.xml");Obje ...
- 保证软件开发过程遵循ISO 26262功能安全标准的十个主要进阶步骤
保证软件开发过程遵循ISO 26262功能安全标准的十个主要进阶步骤 为保障汽车软件质量,使软件开发符合ISO 26262功能安全标准,需要我们对开发流程做出改进,并与2018年的更新同步. 本视频课 ...
- vmware-install.pl 如何安装?
首先在虚拟机上安装vnware-tools工具,如图(工具为vmware workstation): 成功 但是系统屏幕大小并没有适应虚拟机,所以下边这行提示很重要. 打开左侧边栏的VMware ...