Git 本地倉庫管理

1 工作流程

首先需要說明的是,git的版本庫是以分支的形式進行管理的。當我們初始化一個新的版本庫時,會自動創建版本庫的第一個分支master,我們對本地倉庫的修改都是提交到這個master分支的。關于分支,后續會單獨介紹。

本地倉庫由git維護的三個組件構成:
1)工作區:文件系統中的文件目錄
2)stage\index(暫存區):緩存區域,保存需要提交到版本庫的文件(改動)
3)HEAD:這是一個指針,指向當前分支
上述stage以及HEAD保存在工作區中的.git/目錄中。
工作流程圖如下:

git工作流程

如上圖所示,當我們需要向版本庫中添加新的文件或者修改文件時的工作流程:
首先,使用git add指令將文件從工作區添加到stage中;
而后,使用git commit指令將stage中的所有內容提交到當前分支。

2 本地倉庫管理

接下來主要介紹如何對本地倉庫進行管理,其中包括:查看狀態、添加文件、提交文件、版本管理、撤銷修改、刪除文件等。

2.1 狀態查看

我們可以使用git status指令實時查看當前版本庫的狀態,然后根據當前的狀態進行后續操作,在日常使用過程中經常會用到這個指令,可以幫助我們實時掌握版本庫的狀態。
示例:
首先通過一下指令創建一個本地版本庫,并使用git status指令查看版本庫狀態:

$ git init MyGitTest    #創建本地版本庫
$ cd MyGitTest          #切換到版本庫的工作目錄
$ git status            #查看版本庫的狀態
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

2.2 添加文件到stage

指令格式: git add filename
添加方式有如下幾種:

$ git add README.md #僅添加README.md文件
$ git add *.py      #添加所有python文件
$ git add .         #添加當前目錄下的所有文件

示例:
MyGitTest版本庫中編輯README.md文件,添加如下內容:

a test for git

將該文件添加到stage,并查看版本狀態:

$ git add README.md
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

通過版本狀態信息,我們有如下兩個選擇:
1)使用commit指令將其提交到當前分支
2)使用提供的git rm --cached README.md指令將添加到stage中的README.md文件撤銷,或者使用git reset HEAD READM.md指令也可以實現對README.md文件的撤銷

2.3 將stage中的內容提交到當前分支

這里使用commit指令將stage中的內容提交當版本庫的當前分支,主要有如下幾種形式:

$ git commit -m "msg of commit" -a      #提交stage中所有內容
$ git commit -m "msg of commit"         #同上
$ git commit -m "msg of commit" filename    #僅提交filename文件
$ git commit --amend    #增補提交,還沒有用過

示例:
將2.2中的添加到stage中的README.md文件提交到版本庫的當前分支,并查看狀態

$ git commit -m "add README.md" README.md
[master (root-commit) 0e24ff7] add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ git status
On branch master
nothing to commit, working directory clean

2.4 撤銷修改

2.4.1 撤銷在工作區做的修改

當我們在工作區,對文件進行了修改,突然發現修改的內容有錯誤,這時候就需要將文件在工作區的修改進行撤銷。一般有如下兩種情況:
1)文件在修改后沒有add到stage區,撤銷之后文件狀態與版本庫保持一致
2)文件已經add到stage區,而后在工作區有對其進行了修改,此時撤銷工作區中文件的修改,文件和stage區中的狀態保持一致
撤銷指令如下:

$ git checkout -- README.md     #撤銷對文件README.md的修改
$ git checkout -- .             #撤銷對所有文件的修改
$ git checkout -- *.py          #撤銷對所有python文件的修改

示例:
修改工作區README.md內容,修改后的內容:

$ cat README.md
a test for git
test for git checkout -- README.md

撤銷對README.md文件的修改,并查看內容:

$ git checkout -- README.md
$ cat README.md
a test for git

2.4.2 撤銷add到stage中的內容

當我們對某些文件進行了修改,而且使用add指令將其添加到了stage區,突然發現這些修改中出現錯誤,這時我們需要將stage區中的文件撤銷回工作區。具體指令如下:

$ git reset HEAD README.md  #將stage區中的README.md文件撤銷回工作區
$ git reset HEAD            #將stage區中的所有文件撤銷回工作區

示例:
修改工作區README.md內容,修改后的內容,并將其添加到stage區,并查看狀態:

$ cat README.md
a test for git
test for git checkout -- README.md
$ git add README.md #添加到stage區
$ git status        #查看狀態
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   README.md
$ git reset HEAD README.md  #將文件從stage區撤銷會工作區
$ git status    #查看狀態,發現添加到stage中的README.md被撤銷回工作區,狀態恢復到add指令前
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:   README.md

特別注意
git status指令會幫助我們實時掌握本地版本庫(工作區、stage區)的狀態,同時會提示可以對當前狀態進行操作的指令。例如上述最后查看狀態,提示可以使用addREADME.md文件添加到stage或者使用checkout指令撤銷對README.md文件的修改

2.5 版本管理

之前提到過,git的版本庫是通過分支的形式進行管理的,本地版本庫默認的會創建一個master分支,如果不創建其他分支,基本上所有的操作都是在這個master分支上進行的。可以將分支看作是一個鏈表,每次使用commit指令提交代碼時,都會保存一個當前版本的"快照",可理解為創建一個新的版本節點,并將這個節點插入到當前的分支中,HEAD指針總是指向最新的版本節點。

2.5.1 查看版本日志

上面提到每次commit提交,都會保存版本"快照",并且會記錄到日志中,我們可以通過指令來查看日志中記錄的歷史commit記錄。
使用git log

$ git log
commit a65eebe8ae8c080ebd8eeab6ff12a89cfde52836
Author: zhoushuo19 <zhoushuo_19@yahoo.com>
Date:   Mon Dec 26 13:53:06 2016 +0800

    add push_email.py

commit 51857938f7f6ce6a3c241b9140e9434abbea6676
Author: zhoushuo19 <zhoushuo_19@yahoo.com>
Date:   Fri Dec 23 18:14:30 2016 +0800

    add test

commit 0e24ff732c00aaa6de8b79a7a6a3719f264b8964
Author: zhoushuo19 <zhoushuo_19@yahoo.com>
Date:   Fri Dec 23 17:46:08 2016 +0800

    add README.md

git log指令會顯示從最近到最遠的commit提交日志。
當前版本庫master分支如下圖所示:

版本庫結點

特別注意
日志中的commit字段后邊是一個長度為40的十六進制字符串,這個就是每次commit的版本號(SHA-1結果),每個版本號是唯一的,后續會介紹如何使用版本號來進行版本回退。
為了簡化日志的輸出,可以使用如下兩個指令:

$ git log --pretty=oneline
a65eebe8ae8c080ebd8eeab6ff12a89cfde52836 add push_email.py
51857938f7f6ce6a3c241b9140e9434abbea6676 add test
0e24ff732c00aaa6de8b79a7a6a3719f264b8964 add README.md
$ git log --oneline
a65eebe add push_email.py
5185793 add test
0e24ff7 add README.md

2.5.2 版本回退

當我們發現最近提交到版本庫中的內容有誤,需要將版本庫回退到之前某個版本時,就需要使用如下指令進行版本回退:

$ git reset --hard HEAD^    #回退到上一個版本
$ git reset --hard HEAD^^   #回退到上上個版本
$ git reset --hard HEAD~10  #回退到之前10個版本
$ git reset --hard 5185793  #回退到版本號開頭是5185793的版本

示例:
將之前版本回退一個版本:

$ git reset --hard HEAD^    #回退版本
HEAD is now at 5185793 add test
$ git log --oneline     #查看版本日志
5185793 add test
0e24ff7 add README.md

經過上述版本回退,版本庫如下圖所示:


版本回退

注意
版本回退速度非常快,這是因為在執行版本回退指令時,僅是將HEAD指針指向了要回退的那個版本上。

2.5.3 版本恢復

經過上面的版本回退,我們成功的將版本庫版本回退到了版本號為5185793的版本。這時我們可能需要將版本恢復到版本回退之前的版本也就是原來版本號為a65eebe的版本,查看版本日志,發現那個版本在版本日志中已經消失了,怎么辦?
可以使用指令git reflog來找到那個版本的版本號,這個指令記錄了執行過的每一條指令,如下所示:

$ git reflog
5185793 HEAD@{0}: reset: moving to HEAD^
a65eebe HEAD@{1}: commit: add push_email.py
5185793 HEAD@{2}: commit: add test
0e24ff7 HEAD@{3}: commit (initial): add README.md

這樣我們就可以將版本恢復了:

$ git reset --hard a65eebe
HEAD is now at a65eebe add push_email.py

2.6 刪除文件

首先,將工作區中的test文件刪除,而后查看狀態:

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

        deleted:    test

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

根據git status指令的提示,可以進行如下兩個操作
1)確定要刪除test文件,進行如下操作:

$ git rm test   #刪除文件
rm 'test'
$ git status    #查看狀態
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    test
$ git commit -m"remove test"    #提交刪除
[master 9f4007d] remove test
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test

2)誤刪,使用checkout恢復該文件

$ git checkout -- test
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念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

推薦閱讀更多精彩內容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,690評論 4 54
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,697評論 9 163
  • 那一片云彩 坐落在穹蒼處 從未有棲息的時候 那一株小草 坐落在陸地處 從未有棲息的時候 那一朵鮮花 坐落在草地處 ...
    Ling_00閱讀 131評論 2 4
  • 堅持是什么? 堅持是為了自己努力? 是為了讓自己有計劃? 這些都不算什么! 堅持是一種力量! 堅持是一種精神! 堅...
    李_昀倩閱讀 180評論 0 1