借用一句話:git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)。網(wǎng)上有非常多的文章介紹關(guān)于git命令的原理和使用。本文介紹一些基礎(chǔ)命令,適合新手學(xué)習(xí),高手請忽略:)

上面這個(gè)圖是很久之前畫的,在這兒重新搬出來。麻雀雖小五臟俱全,圖中包括了提交和撤銷提交的基礎(chǔ)命令。本文就結(jié)合這張圖學(xué)習(xí)下git基礎(chǔ)命令。
圖中包括了2條主線,一條是從左向右,即提交代碼,另外一條是從右向左,即回退代碼。為毛要有回退代碼呢?在提交的代碼的過程中,大部分情況下是順利的,但是仍有那么小部分情況沒那么順利,這個(gè)時(shí)候回退代碼就會派上用場。當(dāng)然對大部分開發(fā)者來說,最主要的還是提交代碼。
先介紹下本地倉庫和遠(yuǎn)程倉庫。所謂本地倉庫就是個(gè)人計(jì)算機(jī)上的倉庫,也就是我們直接編輯和修改代碼的倉庫。本地倉庫的創(chuàng)建方式有多種,可以由個(gè)人在本地創(chuàng)建,也可以從服務(wù)器克隆。大多數(shù)情況還是從服務(wù)器克隆,例如從github上clone一份代碼時(shí),其實(shí)就是將服務(wù)器上的遠(yuǎn)程倉庫拷貝了一份到本地來,形成了一份本地代碼倉庫,倉庫的信息在一個(gè).git文件夾中,默認(rèn)是隱藏的。遠(yuǎn)程倉庫就是服務(wù)器上的代碼倉庫。一般來說,開發(fā)流程是這樣的:首先在服務(wù)器上創(chuàng)建倉庫,開發(fā)者將遠(yuǎn)程倉庫clone到本地并行開發(fā),然后將本地修改的代碼通過本地倉庫推送到遠(yuǎn)程倉庫。下面就分分幾個(gè)部分看看git基礎(chǔ)命令。
1.本地倉庫和遠(yuǎn)程倉庫交互
兩個(gè)倉庫之間的交互無非就是兩個(gè)方面,一個(gè)是從遠(yuǎn)程倉庫更新代碼(git pull),另一個(gè)就是把本地倉庫的代碼推送到遠(yuǎn)程倉庫(git push)。這兩個(gè)命令是倉庫交互中用的最多的命令。
2.提交代碼
提交代碼,就是把本地修改的代碼提交到本地倉庫,完成這一步后,才能執(zhí)行g(shù)it push 將本地倉庫的代碼推送到遠(yuǎn)程倉庫。把圖1中的提交代碼主要流程摘出來,如圖2

圖中的方框表示狀態(tài)。
(1)修改本地文件(包括新建文件,編輯已有文件和刪除文件);
(2)命令行中執(zhí)行 git add 文件名(對于刪除文件,使用git rm 文件名);
(3)執(zhí)行g(shù)it commit,此時(shí)會彈出編輯器提示輸入描述;
(4)輸入這次提交代碼的簡要描述(便于查找)然后退出編輯器。
經(jīng)過上述4個(gè)步驟,2條git命令,就將本地修改的代碼提交到本地倉庫。順利的情況下,此時(shí)執(zhí)行 git status查看下本地倉庫的狀態(tài),會得到一個(gè)working directory clean 的提示。同時(shí)用git log命令可以看到剛才的提交記錄,提交記錄中有輸入的提交描述。這個(gè)時(shí)候使用git push 就可以將剛才修改的代碼推送到服務(wù)器,其他開發(fā)者更新代碼后就會看到你的提交了。
再看一下提交代碼過程中可能用到的命令:
(1)git status:這是一個(gè)經(jīng)常使用的命令,用于查看本地倉庫狀態(tài)。命令會列舉出本地修改(包括增加,編輯和刪除)的文件以及分別處于什么狀態(tài)。

(2)git diff :查看本地修改的代碼和原始代碼的差異。這個(gè)命令適用在修改階段,即修改了代碼之后、執(zhí)行g(shù)it add/rm 命令之前的階段。如果已經(jīng)處于暫存階段(執(zhí)行了git add/rm命令),只需加上參數(shù)--cached,即git diff --cached即可查看修改的詳細(xì)內(nèi)容。
(3)git commit --amend:補(bǔ)充提交。適用階段為在提交后(git commit)推送前(git push)。當(dāng)已經(jīng)完成了提交后,發(fā)現(xiàn)有文件不小心漏掉了,或者提交了之后發(fā)現(xiàn)提交描述寫錯(cuò)了,這個(gè)時(shí)候就可以使用git commit --amend命令進(jìn)行補(bǔ)充提交。
(4)git log:查看提交記錄。命令會列出本地倉庫中所有人的提交記錄,記錄中包括提交人,提交描述,日期和hash號等信息。如果要查看某次提交的詳細(xì)內(nèi)容,可用git log -p hash號或者git show hash號查看,其中hash號是在提交的過程中系統(tǒng)生成的40位長的字符串。
3.回退
這個(gè)是提交代碼的反向過程,如圖1中從右指向左側(cè)的箭頭所示。這一塊的操作都是在本地倉庫進(jìn)行的,不會對遠(yuǎn)程倉庫產(chǎn)生影響。
(1)從提交狀態(tài)回退
假如本地倉庫中最新的提交hash為a,然后我們在這個(gè)基礎(chǔ)上提交了一次hash為b。那么如下兩個(gè)命令含義為:
git reset --hard a:首先從倉庫中刪除b,強(qiáng)制代碼回退(同步)到a指向的位置,同時(shí)b的修改不會保留。
git reset --soft a:區(qū)別在于會保留a之后的修改,因此b的修改會保留下來(處于暫存狀態(tài))。
(2)從暫存狀態(tài)回退
git reset HEAD 文件名
(3)從修改狀態(tài)回退
git checkout 文件名
4.總結(jié)
提交過程:git add ,git commit
回退過程:git reset HEAD,git reset --hard/soft
在提交代碼的過程中,搞明白自己處于哪種狀態(tài),以及要到哪種狀態(tài),然后執(zhí)行相應(yīng)的命令即可。