Git是一款免費(fèi)、開(kāi)源的分布式?版本控制系統(tǒng)?饲窿,用于敏捷高效地處理任何或小或大的項(xiàng)目蔽午。
這里推薦使用GIT的項(xiàng)目管理工具soucetree等晌柬,當(dāng)然已經(jīng)深入了解的可以使用git命令行直接操作刺下。
Git初始化绑嘹,一般代碼倉(cāng)庫(kù)會(huì)自動(dòng)生成。會(huì)在該倉(cāng)庫(kù)生成一個(gè).git隱藏文件夾橘茉,不能修改該文件夾下的任何內(nèi)容。
Git倉(cāng)庫(kù)分為三個(gè)區(qū):工作區(qū)姨丈、暫存區(qū)畅卓、倉(cāng)庫(kù)區(qū)
工作區(qū):日常我們編寫(xiě)代碼的地方,一般是本地工作的目錄就叫工作區(qū)蟋恬。
暫存區(qū):暫時(shí)存儲(chǔ)的區(qū)域翁潘,在git中,代碼不會(huì)直接從工作區(qū)提交到倉(cāng)庫(kù)區(qū)歼争,而是需要先從工作區(qū)提交到暫存區(qū)拜马,然后才能從暫存區(qū)推送到倉(cāng)庫(kù)區(qū)渗勘。暫存區(qū)的目的是避免誤操作。
倉(cāng)庫(kù)區(qū):一般是遠(yuǎn)程倉(cāng)庫(kù)(如GitHub俩莽、碼云-開(kāi)源中國(guó)等旺坠,遠(yuǎn)程倉(cāng)庫(kù)本質(zhì)本地倉(cāng)庫(kù)拓展而成的,所以也可以自己搭建)扮超,也有少部分是本地倉(cāng)庫(kù)取刃。將保存在暫存區(qū)域的內(nèi)容推送存儲(chǔ)到 Git 倉(cāng)庫(kù)中,同時(shí)生成版本號(hào)可以在版本節(jié)點(diǎn)添加標(biāo)簽備注信息出刷。對(duì)于倉(cāng)庫(kù)的版本節(jié)點(diǎn)我們可以任意切回滾到指定節(jié)點(diǎn)的代碼狀態(tài)璧疗。
Git的常見(jiàn)操作:
克隆(clone):從遠(yuǎn)程倉(cāng)庫(kù)URL加載創(chuàng)建一個(gè)與遠(yuǎn)程倉(cāng)庫(kù)一樣的本地倉(cāng)庫(kù)?
標(biāo)簽:倉(cāng)庫(kù)中每個(gè)節(jié)點(diǎn)的備注信息,一個(gè)分支可以有多個(gè)標(biāo)簽。
文件忽視:忽視某個(gè)文件的修改,往往用于配置文件馁龟,一般在倉(cāng)庫(kù)的根目錄下的.gitignore中崩侠,改文件中存儲(chǔ)忽視文件的路徑(文件的修改不會(huì)被添加,文件未被刪除)坷檩。
丟棄:本地文件中修改(添加)的東西會(huì)刪除啦膜,注意不是文件 。
移除:直接刪除本地文件淌喻。(可以通過(guò)拉取獲得git服務(wù)上的該文件)?
提交:把修改的內(nèi)容提交到暫存區(qū)僧家,暫存區(qū)內(nèi)在下一次推送前可進(jìn)行多次提交,每次提交都需要附加一個(gè)標(biāo)簽信息裸删,以區(qū)別或者記錄這次提交的內(nèi)容八拱。
添加(add):添加文件到緩存區(qū)?
暫存(git stash):保存工作現(xiàn)場(chǎng)?
拉取:把倉(cāng)庫(kù)中所在節(jié)點(diǎn)分支的最新信息拉取到暫存區(qū)
推送:把暫存區(qū)的內(nèi)容推送到所在的節(jié)點(diǎn)分支,并成為該節(jié)點(diǎn)分支的最新節(jié)點(diǎn)涯塔。
回滾:回滾一次提交肌稻。
分支(branch):創(chuàng)建/修改/刪除分枝?
檢出(checkout):切換不同分支?
變基:在有同一父節(jié)點(diǎn)的分支基礎(chǔ)上,將提交到某一分支上的所有修改都移至另一分支上匕荸,并在當(dāng)前分支上創(chuàng)建一個(gè)新的下一次的節(jié)點(diǎn)爹谭。
查看歷史:查看倉(cāng)庫(kù)的分支節(jié)點(diǎn)的提交信息。
工作流(Git Flow):團(tuán)隊(duì)工作時(shí)榛搔,每個(gè)人創(chuàng)建屬于自己的分枝(branch)诺凡,確定無(wú)誤后提交到master分枝?
Git分支的使用和說(shuō)明锅论。
舉個(gè)分支使用例子勤讽。假如你有一項(xiàng)任務(wù)。給你2箱水言询,一箱可樂(lè)和一箱雪碧尔觉,現(xiàn)在你需要把這2箱水搬到地點(diǎn)B并放入倉(cāng)庫(kù)記錄凉袱。但是一個(gè)人只能搬動(dòng)一箱水。那我們就可以指派一個(gè)人搬雪碧到地點(diǎn)B,列為分支①专甩;指派另外一個(gè)人搬可樂(lè)到地點(diǎn)A钟鸵,列為分支②。在他們搬的過(guò)程可能有很多種涤躲,可能會(huì)耗時(shí)棺耍、或者磕磕絆絆、又或者繞路等等篓叶,當(dāng)最終2個(gè)人都把水搬到地點(diǎn)B的時(shí)候烈掠,這2個(gè)人的任務(wù)就結(jié)束了,我們需要搬到可樂(lè)和雪碧放入倉(cāng)庫(kù)記錄完成最終結(jié)果缸托,這就相當(dāng)于分支操作中我們把分支①和分支②的結(jié)果合并了左敌。
從上面的舉例可以看出。分支的好處在于俐镐,當(dāng)我們有一個(gè)多任務(wù)并發(fā)進(jìn)行的需求時(shí)或者多人合作開(kāi)發(fā)時(shí)矫限,可以使這些任務(wù)或者開(kāi)發(fā)者互不干擾的進(jìn)行各自的工作,達(dá)到最終的目的后再合并各自的結(jié)果佩抹,從而達(dá)到最終目的叼风。當(dāng)然這里講的比較簡(jiǎn)單,合并過(guò)程中可能會(huì)出現(xiàn)的一些不可避免的如代碼沖突等棍苹,這些是需要人為解決的无宿。
一般我們會(huì)把分支分為主分支和其他分支。其他分支上的任務(wù)最終使用會(huì)合操作合并并到主分支上枢里。在平時(shí)的開(kāi)發(fā)使用過(guò)程中孽鸡,我們需要了解到自己所處的分支屬于哪個(gè)分支,任務(wù)目的是什么栏豺,避免分支過(guò)多引起的誤操作彬碱。
單一分支的使用和說(shuō)明。
上面我們說(shuō)了多分支的情況奥洼,現(xiàn)在我們來(lái)講一下單一分支的操作和使用巷疼。在實(shí)際的開(kāi)發(fā)使用中我們常常也會(huì)遇到這樣的需求。同一項(xiàng)任務(wù)幾個(gè)人一起開(kāi)發(fā)灵奖,因?yàn)橹芷谶^(guò)短嚼沿,內(nèi)容也比較簡(jiǎn)單,這個(gè)時(shí)候我們?cè)偈褂梅种У脑?huà)就會(huì)比較繁瑣桑寨。因?yàn)槿绻龅揭粋€(gè)任務(wù)我們就使用分支的話(huà)伏尼,會(huì)使整個(gè)項(xiàng)目到處都充滿(mǎn)分支,看起來(lái)比較亂尉尾,維護(hù)和迭代也會(huì)比較慢。所以大多數(shù)的情況下我們也會(huì)在單一分支上操作燥透。
在單一分支上多個(gè)開(kāi)發(fā)者怎么同時(shí)操作呢沙咏。除了之前的提交和推送辨图,我們引入拉取這個(gè)操作。同樣我們舉個(gè)例子肢藐。我們把每個(gè)開(kāi)發(fā)者看做在同一個(gè)公司的會(huì)計(jì)故河。當(dāng)一個(gè)會(huì)計(jì)完成了手中的財(cái)務(wù)工作過(guò)后,我們需要重新核對(duì)整理公司的賬目吆豹,這個(gè)時(shí)候我們?cè)谔峤蛔约汗ぷ髦坝愕模托枰「聦?shí)時(shí)的公司賬目信息,看時(shí)候跟你做這項(xiàng)工作之前一致痘煤,如果不一致凑阶,我們就需要拉取最新的公司賬目信息,并整理核對(duì)自己提交的這項(xiàng)工作到最新的公司賬目信息中衷快,其中可能會(huì)有修改可能也沒(méi)有宙橱。整理完之后我們?cè)谧罱K推送到公司賬目信息中。
這里操作可以簡(jiǎn)單的分為以下幾步:提交(完成你的工作)→拉取(獲得項(xiàng)目的最新信息和狀態(tài))→合并(把你完成的工作合并到項(xiàng)目的最新信息和狀態(tài)中)→推送(把你合并后的最新項(xiàng)目信息更新到倉(cāng)庫(kù)中蘸拔,此時(shí)你更新的節(jié)點(diǎn)就是你所處分支的最新節(jié)點(diǎn))师郑。
切換分支和刪除分支。
切換分支调窍,由于項(xiàng)目需求我們常潮γ幔可能會(huì)遇到在某個(gè)已經(jīng)迭代的版本上增加新的需求迭代,這個(gè)時(shí)候我們就需要切換到那個(gè)分支上再進(jìn)行操作邓萨。注意我們?cè)谇袚Q到任意分支之前地梨,我們需要保證自己所處分支的修改內(nèi)容已經(jīng)提交到倉(cāng)庫(kù)中,否則一旦切換過(guò)去先誉,你之前的修改內(nèi)容將不會(huì)再有保存湿刽。這里可以把切換分支看成是一種覆蓋的表現(xiàn)。
刪除分支褐耳,刪除分支的時(shí)候需要區(qū)別刪除本地分支和遠(yuǎn)程分支诈闺,一旦刪除,將清除分支節(jié)點(diǎn)的所有信息铃芦。一般很少會(huì)有刪除分支操作雅镊。如果一個(gè)分支被廢棄時(shí),我們需要?jiǎng)h除分支,在徹底刪除一個(gè)分支時(shí),需要三個(gè)步驟刪除①本地分支②刪除遠(yuǎn)程分支③刪除本地追蹤分支。如果執(zhí)行了①②③刃滓,那么刪除的分支就不可恢復(fù)了仁烹。刪除本地可以通過(guò)遠(yuǎn)程恢復(fù)本地,刪除遠(yuǎn)程可以通過(guò)本地恢復(fù)遠(yuǎn)程咧虎。
Git回滾和重置
所處狀態(tài)的基本定義
HEAD(頭)
HEAD 是當(dāng)前分支引用的指針卓缰,它總是指向該分支上的最后一次提交。 這表示 HEAD 將是下一次提交的父結(jié)點(diǎn)。 通常征唬,理解 HEAD 的最簡(jiǎn)方式捌显,就是將它看做 你的上一次提交 的快照,可以看做是一個(gè)提交節(jié)點(diǎn)总寒。遠(yuǎn)程倉(cāng)庫(kù)就是這些節(jié)點(diǎn)連成的扶歪。
Index? (索引)
也可以被認(rèn)為是staging area(暫存區(qū)),是一堆將在下一次commit中提交的文件摄闸,提交之后善镰,它就是HEAD的父節(jié)點(diǎn)(git add添加的文件)
working copy (工作副本)
當(dāng)前工作目錄下的文件(一般指,有修改年枕,沒(méi)有g(shù)it add,沒(méi)有g(shù)it commit的文件)
回滾是提交一個(gè)新的版本炫欺,將需要revert的版本的內(nèi)容再反向修改回去,版本會(huì)遞增画切,不影響之前提交的內(nèi)容
重置是把HEAD向后移動(dòng)了一下竣稽,即版本退回。重置有一下幾個(gè)操作霍弹。
git reset hard(強(qiáng)行合并):此次提交之后的修改不做任何保留毫别,干凈的工作區(qū)。
git reset soft(軟合并): 此次提交之后的修改會(huì)被退回到暫存區(qū)典格。
git reset mixed(混合合并):此次提交之后的修改會(huì)被退回到未暫存區(qū)岛宦。