本文主要來介紹一下 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 然後進行 修改 在提交前先將 提交到暫存區 提交到本地倉庫。本地倉庫中儲存修改的各...