<h2 id="toc_0">GIT</h2>
<p>首先必須說(shuō)明的是, 這篇文章不是闡述GIT原理性和比較深入的文章迂曲。只是對(duì)于日常開(kāi)發(fā)中比較常用的需求的總結(jié)和GIT
這些命令大體的原理解釋爆惧。所以掌握這個(gè)只能說(shuō)能夠應(yīng)付一定的開(kāi)發(fā)需求。但是如果你是個(gè)追求極值和完美的人落恼。應(yīng)該
再去了解下GIT具體的模型和實(shí)現(xiàn)細(xì)節(jié)箩退。需要說(shuō)明的是, 技術(shù)性東西,得先入門(mén)再深入理論佳谦,這很重要戴涝,入門(mén)可以讓你不斷
的進(jìn)行實(shí)踐,加深理解钻蔑,而不是紙上談兵啥刻,看著理論無(wú)從下手。<strong>GIT的應(yīng)用我們主要掌握GIT中團(tuán)隊(duì)開(kāi)發(fā)協(xié)助的常用命令和
場(chǎng)景</strong>咪笑。在這之前可帽,我們需要先介紹一些必備概念。</p>
<h3 id="toc_1">A窗怒、基本概念</h3>
<h4 id="toc_2"><strong>一映跟、Repository</strong></h4>
<p>repository, 使用過(guò)SVN的應(yīng)該都知道,這是版本庫(kù)扬虚。何為版本庫(kù)努隙,簡(jiǎn)單理解就是用來(lái)存儲(chǔ)和檢索數(shù)據(jù)的一個(gè)倉(cāng)庫(kù),只不過(guò)我們
用它來(lái)存儲(chǔ)代碼辜昵,來(lái)實(shí)現(xiàn)團(tuán)隊(duì)開(kāi)發(fā)中的代碼共享荸镊,以此來(lái)實(shí)現(xiàn)協(xié)同工作。簡(jiǎn)單的所就是用來(lái)保證堪置,一個(gè)軟件項(xiàng)目中的代碼同步躬存。</p>
<p>在GIT中的版本庫(kù)一般有兩個(gè), 一個(gè)是本地版本庫(kù),一個(gè)是服務(wù)器版本庫(kù)(共享版本庫(kù))舀锨。這是因?yàn)镚IT本身就是設(shè)計(jì)為非集中式(分布式)
版本控制器岭洲,其優(yōu)點(diǎn)就是,當(dāng)你沒(méi)有網(wǎng)絡(luò)的時(shí)候雁竞,你不用依賴(lài)于服務(wù)器版本庫(kù)(共享版本庫(kù))钦椭。想一下,你使用SVN的時(shí)候碑诉,
可以不用聯(lián)網(wǎng)嗎彪腔?如果希望一個(gè)項(xiàng)目交由GIT來(lái)管理,那么應(yīng)該再該項(xiàng)目所在的同級(jí)目錄中有一個(gè).GIT文件夾进栽,該文件夾里存放的就是
本地版本庫(kù)德挣,這時(shí)候,當(dāng)你沒(méi)有網(wǎng)絡(luò)的時(shí)候快毛,可以在本地進(jìn)行版本管理格嗅。再有網(wǎng)絡(luò)連接時(shí)候, 再將本地版本庫(kù)與共享版本庫(kù)進(jìn)行同步。</p>
<p>在GIT中唠帝,我們使用<code>git init</code>命令來(lái)創(chuàng)建初始化一個(gè)版本庫(kù)屯掖。其會(huì)自動(dòng)生產(chǎn).GIT文件夾和對(duì)應(yīng)的文件,這時(shí)候就能用GIT進(jìn)行版本管理襟衰。
<code>git init --bare</code> 用在(共享版本庫(kù)中)贴铜,因?yàn)樵诠蚕戆姹編?kù)中, 我們不需要工程文件夾(即工作空間), 因?yàn)楣蚕戆姹編?kù),相當(dāng)于一個(gè)存放
代碼的服務(wù)器瀑晒,不需要工作空間绍坝。</p>
<p>總而言之</p>
<pre><code>1.git init用在我們本地工作空間中需要進(jìn)行管理的項(xiàng)目中。
2.git init --bare用在創(chuàng)建共享版本庫(kù)苔悦,用來(lái)于本地版本庫(kù)進(jìn)行同步轩褐,實(shí)現(xiàn)多人開(kāi)發(fā)的版本庫(kù)。</code></pre>
<h4 id="toc_3"><strong>二玖详、工作區(qū)</strong></h4>
<p>所謂的工作區(qū), 就是你項(xiàng)目所在的文件夾里把介,都可以統(tǒng)稱(chēng)為工作區(qū)。</p>
<h4 id="toc_4"><strong>三竹宋、暫存區(qū)(stage劳澄、index)</strong></h4>
<p>該區(qū)域是用來(lái)保存要提交到本地版本庫(kù)中的所有文件, 稱(chēng)為stage或index。當(dāng)執(zhí)行<code>git commit</code>指令時(shí)候蜈七,會(huì)一次性將該區(qū)域類(lèi)的文件提交到
本地版本庫(kù)秒拔。可以理解為相當(dāng)于一個(gè)緩存區(qū)飒硅,用來(lái)緩存要交給本地版本庫(kù)管理的文件砂缩。而要將文件加入暫存區(qū)域,需要
使用git add指令進(jìn)行添加操作三娩。也就是說(shuō)要提交到本地版本庫(kù)需要兩步操作: <code>git add + git commit</code>庵芭。執(zhí)行完這兩條只是提交到了本地版本庫(kù),
只能自己來(lái)使用雀监,要是在團(tuán)隊(duì)開(kāi)發(fā)中双吆,要需要執(zhí)行g(shù)it push提交到共享版本庫(kù).</p>
<h4 id="toc_5"><strong>四眨唬、HEAD指針</strong></h4>
<p>簡(jiǎn)而言之,這里的HEAD指針就是一個(gè)用來(lái)標(biāo)識(shí)當(dāng)前所在的版本好乐。也就是我們是通過(guò)HEAD所指向的版本來(lái)確定
當(dāng)前所在的版本匾竿,所以當(dāng)我們進(jìn)行版本切換的時(shí)候,進(jìn)行的就是改變HEAD指針的指向蔚万。</p>
<h3 id="toc_6">B岭妖、基本操作</h3>
<h4 id="toc_7"><strong>一、增</strong></h4>
<p>由GIT的模型我們知道反璃,要交給本地倉(cāng)庫(kù)管理昵慌,我們必須先將其提交到stage中。再又stage提交到本地版本庫(kù)中淮蜈,我將這步操作歸納為增斋攀。以此來(lái)
于數(shù)據(jù)庫(kù)中的增概念類(lèi)比,方便學(xué)習(xí)梧田。所以我們這里所謂的增加細(xì)分而來(lái)個(gè)分為向stage中增加蜻韭,和向本地版本庫(kù)中增加。需要明確的是本地版本庫(kù)
的增, 是依賴(lài)于stage中的柿扣。具體的例子演示肖方。</p>
<p>由于我們要模擬多人開(kāi)發(fā),所以先完成以下的準(zhǔn)備工作未状。</p>
<h5 id="toc_8"><strong>準(zhǔn)備工作</strong></h5>
<p>1.創(chuàng)建一個(gè)SWPTest文件夾俯画,我們準(zhǔn)備在該文件夾中創(chuàng)建A用戶的工作空間,和共享代碼庫(kù)司草。</p>
<p>執(zhí)行如下操作</p>
<pre>
mkdir SWPTest
cd SWPTest/
mkdir AWorker sharedRep</code></pre>
<p>2.創(chuàng)建共享版本庫(kù)(模擬遠(yuǎn)程版本庫(kù))</p>
<pre>
cd sharedRep
git init --bare
</pre>
<p>3.用戶A將服務(wù)器上版本庫(kù)下載下來(lái)艰垂,準(zhǔn)備工作。并加入.gitigonre忽略文件(用來(lái)過(guò)濾掉項(xiàng)目中不提交給
版本庫(kù)進(jìn)行管理的文件)埋虹。(記得在SWPTest根目錄位置執(zhí)行命令)</p>
<pre>cd AWorder
git clone ../sharedRep/
touch .gitignore // 在工作區(qū)創(chuàng)建了.gitignore文件
open .gitignore
git add .gitignore // 執(zhí)行完這步, 將工作區(qū)的.gitignore文件提交到了暫存區(qū)(緩存區(qū))
git status -s // 查詢(xún)的是工作區(qū)與暫存區(qū)的文件狀態(tài)(文件狀態(tài)的理解是重點(diǎn))
git commit -m "添加gitignore文件" // 執(zhí)行完之后猜憎,一次性將暫存區(qū)的內(nèi)容提交到本地版本庫(kù)。此時(shí)暫存區(qū)清空搔课。
</pre>
<p>然后向.gitignore文件中粘貼object-c的忽略信息胰柑。(Github上搜索gitignore)</p>
<p>總結(jié):以上三小步,分別為服務(wù)器端的版本庫(kù)的創(chuàng)建(1,2), 與客戶端(3,)clone到本地(如果該工程沒(méi)有g(shù)itignore文件, 最好自己加上,
并添加到本地版本庫(kù)和服務(wù)端版本庫(kù)(共享版本庫(kù)))爬泥。</p>
增總結(jié)(三種不同的添加)
<pre>
1.向stage中增加(提交): git add <file> // <file>值的是要交給git管理的文件柬讨,上面第三步的最后一小步,就是stage添加
2.向本地版本庫(kù)種增加(提交): git commit // 基于stage緩存
3.向共享版本庫(kù)增加(提交): git push origin master // 將當(dāng)前的暫存區(qū)的所有數(shù)據(jù)提交到共享版本庫(kù)(遠(yuǎn)程版本庫(kù))
在執(zhí)行完上面3個(gè)小步驟時(shí)候袍啡,你也可以立即將該文件同步到共享代碼庫(kù)踩官,方便其它同事的使用。</pre>
<pr>git push origin master // 提交到主分支</pre>
<h4 id="toc_10"><strong>二境输、刪</strong></h4>
<p>在進(jìn)行刪除模擬前蔗牡,我們先做如下準(zhǔn)備工作颖系,創(chuàng)建a.m, b.m, c.m三個(gè)源文件。并準(zhǔn)備將其交給本地版本庫(kù)管理辩越。
所以進(jìn)行向stage添加操作集晚。具體如下</p>
<pre>suweipeng:sharedRep sixleaves$ touch a.m b.m c.m
suweipeng:sharedRep sixleaves$ git add *.m
suweipeng:sharedRep sixleaves$ git status -s
A a.m
A b.m
A c.m
suweipeng:sharedRep sixleaves$ </pre>
<p>當(dāng)查詢(xún)當(dāng)前暫存區(qū)的文件狀態(tài)的時(shí)候,會(huì)發(fā)現(xiàn)区匣,已經(jīng)變成A(第一欄表示暫存區(qū),第二欄表示工作區(qū))蒋院,表示已經(jīng)添加到暫存區(qū)域, 狀態(tài)為A(add)亏钩。接著我們開(kāi)始研究刪除。
通過(guò)模型欺旧,我們可以知道姑丑,git中又有三塊存儲(chǔ)文件的地方,分別是工作區(qū)辞友、暫存區(qū)(stage)栅哀、分支。<strong><font color = red>所以称龙,我們應(yīng)該
在學(xué)習(xí)之前就問(wèn)自己一個(gè)問(wèn)題留拾,如果有刪除操作,是針對(duì)哪塊區(qū)域的</font></strong>鲫尊。
我們通過(guò)具體操作來(lái)理解痴柔,如下(針對(duì)的緩存區(qū)和工作區(qū)一起刪除)</p>
<pre>
suweipeng:sharedRep sixleaves$ git rm a.m
error: the following file has changes staged in the index:
a.m
(use --cached to keep the file, or -f to force removal)
suweipeng:sharedRep sixleaves$ git rm -f a.m
rm 'a.m'
suweipeng:sharedRep sixleaves$ ls -al
total 8
drwxr-xr-x 6 sixleaves staff 204 7 21 16:43 .
drwxr-xr-x 3 sixleaves staff 102 7 21 11:34 ..
drwxr-xr-x 13 sixleaves staff 442 7 21 16:43 .git
-rw-r--r--@ 1 sixleaves staff 836 7 21 15:59 .gitignore
-rw-r--r-- 1 sixleaves staff 0 7 21 16:27 b.m
-rw-r--r-- 1 sixleaves staff 0 7 21 16:27 c.m
suweipeng:sharedRep sixleaves$
</pre>
<p>第一行的意思是將a.m這個(gè)文件從工作區(qū),并在暫存區(qū)響應(yīng)的文件中標(biāo)記刪除操作疫向。但是提示出錯(cuò)咳蔚,
根據(jù)提示,我們可以使用-f來(lái)強(qiáng)制執(zhí)行搔驼。</p>
<p>在Git 2.0中已經(jīng)支持一種更加容易理解的方式來(lái)進(jìn)行文件的刪除谈火。</p>
<p><strong>新方法:</strong></p>
<p>現(xiàn)在我們直接使用系統(tǒng)自帶的rm程序來(lái)刪除,而不使用git rm舌涨。
步驟如下</p>
<pre><code>1.使用rm刪除工作區(qū)的文件糯耍。
2.使用git add <刪除的文件名>將工作區(qū)的刪除添加到暫存區(qū)。(刪除工作區(qū)囊嘉、暫存區(qū)中指定的文件)
3.使用git commit -m "刪除文件b"谍肤。將文件從本地倉(cāng)庫(kù)中刪除。(刪除工作區(qū)哗伯、暫存區(qū)中件荒揣、本地版本庫(kù)指定的文)
4.使用git push origin master. 則這時(shí)候,不僅可以將本地版本庫(kù)中的文件刪除焊刹,同時(shí)也將共享版本庫(kù)中的文件刪除系任。((刪除工作區(qū)恳蹲、暫存區(qū)中件、本地版本庫(kù)俩滥、共享版本庫(kù)指定的文件)嘉蕾。</code></pre>
<p><font color = red>也許你會(huì)想問(wèn),那么如果是已經(jīng)提交到本地版本庫(kù)中的文件呢霜旧?只是想將其從本地版本庫(kù)中刪除</font>错忱,是不能用這種新方法的,因?yàn)檫@種方法的前提你要?jiǎng)h除工作區(qū)間的文件挂据,并且讓版本庫(kù)中的也刪除以清。那么如何應(yīng)對(duì)這種需求,請(qǐng)看下面崎逃。</p>
<p><strong>git rm剖析</strong>:
此時(shí)我們來(lái)驗(yàn)證git rm的作用區(qū)域掷倔,在驗(yàn)證的時(shí)候,我這邊只剩下一個(gè)e.m文件个绍,并且已經(jīng)交給git管理勒葱。
此時(shí)再重新創(chuàng)建b.m與c.m并將其交給git管理。</p>
<p><strong>具體分析:</strong>
首先怎么驗(yàn)證所git rm -f a.m刪除的是這兩個(gè)區(qū)域的呢巴柿?如果一個(gè)文件已經(jīng)提交到版本庫(kù)中凛虽,那么此時(shí)在使用該操作會(huì)不會(huì)影響版本庫(kù)呢?答案是否定的广恢,它只影響暫存區(qū)和工作區(qū)涩维,也就是所只刪除這兩個(gè)區(qū)域的元素。驗(yàn)證思路很簡(jiǎn)單袁波,我們創(chuàng)建一個(gè)文件z.m,然后將其提交給本地版本庫(kù)進(jìn)行管理瓦阐,在提交的后,暫存區(qū)就清空了篷牌,所以此時(shí)只剩下版本庫(kù)和工作區(qū)又這個(gè)文件睡蟋,此時(shí)我們執(zhí)行g(shù)it rm,接著在同步到共享版本庫(kù)枷颊,再另外一個(gè)員工的工作目錄中clone下共享版本庫(kù)戳杀,查看是否存在z.m。如果存在z.m夭苗,那么也就是所git rm是不會(huì)影響版本庫(kù)的中已經(jīng)存在的文件信卡。</p>
<p>在AWorker的工作空間中,此時(shí)AWork的暫存區(qū)存在兩個(gè)文件题造,將其提交到本地版本庫(kù)中進(jìn)行管理傍菇。并同步到共享版本庫(kù)中。接著我們刪除git rm刪除其中b.m這個(gè)文件界赔,由于此時(shí)暫存區(qū)沒(méi)有存在該文件丢习,工作區(qū)有所以git rm不會(huì)提示
錯(cuò)誤牵触。這時(shí)候假設(shè)git rm對(duì)本地版本庫(kù)有影響,則我們?cè)俦镜匕姹編?kù)同步到共享版本庫(kù)咐低,如果有影響揽思,則此時(shí)的共享版本庫(kù)就不會(huì)存在該文件。于是我們又在BWorker中進(jìn)行g(shù)it pull指令來(lái)驗(yàn)證见擦。</p>
<p>AWorker</p>
<pre>
suweipeng:sharedRep sixleaves$ git status -s
A b.m
A c.m
suweipeng:sharedRep sixleaves$ git commit -m "添加b钉汗、c文件"
[master b8e8cc9] 添加b、c文件
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b.m
create mode 100644 c.m
suweipeng:sharedRep sixleaves$ git push origin master
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 288 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To /Users/sixleaves/SWPTest/AWorker/../sharedRep/
97b6aa0..b8e8cc9 master -> master
suweipeng:sharedRep sixleaves$ git rm b.m
rm 'b.m'
suweipeng:sharedRep sixleaves$ ls -l
total 0
-rw-r--r-- 1 sixleaves staff 0 7 21 17:27 c.m
-rw-r--r-- 1 sixleaves staff 0 7 21 17:16 e.m
suweipeng:sharedRep sixleaves$ git push origin master
Everything up-to-date
suweipeng:sharedRep sixleaves$ </pre>
<p>在BWorker中進(jìn)行g(shù)it pull指令鲤屡,具體細(xì)節(jié)如下损痰,可以看到BWorker工作區(qū)間在pull之后,存在b.m c.m e.m
所以我們可以得出結(jié)論git rm針對(duì)的只是工作區(qū)和暫存區(qū)域执俩,當(dāng)兩個(gè)區(qū)域同時(shí)存在該文件的時(shí)候,進(jìn)行刪除
操作會(huì)出錯(cuò)癌刽,我們需要詳細(xì)說(shuō)明是不是要保存工作區(qū)的文件役首。</p>
<p>BWorker</p>
<pre>
suweipeng:sharedRep sixleaves$ pwd
/Users/sixleaves/SWPTest/BWorker/sharedRep
suweipeng:sharedRep sixleaves$ git pull
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From /Users/sixleaves/SWPTest/BWorker/../sharedRep
97b6aa0..b8e8cc9 master -> origin/master
Updating 97b6aa0..b8e8cc9
Fast-forward
b.m | 0
c.m | 0
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b.m
create mode 100644 c.m
suweipeng:sharedRep sixleaves$ ls -al
total 8
drwxr-xr-x 7 sixleaves staff 238 7 21 19:00 .
drwxr-xr-x 3 sixleaves staff 102 7 21 17:18 ..
drwxr-xr-x 15 sixleaves staff 510 7 21 19:00 .git
-rw-r--r-- 1 sixleaves staff 836 7 21 17:18 .gitignore
-rw-r--r-- 1 sixleaves staff 0 7 21 19:00 b.m
-rw-r--r-- 1 sixleaves staff 0 7 21 19:00 c.m
-rw-r--r-- 1 sixleaves staff 0 7 21 17:18 e.m
suweipeng:sharedRep sixleaves$</pre>
最后分別針對(duì)這三個(gè)區(qū)域總結(jié),如下
<pre><code>1显拜、針對(duì)工作區(qū)域的刪除: (如果文件是已經(jīng)交給git管理)這種情況衡奥,也必須同步版本庫(kù),所以其實(shí)就是新方法的完整流程远荠。
如果是還沒(méi)提交給git管理矮固,此時(shí)直接是用rm刪除即可。
2譬淳、針對(duì)暫存區(qū)域的刪除(而不刪除工作區(qū)): git rm <文件名> --cached
3档址、針對(duì)分支(版本庫(kù))的刪除: 所謂的針對(duì)分支的刪除其實(shí)是沒(méi)必要的,因?yàn)槊看翁峤坏臅r(shí)候都會(huì)產(chǎn)生一個(gè)新版本邻梆。
如果出錯(cuò)守伸,我們可以直接使用git reset 進(jìn)行版本回退。所以如果你想做到針對(duì)版本庫(kù)的刪除效果浦妄,就只能使用版本回退尼摹。
其它:
4、針對(duì)同時(shí)刪除工作區(qū)域和暫存區(qū)域的: git rm -f <file></code></pre>
<h4 id="toc_11"><strong>三剂娄、改</strong></h4>
<p>需要明確的一點(diǎn)是蠢涝,當(dāng)你把文件交給git管理的時(shí)候,一旦你一修改一個(gè)文件(無(wú)論是換行還是空格都算)阅懦,git就會(huì)追蹤到此時(shí)文件發(fā)生了變化和二。也就是所此時(shí)你必須再每次改完后,add到暫存區(qū)耳胎,然后進(jìn)行commit儿咱⊥タ常總要的事要所三篇!;觳骸怠缸!每次修改完都必須add到暫存區(qū),保持暫存區(qū)該份文件的最新?tīng)顟B(tài)钳宪,這樣在commit之后揭北,版本庫(kù)中保存的才是我們修改的文件!@粲薄搔体!。覺(jué)得改也就這個(gè)注意點(diǎn)半醉,是比較簡(jiǎn)單的疚俱,所以具體的操作,可以常見(jiàn)官方文檔缩多。</p>
<p>所以我把改分為兩種呆奕,一種是針對(duì)自己編程任務(wù)進(jìn)行編碼的"改"。一種是你需要從共享版本庫(kù)種更新下來(lái)最新
代碼的"改"衬吆。前者不在復(fù)述梁钾,后者簡(jiǎn)單說(shuō)一下。</p>
<p>在git中逊抡,我們可以使用git pull來(lái)更新一個(gè)已經(jīng)和共享版本庫(kù)關(guān)聯(lián)起來(lái)的本地版本庫(kù)姆泻,和相應(yīng)的工作區(qū)間。嚴(yán)謹(jǐn)點(diǎn)來(lái)說(shuō)git pull = git fetch + merge冒嫡。即一步是取數(shù)據(jù)拇勃,一步是合并數(shù)據(jù),所以git pull可能會(huì)在合并時(shí)候產(chǎn)生數(shù)據(jù)沖突孝凌,后面會(huì)詳細(xì)介紹產(chǎn)生沖突的解決方案潜秋。這邊暫且掌握簡(jiǎn)單的更新操作即可。</p>
<h4 id="toc_12"><strong>四胎许、查</strong></h4>
<p>所謂的查有兩種峻呛,一種是查看版本記錄。一種是查看暫緩區(qū)和工作區(qū)的中的文件差別辜窑,以此來(lái)判斷時(shí)候要更新暫緩區(qū)的文件钩述。</p>
<p>查看版本記錄:
就是進(jìn)行版本的查看(git log、git reflog)穆碎。前者是當(dāng)前存在的可追溯的版本牙勘,后者是歷史記錄中存在的版本。一般如果我們要回退版本的話,使用git reflog會(huì)更方便方面,應(yīng)該它可以查看到所有的版本的歷史記錄放钦。</p>
<pre>
suweipeng:sharedRep sixleaves$ git log
commit 7f0486eda9bfcaaae56ec8382be580d446d854d3
Author: sixleaves 18649772243@163.com
Date: Tue Jul 21 20:09:53 2015 +0800
添加了main.m
commit 97b6aa090388d0fc1b73eaeb615d86faf83807f7
Author: sixleaves 18649772243@163.com
Date: Tue Jul 21 17:20:05 2015 +0800
刪除文件b
commit ef1169ef156294cfd68ac10b568781ca9ab4a15c
Author: sixleaves 18649772243@163.com
Date: Tue Jul 21 17:16:46 2015 +0800
添加了e文件
commit 4eb100209198d1f5c7bf914bdf9776795f7753f1
Author: sixleaves 18649772243@163.com
Date: Tue Jul 21 17:15:00 2015 +0800
添加了b文件</code></pre>
<pre>suweipeng:sharedRep sixleaves$ git reflog
7f0486e HEAD@{0}: commit: 添加了main.m
97b6aa0 HEAD@{1}: reset: moving to 97b6aa0
b8e8cc9 HEAD@{2}: commit: 添加b、c文件
97b6aa0 HEAD@{3}: commit: 刪除文件b
ef1169e HEAD@{4}: commit: 添加了e文件
4eb1002 HEAD@{5}: commit: 添加了b文件
a18151c HEAD@{6}: commit (initial): add gitignore file
suweipeng:sharedRep sixleaves$
</pre>
<p>查看工作區(qū)的文件狀態(tài):</p>
<p>git status 指令會(huì)去暫緩區(qū)中與工作區(qū)進(jìn)行比較恭金,如果是暫緩區(qū)不存在操禀,而工作區(qū)存在的,則會(huì)顯示兩個(gè)横腿?颓屑,表示還沒(méi)提交給git進(jìn)行管理。此時(shí)可以執(zhí)行g(shù)it add命令將其提交到暫緩區(qū)耿焊,此時(shí)暫緩區(qū)的文件狀態(tài)揪惦,就變成了A,表示已經(jīng)加入暫緩區(qū)罗侯,此時(shí)若在提交到本地版本庫(kù)器腋,則git就可以管理該文件了,所以此時(shí)再使用git status查詢(xún)是沒(méi)有結(jié)果的钩杰,因?yàn)榇藭r(shí)暫緩區(qū)已經(jīng)清空(在執(zhí)行g(shù)it commit后清空)纫塌,而工作區(qū)中的文件已經(jīng)交給git管理,并且沒(méi)有發(fā)送變化榜苫。</p>
<pre>suweipeng:sharedRep sixleaves$ git status -s
?? 1.m
suweipeng:sharedRep sixleaves$ git add 1.m
suweipeng:sharedRep sixleaves$ git status -s
A 1.m
suweipeng:sharedRep sixleaves$ vim 1.m
suweipeng:sharedRep sixleaves$ git status -s
A 1.m
suweipeng:sharedRep sixleaves$ vim 1.m
suweipeng:sharedRep sixleaves$ git status -s
AM 1.m
suweipeng:sharedRep sixleaves$ git add 1.m
suweipeng:sharedRep sixleaves$ git status -s
A 1.m
suweipeng:sharedRep sixleaves$ git commit -m "添加1.m"
[master f6378aa] 添加1.m
1 file changed, 1 insertion(+)
create mode 100644 1.m
suweipeng:sharedRep sixleaves$ git status -s
suweipeng:sharedRep sixleaves$
</pre>
<p>如果修改了main.m文件护戳,再進(jìn)行查看此時(shí)翎冲,第二欄目就變成了紅色的M垂睬,表示已經(jīng)修改工作區(qū)的文件,而此時(shí)git中版本庫(kù)里的文件和該文件不同抗悍,所以我們要將其同步驹饺,必須得先進(jìn)行g(shù)it add,此時(shí)文件狀態(tài)由工作區(qū)的M變成了暫緩區(qū)的M缴渊,并且變成綠色赏壹,而工作區(qū)的M會(huì)消失。</p>
<p>此時(shí)可以使用git diff查看工作區(qū)和暫緩區(qū)中具體的變化衔沼。</p>
<pre>suweipeng:sharedRep sixleaves$ touch 2.m
suweipeng:sharedRep sixleaves$ git add 2.m
suweipeng:sharedRep sixleaves$ vim 2.m
suweipeng:sharedRep sixleaves$ git status -s
AM 2.m
suweipeng:sharedRep sixleaves$ git diff
diff --git a/2.m b/2.m
index e69de29..abe4786 100644
--- a/2.m
+++ b/2.m
@@ -0,0 +1 @@
+ddddd
suweipeng:sharedRep sixleaves$ </code></pre>
<p>上圖的意思是在變動(dòng)后的文件種蝌借,新增加了一行ddddd</p>
查總結(jié)
<pre>
1.查詢(xún)版本記錄使用git log或者git reflog。
前者記錄的是當(dāng)前版本號(hào)的迭代順序(可能會(huì)因?yàn)榛赝硕采w)指蚁。
后者記錄的是所有的歷史版本記錄菩佑。(后者包含前者)。
2.使用git status -s就可知道暫存區(qū)的數(shù)據(jù)是否是最新的凝化,是否有文件沒(méi)有添加進(jìn)暫存取稍坯。
3.如果暫存區(qū)數(shù)據(jù)不是最新的,可以使用git diff必將查看變化的數(shù)據(jù)搓劫。
</pre>
<p><strong>git diff中的格式說(shuō)明</strong></p>
<pre>
---: 表示變動(dòng)前的文件(工作區(qū)文件)瞧哟。
+++: 表示變動(dòng)后的文件(暫存區(qū)文件)混巧。
沒(méi)有減號(hào)或加號(hào)的行表示沒(méi)有變動(dòng)的行。
-號(hào)的行表示第一個(gè)文件中刪除的行勤揩,+號(hào)表示第二個(gè)文件中增加的行咧党。
@@ -1,7 +1,7 @@這句話中的減號(hào)和加號(hào)分別表示第一個(gè)文件,和第二個(gè)文件雄可。
</pre>
文件狀態(tài)總結(jié):
<p></p>
<p>補(bǔ)充: 暫存區(qū)的D和工作區(qū)的D的區(qū)別:</p>
<pre>
1.第一欄目的凿傅,也就是暫存區(qū)顯示的是綠色的D,則表示該文件已經(jīng)從工作空間
刪除数苫,刪除標(biāo)志提交到了暫存區(qū)聪舒,此時(shí)若再執(zhí)行g(shù)it commit就會(huì)將其從版本庫(kù)種刪除。
2.而紅色的D虐急,再第二欄目箱残,表示工作空間上的文件已經(jīng)被刪除,但是刪除操作還沒(méi)有提交到暫存區(qū)止吁。
只有提交到了暫存區(qū)才有機(jī)會(huì)被辑,將其在git種刪除。
</pre>
<p>顏色的紅綠只是為了讓你能迅速的分辨出暫存區(qū)和工作區(qū)的文件狀態(tài)的<strong>修改狀態(tài)敬惦。</strong></p>
<p>這是第一篇GIT簡(jiǎn)要入門(mén)的文章盼理,如果有疑惑的地方,可以給我留言俄删,大家相互交流宏怔。后面的文章還會(huì)再介紹
git種的沖突解決等問(wèn)題。</p>