Git學習筆記四 Git版本控制原理

git 工作原理圖

image

如上圖所示,有三個區域Working Directory、stage、master。
名詞解釋:

工作區(Working Directory)

在我們直接編輯文件(文件夾)的根目錄,如下圖:

image

在G盤Git目錄下就是工作區

版本庫(Repository)

版本庫才是git正式工作的地方,在工作區下隱藏目錄里,如下圖:

image

版本庫主要包括兩個區,如上圖,包括“stage”和“master”。

  • master
    master區管理了我們每次提交后的文件版本以及相關信息,是git最重要的倉庫。在master區,有一個head指針(見圖1),指向最新提交的版本。
  • stage
    stage是工作區到master區的緩存區,在做小的修改時我們可以先提交到stage,確定沒有問題了,或者當天的工作完成了,再把緩存區的內容最終提交到master。

工作原理

上篇文章里講了命令行:git add、git commit
其中執行git add的時候,是把在“Working Directory”去修改(增加或刪除)的內容提交到“stage”

執行git commit之類的時候,把“stage”的內容最終提交到“master”區。

git status

命令行git status 能夠幫助我們快速的了解git的當前狀態。
例如,我們現在工作區新增一個test3.txt文件(先不要添加到版本庫),然后執行git status。

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test3.txt

nothing added to commit but untracked files present (use "git add" to track)

從上面的代碼我們可以看出,有在工作區新文件(test3.txt)待提交,但從stage區到master區沒有新內容提交。
所以根據上篇文章的知識,先用git add把test3.txt提交到stage。執行指令git add后,再使用git status查當前git狀態,如下代碼:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test3.txt

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   test3.txt


chenxi@chenxi_pc MINGW64 /G/Git (master)

從上面的的結果知道已經成功添加到status,準備好等待我們提交到master,執行git commit可以完成提交任務,如下圖:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add test3.txt file"
[master 39e0dba] add test3.txt file
 1 file changed, 1 insertion(+)
 create mode 100644 test3.txt

chenxi@chenxi_pc MINGW64 /G/Git (master)

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
nothing to commit, working directory clean

chenxi@chenxi_pc MINGW64 /G/Git (master)

版本回退

通過前面我們已經掌握了提交新版本,如果發現我修改錯了東西,怎樣返回新版本呢?
我們修改test.txt文件,添加新內容,如下:

image

執行git add、git commit指令,如以下代碼:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txt

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello world to test.txt"
[master 78db795] add hello world to test.txt
 1 file changed, 6 insertions(+), 1 deletion(-)

chenxi@chenxi_pc MINGW64 /G/Git (master)

再在上面的基礎上添加新內容,如下圖:

image

并提交:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git add test.txt

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git commit -m "add hello CSDN to test.txt"
[master 8f4ae6d] add hello CSDN to test.txt
 1 file changed, 2 insertions(+)

chenxi@chenxi_pc MINGW64 /G/Git (master)

好,現在我們使用log指令查一下我們都執行了哪些操作:

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:23:18 2017 +0800

    add hello CSDN to test.txt

commit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:15:46 2017 +0800

    add hello world to test.txt

commit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 19:36:40 2017 +0800

    add test3.txt file

commit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 17:43:55 2016 +0800

    add test1.txt and test2.txt files

commit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:13:05 2016 +0800

    add panoramaProjects folder

:...skipping...
commit 8f4ae6dc10a67a0a5726f449c6c65e288d39f57f
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:23:18 2017 +0800

    add hello CSDN to test.txt

commit 78db795dabdeb752d635ed2960b87ec49bb13943
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 20:15:46 2017 +0800

    add hello world to test.txt

commit 39e0dba93090a1f01887180e7bedbb7dda1fe5b3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Jan 13 19:36:40 2017 +0800

    add test3.txt file

commit 63d890ed08ee938dc4e83ad14446727dc9d55da3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 17:43:55 2016 +0800

    add test1.txt and test2.txt files

commit 489b113d392d1bc930f6eef1b6f0135d6bd6e0d3
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:13:05 2016 +0800

    add panoramaProjects folder

commit 664376a8783c533c90731dd00e4093d8bff9e97b
Author: chenximcm <1178898205@qq.com>
Date:   Fri Dec 30 12:10:09 2016 +0800

    add test.txt file
~
~

chenxi@chenxi_pc MINGW64 /G/Git (master)

好多啊,是不是覺得輸出太多信息了,沒事,我們可以把每次的信息只輸出精簡信息,我們只需要在git log 后面添加參數“–pretty=oneline”即可。

chenxi@chenxi_pc MINGW64 /G/Git (master)
$ git log --pretty=oneline
8f4ae6dc10a67a0a5726f449c6c65e288d39f57f add hello CSDN to test.txt
78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt
39e0dba93090a1f01887180e7bedbb7dda1fe5b3 add test3.txt file
63d890ed08ee938dc4e83ad14446727dc9d55da3 add test1.txt and test2.txt files
489b113d392d1bc930f6eef1b6f0135d6bd6e0d3 add panoramaProjects folder
664376a8783c533c90731dd00e4093d8bff9e97b add test.txt file

chenxi@chenxi_pc MINGW64 /G/Git (master)

是不是把目前不需要的信息都省掉了?每條信息只給出版本號跟我們添加的日志描述信息。如果你覺得最后一次操作有問題(添加的hello CSDN),想返回到前面的按個版本,怎么辦?

只需要執行指令:“git reset –hard HEAD^”

HEAD前面說過有個HEAD指針指向最新提交的版本,HEAD表示當前版本的前面那個版本,HEAD表示前前個版本,如果想返回前面第100個版本,是不是可以寫100個“”。

O(∩_∩)O哈哈~,讓我想起了以前小時候老師講的一個故事,一個小學生學習了中文的一、二、三,他就說后面的他都會了,就沒去上課,回家他老爸讓他寫一個萬字,他寫了一個下午。(小插曲)

當然上面的方法也可以,不過我們都沒那么蠢吧。我們可以使用HEAD~100代替。

image

如上圖,我們執行了git reset –hard HEAD^后,是不是返回到前面那個版本了“78db795dabdeb752d635ed2960b87ec49bb13943 add hello world to test.txt

再去查看一下我們的test.txt文件是不是也回到前面那個版本,如下圖:

image

慘了,我們前面那個版本了(add hello CSDN…),怎么辦?
不慌不慌,我們還可以通過前面的版本ID號返回去呢。版本號辣么長,我要暈了…放心,git不會這么麻煩的,你只需要輸入其中連續的幾個版本號字符就可以了(一般6位),這樣git就能辨別了。
如下圖:

image

又回來了,開不開心?O(∩_∩)O哈哈~!當然你也可以通過版本號返回到其他的版本。

image

在master去,有個HEAD指針,該指針指向當前的版本,返回到第n個版本就是通過修改HEAD指針的值實現,如上圖。

小結

  • git版本庫主要的三個工作區域工作區、stage、master。
  • git status查詢當前狀態
  • 通過git reset –hard HEAD^返回以前版本的信息
  • 通過git reset –hard 版本號返回版本號對應的版本
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容