Git基礎知識之內部狀態管理系統

2022-07-18 02:39:13 字數 4200 閱讀 5729

本文主要來介紹一下 git 的內部狀態管理系統。它利用基於節點和指標的資料結構來跟蹤及管理編輯操作的時間線。

對本地專案而言,任一時刻,git 處於三種狀態中的一種:工作區狀態、暫存區狀態和提交區狀態。

下面利用新建專案來演示一下不同狀態及其轉換。

1. initialize the project

$ mkdir git_tree_test && cd git_tree_test

$ git init

$ 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

新建乙個測試檔案並利用該檔案進行不同狀態之間轉換的實驗。

$ 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指標指向提交歷史線中的前乙個提交狀態,會連同我們剛才新建的檔案一起全部撤銷。這是乙個比較危險的舉動,使用的時候要注意場合。當然即使這麼操作了也並非就不能復原了,只是會多幾步操作而已。

(全文完)

/cc by-nc-sa 3.0

¥ 打賞

git管理員基礎知識

感謝這位朋友提供的資料.正好學習到.關於git,之前也查閱了不少資料,迷迷糊糊的使用著一些命令。今天又時間把它整理一下,一方面強化自身的印象,另一方面,如果能對其他人有所幫助又能恰巧被看到的話,也算是一件快樂的事情。1.建立版本庫 方法一 mkdir mydir cd mydir git init ...

Git 基礎知識

2019 february 16 git簡寫 狀態說明 備註?untracked 未跟蹤此檔案在資料夾中,但並沒有加入到git庫,不參與版本控制,通過git add 狀態變為staged mmunmodified 已入庫未修改 如果它被修改,而變為modified,如果使用git rm移出版本庫,則...

git基礎知識

git歷史 略 git與svn對比 集中式版本控制工具缺點 git是分布式版本控制系統,分為兩種型別的倉庫 本地倉庫和遠端倉庫 git工作流程 工作流程如下 從遠端倉庫中轉殖 到本地倉庫 從本地倉庫中checkout 然後進行 修改 在提交前先將 提交到暫存區 提交到本地倉庫。本地倉庫中儲存修改的各...