Git 本地倉庫管理

1 工作流程

首先需要說明的是棵帽,git的版本庫是以分支的形式進(jìn)行管理的括袒。當(dāng)我們初始化一個(gè)新的版本庫時(shí)官辈,會(huì)自動(dòng)創(chuàng)建版本庫的第一個(gè)分支master翘瓮,我們對(duì)本地倉庫的修改都是提交到這個(gè)master分支的贮折。關(guān)于分支,后續(xù)會(huì)單獨(dú)介紹资盅。

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

git工作流程

如上圖所示振峻,當(dāng)我們需要向版本庫中添加新的文件或者修改文件時(shí)的工作流程:
首先,使用git add指令將文件從工作區(qū)添加到stage中择份;
而后扣孟,使用git commit指令將stage中的所有內(nèi)容提交到當(dāng)前分支。

2 本地倉庫管理

接下來主要介紹如何對(duì)本地倉庫進(jìn)行管理荣赶,其中包括:查看狀態(tài)凤价、添加文件、提交文件拔创、版本管理利诺、撤銷修改、刪除文件等剩燥。

2.1 狀態(tài)查看

我們可以使用git status指令實(shí)時(shí)查看當(dāng)前版本庫的狀態(tài)慢逾,然后根據(jù)當(dāng)前的狀態(tài)進(jìn)行后續(xù)操作立倍,在日常使用過程中經(jīng)常會(huì)用到這個(gè)指令,可以幫助我們實(shí)時(shí)掌握版本庫的狀態(tài)侣滩。
示例:
首先通過一下指令創(chuàng)建一個(gè)本地版本庫口注,并使用git status指令查看版本庫狀態(tài):

$ git init MyGitTest    #創(chuàng)建本地版本庫
$ cd MyGitTest          #切換到版本庫的工作目錄
$ git status            #查看版本庫的狀態(tài)
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 .         #添加當(dāng)前目錄下的所有文件

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

a test for git

將該文件添加到stage君珠,并查看版本狀態(tài):

$ 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

通過版本狀態(tài)信息寝志,我們有如下兩個(gè)選擇:
1)使用commit指令將其提交到當(dāng)前分支
2)使用提供的git rm --cached README.md指令將添加到stage中的README.md文件撤銷,或者使用git reset HEAD READM.md指令也可以實(shí)現(xiàn)對(duì)README.md文件的撤銷

2.3 將stage中的內(nèi)容提交到當(dāng)前分支

這里使用commit指令將stage中的內(nèi)容提交當(dāng)版本庫的當(dāng)前分支策添,主要有如下幾種形式:

$ git commit -m "msg of commit" -a      #提交stage中所有內(nèi)容
$ git commit -m "msg of commit"         #同上
$ git commit -m "msg of commit" filename    #僅提交filename文件
$ git commit --amend    #增補(bǔ)提交材部,還沒有用過

示例:
將2.2中的添加到stage中的README.md文件提交到版本庫的當(dāng)前分支,并查看狀態(tài)

$ 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 撤銷在工作區(qū)做的修改

當(dāng)我們?cè)诠ぷ鲄^(qū)唯竹,對(duì)文件進(jìn)行了修改乐导,突然發(fā)現(xiàn)修改的內(nèi)容有錯(cuò)誤,這時(shí)候就需要將文件在工作區(qū)的修改進(jìn)行撤銷摩窃。一般有如下兩種情況:
1)文件在修改后沒有add到stage區(qū)兽叮,撤銷之后文件狀態(tài)與版本庫保持一致
2)文件已經(jīng)add到stage區(qū)猾愿,而后在工作區(qū)有對(duì)其進(jìn)行了修改鹦聪,此時(shí)撤銷工作區(qū)中文件的修改,文件和stage區(qū)中的狀態(tài)保持一致蒂秘。
撤銷指令如下:

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

示例:
修改工作區(qū)README.md內(nèi)容泽本,修改后的內(nèi)容:

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

撤銷對(duì)README.md文件的修改,并查看內(nèi)容:

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

2.4.2 撤銷add到stage中的內(nèi)容

當(dāng)我們對(duì)某些文件進(jìn)行了修改姻僧,而且使用add指令將其添加到了stage區(qū)规丽,突然發(fā)現(xiàn)這些修改中出現(xiàn)錯(cuò)誤,這時(shí)我們需要將stage區(qū)中的文件撤銷回工作區(qū)撇贺。具體指令如下:

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

示例:
修改工作區(qū)README.md內(nèi)容赌莺,修改后的內(nèi)容,并將其添加到stage區(qū)松嘶,并查看狀態(tài):

$ cat README.md
a test for git
test for git checkout -- README.md
$ git add README.md #添加到stage區(qū)
$ git status        #查看狀態(tài)
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   README.md
$ git reset HEAD README.md  #將文件從stage區(qū)撤銷會(huì)工作區(qū)
$ git status    #查看狀態(tài)艘狭,發(fā)現(xiàn)添加到stage中的README.md被撤銷回工作區(qū),狀態(tài)恢復(fù)到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指令會(huì)幫助我們實(shí)時(shí)掌握本地版本庫(工作區(qū)翠订、stage區(qū))的狀態(tài)巢音,同時(shí)會(huì)提示可以對(duì)當(dāng)前狀態(tài)進(jìn)行操作的指令。例如上述最后查看狀態(tài)尽超,提示可以使用addREADME.md文件添加到stage或者使用checkout指令撤銷對(duì)README.md文件的修改

2.5 版本管理

之前提到過官撼,git的版本庫是通過分支的形式進(jìn)行管理的,本地版本庫默認(rèn)的會(huì)創(chuàng)建一個(gè)master分支似谁,如果不創(chuàng)建其他分支傲绣,基本上所有的操作都是在這個(gè)master分支上進(jìn)行的掠哥。可以將分支看作是一個(gè)鏈表秃诵,每次使用commit指令提交代碼時(shí)龙致,都會(huì)保存一個(gè)當(dāng)前版本的"快照",可理解為創(chuàng)建一個(gè)新的版本節(jié)點(diǎn)顷链,并將這個(gè)節(jié)點(diǎn)插入到當(dāng)前的分支中,HEAD指針總是指向最新的版本節(jié)點(diǎn)屈梁。

2.5.1 查看版本日志

上面提到每次commit提交嗤练,都會(huì)保存版本"快照",并且會(huì)記錄到日志中在讶,我們可以通過指令來查看日志中記錄的歷史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指令會(huì)顯示從最近到最遠(yuǎn)的commit提交日志。
當(dāng)前版本庫master分支如下圖所示:

版本庫結(jié)點(diǎn)

特別注意
日志中的commit字段后邊是一個(gè)長度為40的十六進(jìn)制字符串构哺,這個(gè)就是每次commit的版本號(hào)(SHA-1結(jié)果)革答,每個(gè)版本號(hào)是唯一的,后續(xù)會(huì)介紹如何使用版本號(hào)來進(jìn)行版本回退曙强。
為了簡化日志的輸出残拐,可以使用如下兩個(gè)指令:

$ 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 版本回退

當(dāng)我們發(fā)現(xiàn)最近提交到版本庫中的內(nèi)容有誤,需要將版本庫回退到之前某個(gè)版本時(shí)碟嘴,就需要使用如下指令進(jìn)行版本回退:

$ git reset --hard HEAD^    #回退到上一個(gè)版本
$ git reset --hard HEAD^^   #回退到上上個(gè)版本
$ git reset --hard HEAD~10  #回退到之前10個(gè)版本
$ git reset --hard 5185793  #回退到版本號(hào)開頭是5185793的版本

示例:
將之前版本回退一個(gè)版本:

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

經(jīng)過上述版本回退溪食,版本庫如下圖所示:


版本回退

注意
版本回退速度非常快娜扇,這是因?yàn)樵趫?zhí)行版本回退指令時(shí)错沃,僅是將HEAD指針指向了要回退的那個(gè)版本上。

2.5.3 版本恢復(fù)

經(jīng)過上面的版本回退雀瓢,我們成功的將版本庫版本回退到了版本號(hào)為5185793的版本枢析。這時(shí)我們可能需要將版本恢復(fù)到版本回退之前的版本也就是原來版本號(hào)為a65eebe的版本,查看版本日志刃麸,發(fā)現(xiàn)那個(gè)版本在版本日志中已經(jīng)消失了醒叁,怎么辦?
可以使用指令git reflog來找到那個(gè)版本的版本號(hào)嫌蚤,這個(gè)指令記錄了執(zhí)行過的每一條指令辐益,如下所示:

$ 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

這樣我們就可以將版本恢復(fù)了:

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

2.6 刪除文件

首先,將工作區(qū)中的test文件刪除脱吱,而后查看狀態(tài):

$ 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")

根據(jù)git status指令的提示智政,可以進(jìn)行如下兩個(gè)操作
1)確定要?jiǎng)h除test文件,進(jìn)行如下操作:

$ git rm test   #刪除文件
rm 'test'
$ git status    #查看狀態(tài)
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恢復(fù)該文件

$ git checkout -- test
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末续捂,一起剝皮案震驚了整個(gè)濱河市垦垂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牙瓢,老刑警劉巖劫拗,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矾克,居然都是意外死亡页慷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門胁附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酒繁,“玉大人,你說我怎么就攤上這事控妻≈萏唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵弓候,是天一觀的道長郎哭。 經(jīng)常有香客問我,道長菇存,這世上最難降的妖魔是什么夸研? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮依鸥,結(jié)果婚禮上陈惰,老公的妹妹穿的比我還像新娘。我一直安慰自己毕籽,他們只是感情好抬闯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著关筒,像睡著了一般溶握。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒸播,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天睡榆,我揣著相機(jī)與錄音,去河邊找鬼袍榆。 笑死胀屿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的包雀。 我是一名探鬼主播宿崭,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼才写!你這毒婦竟也來了葡兑?” 一聲冷哼從身側(cè)響起奖蔓,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讹堤,沒想到半個(gè)月后吆鹤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洲守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年疑务,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗醇。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暑始,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婴削,到底是詐尸還是另有隱情,我是刑警寧澤牙肝,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布唉俗,位于F島的核電站,受9級(jí)特大地震影響配椭,放射性物質(zhì)發(fā)生泄漏虫溜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一股缸、第九天 我趴在偏房一處隱蔽的房頂上張望衡楞。 院中可真熱鬧,春花似錦敦姻、人聲如沸瘾境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迷守。三九已至,卻和暖如春旺入,著一層夾襖步出監(jiān)牢的瞬間兑凿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工茵瘾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留礼华,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓拗秘,卻偏偏與公主長得像圣絮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雕旨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git晨雳,從https:/...
    落魂灬閱讀 12,664評(píng)論 4 54
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,661評(píng)論 9 163
  • 那一片云彩 坐落在穹蒼處 從未有棲息的時(shí)候 那一株小草 坐落在陸地處 從未有棲息的時(shí)候 那一朵鮮花 坐落在草地處 ...
    Ling_00閱讀 130評(píng)論 2 4
  • 堅(jiān)持是什么行瑞? 堅(jiān)持是為了自己努力? 是為了讓自己有計(jì)劃餐禁? 這些都不算什么血久! 堅(jiān)持是一種力量! 堅(jiān)持是一種精神帮非! 堅(jiān)...
    李_昀倩閱讀 178評(píng)論 0 1