• 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 指针指向提交历史线中的前一个提交状态,会连同我们刚才新建的文件一起全部撤销。这是一个比较危险的举动,使用的时候要注意场合。当然即使这么操作了也并非就不能复原了,只是会多几步操作而已。

    (全文完)


    本文作者 :phillee
    发表日期 :2021年3月30日
    本文链接https://www.cnblogs.com/phillee/p/14598437.html
    版权声明 :自由转载-非商用-非衍生-保持署名(创意共享3.0许可协议/CC BY-NC-SA 3.0)。转载请注明出处!
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

    感谢您的支持

    ¥ 打赏

    微信支付

  • 相关阅读:
    hrbustoj 2283 heap解题报告
    hrbustoj 2013 Play Game 2(博弈)
    hrbustoj 2130 一笔画(状态压缩)
    hrbustoj 1125 循环小数 II(小数变分数+极限思想)
    FZU 2170 花生的序列(动态规划)
    FZU 2168 防守阵地 I(前n项和的前n项和)
    FZU 2107 Hua Rong Dao(暴力回溯)
    FZU 2122 又见LKity(KMP+返回所有匹配位置)
    socket
    osi七层协议2
  • 原文地址:https://www.cnblogs.com/phillee/p/14598437.html
Copyright © 2020-2023  润新知