Git使用教程

(預(yù)警:因?yàn)樵敿?xì)忍弛,所以行文有些長(zhǎng)冒掌,新手邊看邊操作效果出乎你的預(yù)料)

一:Git是什么歪今?

Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)萧锉。

工作原理 / 流程:

圖片描述

Workspace:工作區(qū)

Index / Stage:暫存區(qū)

Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))

Remote:遠(yuǎn)程倉(cāng)庫(kù)

二:SVN與Git的最主要的區(qū)別?

SVN是集中式版本控制系統(tǒng)朗兵,版本庫(kù)是集中放在中央服務(wù)器的,而干活的時(shí)候,用的都是自己的電腦浊吏,所以首先要從中央服務(wù)器哪里得到最新的版本找田,然后干活墩衙,干完后甲抖,需要把自己做完的活推送到中央服務(wù)器漆改。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)還可以准谚,帶寬夠大挫剑,速度夠快,如果在互聯(lián)網(wǎng)下柱衔,如果網(wǎng)速慢的話(huà)樊破,就納悶了。

Git是分布式版本控制系統(tǒng)唆铐,那么它就沒(méi)有中央服務(wù)器的哲戚,每個(gè)人的電腦就是一個(gè)完整的版本庫(kù),這樣艾岂,工作的時(shí)候就不需要聯(lián)網(wǎng)了顺少,因?yàn)榘姹径际窃谧约旱碾娔X上。既然每個(gè)人的電腦都有一個(gè)完整的版本庫(kù)澳盐,那多個(gè)人如何協(xié)作呢腕窥?比如說(shuō)自己在電腦上改了文件A,其他人也在電腦上改了文件A响蓉,這時(shí)扼褪,你們兩之間只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了。

三吉嫩、在windows上如何安裝Git椒功?

msysgit是 windows版的Git,如下:

圖片描述

需要從網(wǎng)上下載一個(gè)荠锭,然后進(jìn)行默認(rèn)安裝即可共虑。安裝完成后尘分,在開(kāi)始菜單里面找到 "Git --> Git Bash",如下:

圖片描述

會(huì)彈出一個(gè)類(lèi)似的命令窗口的東西缓窜,就說(shuō)明Git安裝成功。如下:

圖片描述

安裝完成后螃成,還需要最后一步設(shè)置,在命令行輸入如下:

圖片描述

因?yàn)镚it是分布式版本控制系統(tǒng),所以需要填寫(xiě)用戶(hù)名和郵箱作為一個(gè)標(biāo)識(shí)。

注意:git config --global 參數(shù),有了這個(gè)參數(shù)傅是,表示你這臺(tái)機(jī)器上所有的Git倉(cāng)庫(kù)都會(huì)使用這個(gè)配置书闸,當(dāng)然你也可以對(duì)某個(gè)倉(cāng)庫(kù)指定的不同的用戶(hù)名和郵箱。

四:如何操作?

一:創(chuàng)建版本庫(kù)蚯嫌。

什么是版本庫(kù)晒旅?版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單的理解一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來(lái),每個(gè)文件的修改置媳,刪除寂拆,Git都能跟蹤鬓长,以便任何時(shí)刻都可以追蹤歷史啤覆,或者在將來(lái)某個(gè)時(shí)刻還可以將文件”還原”。

所以創(chuàng)建一個(gè)版本庫(kù)也非常簡(jiǎn)單,如下我是D盤(pán) –> www下 目錄下新建一個(gè)testgit版本庫(kù)。

圖片描述

pwd 命令是用于顯示當(dāng)前的目錄。

通過(guò)命令 git init 把這個(gè)目錄變成git可以管理的倉(cāng)庫(kù)柒啤,如下:

圖片描述

這時(shí)候你當(dāng)前testgit目錄下會(huì)多了一個(gè).git的目錄没炒,這個(gè)目錄是Git來(lái)跟蹤管理版本的先匪,沒(méi)事千萬(wàn)不要手動(dòng)亂改這個(gè)目錄里面的文件镜盯,否則恩闻,會(huì)把git倉(cāng)庫(kù)給破壞了。如下:

圖片描述

把文件添加到版本庫(kù)中。

首先要明確下,所有的版本控制系統(tǒng)园爷,只能跟蹤文本文件的改動(dòng)著隆,比如txt文件,網(wǎng)頁(yè),所有程序的代碼等,Git也不列外旦装,版本控制系統(tǒng)可以告訴你每次的改動(dòng)店乐,但是圖片踪古,視頻這些二進(jìn)制文件,雖能也能由版本控制系統(tǒng)管理,但沒(méi)法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)串起來(lái)参滴,也就是知道圖片從1kb變成2kb暴心,但是到底改了啥弹沽,版本控制也不知道役纹。

下面先看下demo如下演示:

我在版本庫(kù)testgit目錄下新建一個(gè)記事本文件 readme.txt 內(nèi)容如下:11111111

第一步:使用命令 git add readme.txt添加到暫存區(qū)里面去。如下:

圖片描述

如果和上面一樣,沒(méi)有任何提示,說(shuō)明已經(jīng)添加成功了。

第二步:用命令 git commit告訴Git滩褥,把文件提交到倉(cāng)庫(kù)。

圖片描述

現(xiàn)在我們已經(jīng)提交了一個(gè)readme.txt文件了驹针,我們下面可以通過(guò)命令git status來(lái)查看是否還有文件未提交烘挫,如下:

圖片描述

說(shuō)明沒(méi)有任何文件未提交,但是我現(xiàn)在繼續(xù)來(lái)改下readme.txt內(nèi)容柬甥,比如我在下面添加一行2222222222內(nèi)容饮六,繼續(xù)使用git status來(lái)查看下結(jié)果卤橄,如下:

圖片描述

上面的命令告訴我們 readme.txt文件已被修改洗显,但是未被提交的修改嵌灰。

接下來(lái)我想看下readme.txt文件到底改了什么內(nèi)容布疙,如何查看呢酝豪?可以使用如下命令:

git diff readme.txt 如下:

圖片描述

如上可以看到惧财,readme.txt文件內(nèi)容從一行11111111改成 二行 添加了一行22222222內(nèi)容徐许。

知道了對(duì)readme.txt文件做了什么修改后,我們可以放心的提交到倉(cāng)庫(kù)了属提,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit)。

如下:

圖片描述

二:版本回退:

如上势就,我們已經(jīng)學(xué)會(huì)了修改文件右犹,現(xiàn)在我繼續(xù)對(duì)readme.txt文件進(jìn)行修改艾蓝,再增加一行

內(nèi)容為33333333333333.繼續(xù)執(zhí)行命令如下:

圖片描述

現(xiàn)在我已經(jīng)對(duì)readme.txt文件做了三次修改了,那么我現(xiàn)在想查看下歷史記錄侨嘀,如何查呢凝危?我們現(xiàn)在可以使用命令 git log 演示如下所示:

圖片描述

git log命令顯示從最近到最遠(yuǎn)的顯示日志,我們可以看到最近三次提交,最近的一次是,增加內(nèi)容為333333.上一次是添加內(nèi)容222222金砍,第一次默認(rèn)是 111111.如果嫌上面顯示的信息太多的話(huà),我們可以使用命令 git log –pretty=oneline 演示如下:

圖片描述

現(xiàn)在我想使用版本回退操作麦锯,我想把當(dāng)前的版本回退到上一個(gè)版本恕稠,要使用什么命令呢?可以使用如下2種命令扶欣,第一種是:git reset --hard HEAD^ 那么如果要回退到上上個(gè)版本只需把HEAD^ 改成 HEAD^^ 以此類(lèi)推鹅巍。那如果要回退到前100個(gè)版本的話(huà)千扶,使用上面的方法肯定不方便,我們可以使用下面的簡(jiǎn)便命令操作:git reset --hard HEAD~100 即可昆著。未回退之前的readme.txt內(nèi)容如下:

圖片描述

如果想回退到上一個(gè)版本的命令如下操作:

圖片描述

再來(lái)查看下 readme.txt內(nèi)容如下:通過(guò)命令cat readme.txt查看

圖片描述

可以看到县貌,內(nèi)容已經(jīng)回退到上一個(gè)版本了。我們可以繼續(xù)使用git log 來(lái)查看下歷史記錄信息凑懂,如下:

圖片描述

我們看到 增加333333 內(nèi)容我們沒(méi)有看到了料饥,但是現(xiàn)在我想回退到最新的版本,如:有333333的內(nèi)容要如何恢復(fù)呢桥滨?我們可以通過(guò)版本號(hào)回退芽唇,使用命令方法如下:

git reset --hard 版本號(hào) ,但是現(xiàn)在的問(wèn)題假如我已經(jīng)關(guān)掉過(guò)一次命令行或者333內(nèi)容的版本號(hào)我并不知道呢脓豪?要如何知道增加3333內(nèi)容的版本號(hào)呢巷帝?可以通過(guò)如下命令即可獲取到版本號(hào):git reflog 演示如下:

圖片描述

通過(guò)上面的顯示我們可以知道,增加內(nèi)容3333的版本號(hào)是 6fcfc89.我們現(xiàn)在可以命令

git reset --hard 6fcfc89來(lái)恢復(fù)了扫夜。演示如下:

圖片描述

可以看到 目前已經(jīng)是最新的版本了楞泼。

三:理解工作區(qū)與暫存區(qū)的區(qū)別?

工作區(qū):就是你在電腦上看到的目錄笤闯,比如目錄下testgit里的文件(.git隱藏目錄版本庫(kù)除外)堕阔。或者以后需要再新建的目錄文件等等都屬于工作區(qū)范疇颗味。

版本庫(kù)(Repository):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不屬于工作區(qū)超陆,這是版本庫(kù)。其中版本庫(kù)里面存了很多東西浦马,其中最重要的就是stage(暫存區(qū))时呀,還有Git為我們自動(dòng)創(chuàng)建了第一個(gè)分支master,以及指向master的一個(gè)指針HEAD。

我們前面說(shuō)過(guò)使用Git提交文件到版本庫(kù)有兩步:

第一步:是使用 git add 把文件添加進(jìn)去晶默,實(shí)際上就是把文件添加到暫存區(qū)谨娜。

第二步:使用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支上磺陡。

我們繼續(xù)使用demo來(lái)演示下:

我們?cè)趓eadme.txt再添加一行內(nèi)容為4444444瞧预,接著在目錄下新建一個(gè)文件為test.txt 內(nèi)容為test,我們先用命令 git status來(lái)查看下?tīng)顟B(tài)仅政,如下:

圖片描述

現(xiàn)在我們先使用git add 命令把2個(gè)文件都添加到暫存區(qū)中垢油,再使用git status來(lái)查看下?tīng)顟B(tài),如下:

圖片描述

接著我們可以使用git commit一次性提交到分支上圆丹,如下:

圖片描述

四:Git撤銷(xiāo)修改和刪除文件操作滩愁。

一:撤銷(xiāo)修改:

比如我現(xiàn)在在readme.txt文件里面增加一行 內(nèi)容為555555555555,我們先通過(guò)命令查看如下:

圖片描述

在我未提交之前辫封,我發(fā)現(xiàn)添加5555555555555內(nèi)容有誤硝枉,所以我得馬上恢復(fù)以前的版本廉丽,現(xiàn)在我可以有如下幾種方法可以做修改:

第一:如果我知道要?jiǎng)h掉那些內(nèi)容的話(huà),直接手動(dòng)更改去掉那些需要的文件妻味,然后add添加到暫存區(qū)正压,最后commit掉。

第二:我可以按以前的方法直接恢復(fù)到上一個(gè)版本责球。使用 git reset --hard HEAD^

但是現(xiàn)在我不想使用上面的2種方法焦履,我想直接想使用撤銷(xiāo)命令該如何操作呢?首先在做撤銷(xiāo)之前雏逾,我們可以先用 git status 查看下當(dāng)前的狀態(tài)嘉裤。如下所示:

圖片描述

可以發(fā)現(xiàn),Git會(huì)告訴你栖博,git checkout -- file 可以丟棄工作區(qū)的修改屑宠,如下命令:

git checkout -- readme.txt,如下所示:

圖片描述

命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作區(qū)做的修改全部撤銷(xiāo)仇让,這里有2種情況典奉,如下:

1.readme.txt自動(dòng)修改后,還沒(méi)有放到暫存區(qū)丧叽,使用 撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài)卫玖。

2.另外一種是readme.txt已經(jīng)放入暫存區(qū)了,接著又作了修改蠢正,撤銷(xiāo)修改就回到添加暫存區(qū)后的狀態(tài)骇笔。

對(duì)于第二種情況省店,我想我們繼續(xù)做demo來(lái)看下嚣崭,假如現(xiàn)在我對(duì)readme.txt添加一行 內(nèi)容為6666666666666,我git add 增加到暫存區(qū)后懦傍,接著添加內(nèi)容7777777雹舀,我想通過(guò)撤銷(xiāo)命令讓其回到暫存區(qū)后的狀態(tài)。如下所示:

圖片描述

注意:命令git checkout -- readme.txt 中的 -- 很重要粗俱,如果沒(méi)有 -- 的話(huà)说榆,那么命令變成創(chuàng)建分支了。

二:刪除文件寸认。

假如我現(xiàn)在版本庫(kù)testgit目錄添加一個(gè)文件b.txt,然后提交签财。如下:

圖片描述

如上:一般情況下,可以直接在文件目錄中把文件刪了偏塞,或者使用如上rm命令:rm b.txt 唱蒸,如果我想徹底從版本庫(kù)中刪掉了此文件的話(huà),可以再執(zhí)行commit命令 提交掉灸叼,現(xiàn)在目錄是這樣的神汹,

圖片描述

只要沒(méi)有commit之前庆捺,如果我想在版本庫(kù)中恢復(fù)此文件如何操作呢?

可以使用如下命令 git checkout -- b.txt屁魏,如下所示:

圖片描述

再來(lái)看看我們testgit目錄滔以,添加了3個(gè)文件了。如下所示:

圖片描述

五:遠(yuǎn)程倉(cāng)庫(kù)氓拼。

在了解之前你画,先注冊(cè)github賬號(hào),由于你的本地Git倉(cāng)庫(kù)和github倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的披诗,所以需要一點(diǎn)設(shè)置:

第一步:創(chuàng)建SSH Key撬即。在用戶(hù)主目錄下,看看有沒(méi)有.ssh目錄呈队,如果有剥槐,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果有的話(huà)宪摧,直接跳過(guò)此如下命令粒竖,如果沒(méi)有的話(huà),打開(kāi)命令行几于,輸入如下命令:

ssh-keygen -t rsa –C “youremail@example.com”, 由于我本地此前運(yùn)行過(guò)一次蕊苗,所以本地有,如下所示:

圖片描述

id_rsa是私鑰沿彭,不能泄露出去朽砰,id_rsa.pub是公鑰,可以放心地告訴任何人喉刘。

第二步:登錄github,打開(kāi)” settings”中的SSH Keys頁(yè)面瞧柔,然后點(diǎn)擊“Add SSH Key”,填上任意title,在Key文本框里黏貼id_rsa.pub文件的內(nèi)容睦裳。

圖片描述

點(diǎn)擊 Add Key造锅,你就應(yīng)該可以看到已經(jīng)添加的key。

圖片描述

如何添加遠(yuǎn)程庫(kù)廉邑?

現(xiàn)在的情景是:我們已經(jīng)在本地創(chuàng)建了一個(gè)Git倉(cāng)庫(kù)后哥蔚,又想在github創(chuàng)建一個(gè)Git倉(cāng)庫(kù),并且希望這兩個(gè)倉(cāng)庫(kù)進(jìn)行遠(yuǎn)程同步蛛蒙,這樣github的倉(cāng)庫(kù)可以作為備份糙箍,又可以其他人通過(guò)該倉(cāng)庫(kù)來(lái)協(xié)作。

首先牵祟,登錄github上深夯,然后在右上角找到“create a new repo”創(chuàng)建一個(gè)新的倉(cāng)庫(kù)。如下:

圖片描述

在Repository name填入testgit课舍,其他保持默認(rèn)設(shè)置塌西,點(diǎn)擊“Create repository”按鈕他挎,就成功地創(chuàng)建了一個(gè)新的Git倉(cāng)庫(kù):

圖片描述

目前,在GitHub上的這個(gè)testgit倉(cāng)庫(kù)還是空的捡需,GitHub告訴我們办桨,可以從這個(gè)倉(cāng)庫(kù)克隆出新的倉(cāng)庫(kù),也可以把一個(gè)已有的本地倉(cāng)庫(kù)與之關(guān)聯(lián)站辉,然后呢撞,把本地倉(cāng)庫(kù)的內(nèi)容推送到GitHub倉(cāng)庫(kù)。

現(xiàn)在饰剥,我們根據(jù)GitHub的提示殊霞,在本地的testgit倉(cāng)庫(kù)下運(yùn)行命令:

git remote add originhttps://github.com/tugenhua0707/testgit.git

所有的如下:

圖片描述

把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,使用 git push命令汰蓉,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程绷蹲。

由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí)顾孽,加上了 –u參數(shù)祝钢,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái)若厚,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令拦英。推送成功后,可以立刻在github頁(yè)面中看到遠(yuǎn)程庫(kù)的內(nèi)容已經(jīng)和本地一模一樣了测秸,上面的要輸入github的用戶(hù)名和密碼如下所示:

圖片描述

從現(xiàn)在起疤估,只要本地作了提交,就可以通過(guò)如下命令:

git push origin master

把本地master分支的最新修改推送到github上了霎冯,現(xiàn)在你就擁有了真正的分布式版本庫(kù)了铃拇。

如何從遠(yuǎn)程庫(kù)克隆肃晚?

上面我們了解了先有本地庫(kù)锚贱,后有遠(yuǎn)程庫(kù)時(shí)候仔戈,如何關(guān)聯(lián)遠(yuǎn)程庫(kù)关串。

現(xiàn)在我們想,假如遠(yuǎn)程庫(kù)有新的內(nèi)容了监徘,我想克隆到本地來(lái) 如何克隆呢晋修?

首先,登錄github凰盔,創(chuàng)建一個(gè)新的倉(cāng)庫(kù)墓卦,名字叫testgit2.如下:

圖片描述

如下,我們看到:

圖片描述

現(xiàn)在户敬,遠(yuǎn)程庫(kù)已經(jīng)準(zhǔn)備好了落剪,下一步是使用命令git clone克隆一個(gè)本地庫(kù)了睁本。如下所示:

圖片描述

接著在我本地目錄下 生成testgit2目錄了,如下所示:

圖片描述

六:創(chuàng)建與合并分支忠怖。

在 版本回填退里呢堰,你已經(jīng)知道,每次提交凡泣,Git都把它們串成一條時(shí)間線(xiàn)枉疼,這條時(shí)間線(xiàn)就是一個(gè)分支。截止到目前鞋拟,只有一條時(shí)間線(xiàn)骂维,在Git里,這個(gè)分支叫主分支贺纲,即master分支航闺。HEAD嚴(yán)格來(lái)說(shuō)不是指向提交,而是指向master猴誊,master才是指向提交的来颤,所以,HEAD指向的就是當(dāng)前分支稠肘。

首先福铅,我們來(lái)創(chuàng)建dev分支,然后切換到dev分支上项阴。如下操作:

圖片描述

git checkout 命令加上 –b參數(shù)表示創(chuàng)建并切換滑黔,相當(dāng)于如下2條命令

git branch dev

git checkout dev

git branch查看分支,會(huì)列出所有的分支环揽,當(dāng)前分支前面會(huì)添加一個(gè)星號(hào)略荡。然后我們?cè)赿ev分支上繼續(xù)做demo,比如我們現(xiàn)在在readme.txt再增加一行 7777777777777

首先我們先來(lái)查看下readme.txt內(nèi)容歉胶,接著添加內(nèi)容77777777汛兜,如下:

圖片描述

現(xiàn)在dev分支工作已完成,現(xiàn)在我們切換到主分支master上通今,繼續(xù)查看readme.txt內(nèi)容如下:

圖片描述

現(xiàn)在我們可以把dev分支上的內(nèi)容合并到分支master上了粥谬,可以在master分支上,使用如下命令 git merge dev 如下所示:

圖片描述

git merge命令用于合并指定分支到當(dāng)前分支上辫塌,合并后漏策,再查看readme.txt內(nèi)容,可以看到臼氨,和dev分支最新提交的是完全一樣的掺喻。

注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”感耙,也就是直接把master指向dev的當(dāng)前提交褂乍,所以合并速度非常快即硼。

合并完成后树叽,我們可以接著刪除dev分支了,操作如下:

圖片描述

總結(jié)創(chuàng)建與合并分支命令如下:

查看分支:git branch

創(chuàng)建分支:git branch name

切換分支:git checkout name

創(chuàng)建+切換分支:git checkout –b name

合并某分支到當(dāng)前分支:git merge name

刪除分支:git branch –d name

如何解決沖突谦絮?

下面我們還是一步一步來(lái)题诵,先新建一個(gè)新分支,比如名字叫fenzhi1层皱,在readme.txt添加一行內(nèi)容8888888性锭,然后提交,如下所示:

圖片描述

同樣叫胖,我們現(xiàn)在切換到master分支上來(lái)草冈,也在最后一行添加內(nèi)容,內(nèi)容為99999999瓮增,如下所示:

圖片描述

現(xiàn)在我們需要在master分支上來(lái)合并fenzhi1怎棱,如下操作:

圖片描述

Git用<<<<<<<,=======绷跑,>>>>>>>標(biāo)記出不同分支的內(nèi)容拳恋,其中<<>>>>fenzhi1 是指fenzhi1上修改的內(nèi)容,我們可以修改下如下后保存:

圖片描述

如果我想查看分支合并的情況的話(huà)砸捏,需要使用命令 git log.命令行演示如下:

圖片描述

3.分支管理策略谬运。

? 通常合并分支時(shí),git一般使用”Fast forward”模式垦藏,在這種模式下梆暖,刪除分支后,會(huì)丟掉分支信息掂骏,現(xiàn)在我們來(lái)使用帶參數(shù) –no-ff來(lái)禁用”Fast forward”模式轰驳。首先我們來(lái)做demo演示下:

創(chuàng)建一個(gè)dev分支。

修改readme.txt內(nèi)容弟灼。

添加到暫存區(qū)级解。

切換回主分支(master)。

合并dev分支袜爪,使用命令 git merge –no-ff -m “注釋” dev

查看歷史記錄

截圖如下:

圖片描述

分支策略:首先master主分支應(yīng)該是非常穩(wěn)定的蠕趁,也就是用來(lái)發(fā)布新版本薛闪,一般情況下不允許在上面干活辛馆,干活一般情況下在新建的dev分支上干活,干完后,比如上要發(fā)布昙篙,或者說(shuō)dev分支代碼穩(wěn)定后可以合并到主分支master上來(lái)腊状。

七:bug分支:

在開(kāi)發(fā)中,會(huì)經(jīng)常碰到bug問(wèn)題苔可,那么有了bug就需要修復(fù)缴挖,在Git中,分支是很強(qiáng)大的焚辅,每個(gè)bug都可以通過(guò)一個(gè)臨時(shí)分支來(lái)修復(fù)映屋,修復(fù)完成后,合并分支同蜻,然后將臨時(shí)的分支刪除掉棚点。

比如我在開(kāi)發(fā)中接到一個(gè)404 bug時(shí)候,我們可以創(chuàng)建一個(gè)404分支來(lái)修復(fù)它湾蔓,但是瘫析,當(dāng)前的dev分支上的工作還沒(méi)有提交。比如如下:

圖片描述

并不是我不想提交默责,而是工作進(jìn)行到一半時(shí)候贬循,我們還無(wú)法提交,比如我這個(gè)分支bug要2天完成桃序,但是我issue-404 bug需要5個(gè)小時(shí)內(nèi)完成杖虾。怎么辦呢?還好媒熊,Git還提供了一個(gè)stash功能亏掀,可以把當(dāng)前工作現(xiàn)場(chǎng) ”隱藏起來(lái)”,等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作泛释。如下:

圖片描述

所以現(xiàn)在我可以通過(guò)創(chuàng)建issue-404分支來(lái)修復(fù)bug了滤愕。

首先我們要確定在那個(gè)分支上修復(fù)bug,比如我現(xiàn)在是在主分支master上來(lái)修復(fù)的怜校,現(xiàn)在我要在master分支上創(chuàng)建一個(gè)臨時(shí)分支间影,演示如下:

圖片描述

修復(fù)完成后,切換到master分支上茄茁,并完成合并魂贬,最后刪除issue-404分支。演示如下:

圖片描述

現(xiàn)在裙顽,我們回到dev分支上干活了付燥。

圖片描述

工作區(qū)是干凈的,那么我們工作現(xiàn)場(chǎng)去哪里呢愈犹?我們可以使用命令 git stash list來(lái)查看下键科。如下:

圖片描述

工作現(xiàn)場(chǎng)還在闻丑,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下勋颖,可以使用如下2個(gè)方法:

1.git stash apply恢復(fù)嗦嗡,恢復(fù)后,stash內(nèi)容并不刪除饭玲,你需要使用命令git stash drop來(lái)刪除侥祭。

2.另一種方式是使用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪除了。

演示如下

圖片描述

八:多人協(xié)作茄厘。

當(dāng)你從遠(yuǎn)程庫(kù)克隆時(shí)候矮冬,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來(lái)了,并且遠(yuǎn)程庫(kù)的默認(rèn)名稱(chēng)是origin次哈。

要查看遠(yuǎn)程庫(kù)的信息 使用 git remote

要查看遠(yuǎn)程庫(kù)的詳細(xì)信息 使用 git remote –v

如下演示:

圖片描述

一:推送分支:

? 推送分支就是把該分支上所有本地提交到遠(yuǎn)程庫(kù)中欢伏,推送時(shí),要指定本地分支亿乳,這樣硝拧,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上:

? 使用命令 git push origin master

比如我現(xiàn)在的github上的readme.txt代碼如下:

圖片描述

本地的readme.txt代碼如下:

圖片描述

現(xiàn)在我想把本地更新的readme.txt代碼推送到遠(yuǎn)程庫(kù)中,使用命令如下:

圖片描述

我們可以看到如上葛假,推送成功障陶,我們可以繼續(xù)來(lái)截圖github上的readme.txt內(nèi)容 如下:

圖片描述

可以看到 推送成功了,如果我們現(xiàn)在要推送到其他分支聊训,比如dev分支上抱究,我們還是那個(gè)命令 git push origin dev

那么一般情況下,那些分支要推送呢带斑?

master分支是主分支鼓寺,因此要時(shí)刻與遠(yuǎn)程同步。

一些修復(fù)bug分支不需要推送到遠(yuǎn)程去勋磕,可以先合并到主分支上妈候,然后把主分支master推送到遠(yuǎn)程去。

二:抓取分支:

多人協(xié)作時(shí)挂滓,大家都會(huì)往master分支上推送各自的修改】嘁現(xiàn)在我們可以模擬另外一個(gè)同事,可以在另一臺(tái)電腦上(注意要把SSH key添加到github上)或者同一臺(tái)電腦上另外一個(gè)目錄克隆赶站,新建一個(gè)目錄名字叫testgit2

但是我首先要把dev分支也要推送到遠(yuǎn)程去幔虏,如下

圖片描述

接著進(jìn)入testgit2目錄,進(jìn)行克隆遠(yuǎn)程的庫(kù)到本地來(lái)贝椿,如下:

圖片描述

現(xiàn)在目錄下生成有如下所示:

圖片描述

現(xiàn)在我們的小伙伴要在dev分支上做開(kāi)發(fā)想括,就必須把遠(yuǎn)程的origin的dev分支到本地來(lái),于是可以使用命令創(chuàng)建本地dev分支:git checkout –b dev origin/dev

現(xiàn)在小伙伴們就可以在dev分支上做開(kāi)發(fā)了烙博,開(kāi)發(fā)完成后把dev分支推送到遠(yuǎn)程庫(kù)時(shí)瑟蜈。

如下:

圖片描述

小伙伴們已經(jīng)向origin/dev分支上推送了提交烟逊,而我在我的目錄文件下也對(duì)同樣的文件同個(gè)地方作了修改,也試圖推送到遠(yuǎn)程庫(kù)時(shí)踪栋,如下:

圖片描述

由上面可知:推送失敗焙格,因?yàn)槲业男』锇樽钚绿峤坏暮臀以噲D推送的有沖突图毕,解決的辦法也很簡(jiǎn)單夷都,上面已經(jīng)提示我們,先用git pull把最新的提交從origin/dev抓下來(lái)予颤,然后在本地合并囤官,解決沖突,再推送蛤虐。

圖片描述

git pull也失敗了党饮,原因是沒(méi)有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接,根據(jù)提示驳庭,設(shè)置dev和origin/dev的鏈接:如下:

圖片描述

這回git pull成功刑顺,但是合并有沖突,需要手動(dòng)解決饲常,解決的方法和分支管理中的 解決沖突完全一樣蹲堂。解決后,提交贝淤,再push:

我們可以先來(lái)看看readme.txt內(nèi)容了柒竞。

圖片描述

現(xiàn)在手動(dòng)已經(jīng)解決完了,我接在需要再提交播聪,再push到遠(yuǎn)程庫(kù)里面去朽基。如下所示:

圖片描述

因此:多人協(xié)作工作模式一般是這樣的:

首先,可以試圖用git push origin branch-name推送自己的修改.

如果推送失敗离陶,則因?yàn)檫h(yuǎn)程分支比你的本地更新早稼虎,需要先用git pull試圖合并。

如果合并有沖突招刨,則需要解決沖突渡蜻,并在本地提交。再用git push origin branch-name推送计济。

感謝龍恩的貢獻(xiàn):http://www.cnblogs.com/tugenhua0707/p/4050072.html

參考阮老師整理的部分命令:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html茸苇。

一、新建代碼庫(kù)

# 在當(dāng)前目錄新建一個(gè)Git代碼庫(kù)$ git init# 新建一個(gè)目錄沦寂,將其初始化為Git代碼庫(kù)$ git init [project-name]# 下載一個(gè)項(xiàng)目和它的整個(gè)代碼歷史$ git clone [url]

二学密、配置

# 顯示當(dāng)前的Git配置$ git config --list# 編輯Git配置文件$ git config -e [--global]# 設(shè)置提交代碼時(shí)的用戶(hù)信息$ git config [--global] user.name"[name]"$ git config [--global] user.email"[email address]"

三、增加/刪除文件

# 添加指定文件到暫存區(qū)$ git add [file1] [file2] ...# 添加指定目錄到暫存區(qū)传藏,包括子目錄$ git add [dir]# 添加當(dāng)前目錄的所有文件到暫存區(qū)$ git add .# 添加每個(gè)變化前腻暮,都會(huì)要求確認(rèn)# 對(duì)于同一個(gè)文件的多處變化彤守,可以實(shí)現(xiàn)分次提交$ git add -p# 刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū)$ git rm [file1] [file2] ...# 停止追蹤指定文件哭靖,但該文件會(huì)保留在工作區(qū)$ git rm --cached [file]# 改名文件具垫,并且將這個(gè)改名放入暫存區(qū)$ git mv [file-original] [file-renamed]

四、代碼提交

# 提交暫存區(qū)到倉(cāng)庫(kù)區(qū)$ git commit -m [message]# 提交暫存區(qū)的指定文件到倉(cāng)庫(kù)區(qū)$ git commit [file1] [file2] ... -m [message]# 提交工作區(qū)自上次commit之后的變化试幽,直接到倉(cāng)庫(kù)區(qū)$ git commit -a# 提交時(shí)顯示所有diff信息$ git commit -v# 使用一次新的commit筝蚕,替代上一次提交# 如果代碼沒(méi)有任何新變化,則用來(lái)改寫(xiě)上一次commit的提交信息$ git commit --amend -m [message]# 重做上一次commit铺坞,并包括指定文件的新變化$ git commit --amend [file1] [file2] ...

五起宽、分支

# 列出所有本地分支$ git branch# 列出所有遠(yuǎn)程分支$ git branch -r# 列出所有本地分支和遠(yuǎn)程分支$ git branch -a# 新建一個(gè)分支,但依然停留在當(dāng)前分支$ git branch [branch-name]# 新建一個(gè)分支济榨,并切換到該分支$ git checkout -b [branch]# 新建一個(gè)分支坯沪,指向指定commit$ git branch [branch] [commit]# 新建一個(gè)分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系$ git branch --track [branch] [remote-branch]# 切換到指定分支擒滑,并更新工作區(qū)$ git checkout [branch-name]# 切換到上一個(gè)分支$ git checkout -# 建立追蹤關(guān)系腐晾,在現(xiàn)有分支與指定的遠(yuǎn)程分支之間$ git branch --set-upstream [branch] [remote-branch]# 合并指定分支到當(dāng)前分支$ git merge [branch]# 選擇一個(gè)commit,合并進(jìn)當(dāng)前分支$ git cherry-pick [commit]# 刪除分支$ git branch -d [branch-name]# 刪除遠(yuǎn)程分支$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]

六丐一、標(biāo)簽

# 列出所有tag$ git tag# 新建一個(gè)tag在當(dāng)前commit$ git tag [tag]# 新建一個(gè)tag在指定commit$ git tag [tag] [commit]# 刪除本地tag$ git tag -d [tag]# 刪除遠(yuǎn)程tag$ git push origin:refs/tags/[tagName]# 查看tag信息$ git show [tag]# 提交指定tag$ git push [remote] [tag]# 提交所有tag$ git push [remote] --tags# 新建一個(gè)分支藻糖,指向某個(gè)tag$ git checkout -b [branch] [tag]

七、查看信息

# 顯示有變更的文件$ git status# 顯示當(dāng)前分支的版本歷史$ git log# 顯示commit歷史钝诚,以及每次commit發(fā)生變更的文件$ git log --stat# 搜索提交歷史颖御,根據(jù)關(guān)鍵詞$ git log -S [keyword]# 顯示某個(gè)commit之后的所有變動(dòng),每個(gè)commit占據(jù)一行$ git log [tag] HEAD --pretty=format:%s# 顯示某個(gè)commit之后的所有變動(dòng)凝颇,其"提交說(shuō)明"必須符合搜索條件$ git log [tag] HEAD --grep feature# 顯示某個(gè)文件的版本歷史潘拱,包括文件改名$ git log --follow [file]$ git whatchanged [file]# 顯示指定文件相關(guān)的每一次diff$ git log -p [file]# 顯示過(guò)去5次提交$ git log -5--pretty --oneline# 顯示所有提交過(guò)的用戶(hù),按提交次數(shù)排序$ git shortlog -sn# 顯示指定文件是什么人在什么時(shí)間修改過(guò)$ git blame [file]# 顯示暫存區(qū)和工作區(qū)的差異$ git diff# 顯示暫存區(qū)和上一個(gè)commit的差異$ git diff --cached [file]# 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異$ git diff HEAD# 顯示兩次提交之間的差異$ git diff [first-branch]...[second-branch]# 顯示今天你寫(xiě)了多少行代碼$ git diff --shortstat"@{0 day ago}"# 顯示某次提交的元數(shù)據(jù)和內(nèi)容變化$ git show [commit]# 顯示某次提交發(fā)生變化的文件$ git show --name-only [commit]# 顯示某次提交時(shí)拧略,某個(gè)文件的內(nèi)容$ git show [commit]:[filename]# 顯示當(dāng)前分支的最近幾次提交$ git reflog

八芦岂、遠(yuǎn)程同步

# 下載遠(yuǎn)程倉(cāng)庫(kù)的所有變動(dòng)$ git fetch [remote]# 顯示所有遠(yuǎn)程倉(cāng)庫(kù)$ git remote -v# 顯示某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的信息$ git remote show [remote]# 增加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù),并命名$ git remote add [shortname] [url]# 取回遠(yuǎn)程倉(cāng)庫(kù)的變化垫蛆,并與本地分支合并$ git pull [remote] [branch]# 上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù)$ git push [remote] [branch]# 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)禽最,即使有沖突$ git push [remote] --force# 推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)$ git push [remote] --all

九、撤銷(xiāo)

# 恢復(fù)暫存區(qū)的指定文件到工作區(qū)$ git checkout [file]# 恢復(fù)某個(gè)commit的指定文件到暫存區(qū)和工作區(qū)$ git checkout [commit] [file]# 恢復(fù)暫存區(qū)的所有文件到工作區(qū)$ git checkout .# 重置暫存區(qū)的指定文件袱饭,與上一次commit保持一致川无,但工作區(qū)不變$ git reset [file]# 重置暫存區(qū)與工作區(qū),與上一次commit保持一致$ git reset --hard# 重置當(dāng)前分支的指針為指定commit虑乖,同時(shí)重置暫存區(qū)懦趋,但工作區(qū)不變$ git reset [commit]# 重置當(dāng)前分支的HEAD為指定commit,同時(shí)重置暫存區(qū)和工作區(qū)疹味,與指定commit一致$ git reset --hard [commit]# 重置當(dāng)前HEAD為指定commit仅叫,但保持暫存區(qū)和工作區(qū)不變$ git reset --keep [commit]# 新建一個(gè)commit帜篇,用來(lái)撤銷(xiāo)指定commit# 后者的所有變化都將被前者抵消,并且應(yīng)用到當(dāng)前分支$ git revert [commit]# 暫時(shí)將未提交的變化移除诫咱,稍后再移入$ git stash$ git stash pop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笙隙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坎缭,更是在濱河造成了極大的恐慌竟痰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻锁,死亡現(xiàn)場(chǎng)離奇詭異凯亮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)拉盾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讶迁,“玉大人,你說(shuō)我怎么就攤上這事名眉。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鸣戴,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粘拾,道長(zhǎng)窄锅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任缰雇,我火速辦了婚禮入偷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘械哟。我一直安慰自己疏之,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布暇咆。 她就那樣靜靜地躺著锋爪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爸业。 梳的紋絲不亂的頭發(fā)上其骄,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音扯旷,去河邊找鬼拯爽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛薄霜,可吹牛的內(nèi)容都是我干的某抓。 我是一名探鬼主播纸兔,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼否副!你這毒婦竟也來(lái)了汉矿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤备禀,失蹤者是張志新(化名)和其女友劉穎洲拇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曲尸,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赋续,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了另患。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纽乱。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昆箕,靈堂內(nèi)的尸體忽然破棺而出鸦列,到底是詐尸還是另有隱情,我是刑警寧澤鹏倘,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布薯嗤,位于F島的核電站,受9級(jí)特大地震影響纤泵,放射性物質(zhì)發(fā)生泄漏骆姐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一捏题、第九天 我趴在偏房一處隱蔽的房頂上張望玻褪。 院中可真熱鬧,春花似錦涉馅、人聲如沸归园。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庸诱。三九已至,卻和暖如春晤揣,著一層夾襖步出監(jiān)牢的瞬間桥爽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工昧识, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钠四,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缀去,于是被迫代替她去往敵國(guó)和親侣灶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345