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/
目錄中律姨。
工作流程圖如下:
如上圖所示振峻,當(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)尽超,提示可以使用add
將README.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
分支如下圖所示:
特別注意
日志中的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