一、Git是什么呢?
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。那什么是版本控制系統(tǒng)?簡(jiǎn)單的點(diǎn)就是控制每次修改、提交后所有版本的集合。在這個(gè)版本控制系統(tǒng)中,你可以找到所有已經(jīng)修改過后的內(nèi)容。
二、Git與SVN的區(qū)別
SVN是集中式版本控制系統(tǒng),版本庫(kù)是集中放在服務(wù)器的,每次工作的時(shí)候,首先要從服務(wù)器上拿到最新代碼,然后工作,寫代碼,工作完成后,還要繼續(xù)推送到服務(wù)器上。這種集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,工作局限性就比較大,用著不是很方便。
Git是分布式版本控制系統(tǒng),本地就是版本倉(cāng)庫(kù),可以不用依賴網(wǎng)絡(luò),功能相當(dāng)強(qiáng)大。
三、創(chuàng)建版本庫(kù)
1、什么是版本庫(kù)?版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來,每個(gè)文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻可以“還原”。
所以,創(chuàng)建一個(gè)版本庫(kù)非常簡(jiǎn)單,創(chuàng)建一個(gè)空目錄:

這時(shí)候桌面上就有一個(gè)test文件夾了?;蛘咧苯釉谧烂嫔蟿?chuàng)建一個(gè)空的文件夾,然后cd到該文件目錄下。
2、把該目錄創(chuàng)建成版本管理倉(cāng)庫(kù):使用命令 git init

這樣該目錄就是版本管理倉(cāng)庫(kù)了,以后工作內(nèi)容都會(huì)提交到這個(gè)里面來。這個(gè)目錄是Git來跟蹤管理版本的,沒事千萬不要手動(dòng)亂改這個(gè)目錄里面的文件,否則,會(huì)把git倉(cāng)庫(kù)給破壞了
3、把文件提交到倉(cāng)庫(kù)里
首先在該文件下面創(chuàng)建一個(gè)read.txt文件:內(nèi)容為:helloworld
第一步:使用命令行 git add . 把內(nèi)容添加到暫存區(qū)里
第二步:用命令 git commit,把文件提交到倉(cāng)庫(kù)。
現(xiàn)在我們已經(jīng)提交了一個(gè)read.txt文件了,我們下面可以通過命令git status來查看是否還有文件未提交,如下:

上面說明已經(jīng)提交到倉(cāng)庫(kù)了,沒有需要提交的內(nèi)容。接著 我們修改下read里面的內(nèi)容:添加helloworld2 然后在查看狀態(tài)如下:

可以發(fā)現(xiàn),read已經(jīng)被修改了,但是還沒有提交到倉(cāng)庫(kù)里。那怎么辦呢?還是使用git add.和git commit -m ""命令提交。那每次都用這兩個(gè)命令是不是有點(diǎn)麻煩呢?有沒有簡(jiǎn)單點(diǎn)的呢?答案是git這么強(qiáng)大,那必須有的。把這兩個(gè)命令合成一個(gè)命令:git commit -a -m "" 就可以了。還有就是要養(yǎng)成一個(gè)習(xí)慣:當(dāng)你提交完成后,在執(zhí)行下git status這個(gè)命令,查看下當(dāng)前狀態(tài),以確保所有修改的內(nèi)容都已經(jīng)提交完成了。
四、添加遠(yuǎn)程庫(kù)(先有本地倉(cāng)庫(kù),后有遠(yuǎn)程倉(cāng)庫(kù))
公司里的項(xiàng)目代碼一般都是放在遠(yuǎn)程倉(cāng)庫(kù),以便多人開發(fā),多人使用。同時(shí)還可以備份項(xiàng)目代碼。那怎么創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)呢?首先,登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創(chuàng)建一個(gè)新的倉(cāng)庫(kù),然后 在Repository name填入test,其他保持默認(rèn)設(shè)置,點(diǎn)擊“Create repository”按鈕,就成功地創(chuàng)建了一個(gè)新的Git倉(cāng)庫(kù)。
目前遠(yuǎn)程倉(cāng)庫(kù)已經(jīng)創(chuàng)建好了,不過還是空的。那怎么將遠(yuǎn)程倉(cāng)庫(kù)和本地倉(cāng)庫(kù)關(guān)聯(lián)起來呢,使用下面命令:

記得把地址換成自己公司。添加后,遠(yuǎn)程庫(kù)的名字就是origin,這是Git默認(rèn)的叫法,也可以改成別的,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫(kù)。
下一步:可以把本地庫(kù)的所有內(nèi)容推送到遠(yuǎn)程庫(kù)上:使用命令git push -u origin master

由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。以后在推送時(shí) 就可以用git push origin master或者git push了。
五、從遠(yuǎn)程倉(cāng)庫(kù)克隆
一般進(jìn)去公司后,項(xiàng)目就可以在遠(yuǎn)程倉(cāng)庫(kù)已經(jīng)有了,你需要做的就是從遠(yuǎn)程倉(cāng)庫(kù)把代碼給克隆下,然后自己在做相應(yīng)的工作。那如何從遠(yuǎn)程倉(cāng)庫(kù)克隆呢?用命令git clone克隆一個(gè)本地庫(kù)如下:

其實(shí)你會(huì)發(fā)現(xiàn):git還支持另一種方式:SSH。這里使用的HTTPS,當(dāng)然你也可以用SSH,這個(gè)需要自己去生成一個(gè)后,添加進(jìn)去就可以了。
六、版本回退
1、工作中難免會(huì)有出錯(cuò)的地方,而有時(shí)候需要回歸到上一個(gè)版本或者之前的某一個(gè)版本。這是就需要版本回退功能了。但又有一個(gè)問題:可能之前有好多版本,而你也不知道到底是哪一個(gè)版本,這是就要用命令 git log 把所有提交的記錄打印下,我們就可以通過log來確認(rèn)自己需要回退的版本。如下:

git log命令顯示從最近到最遠(yuǎn)的顯示日志,如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline
2、現(xiàn)在我想使用版本回退操作,我想把當(dāng)前的版本回退到上一個(gè)版本,要使用什么命令呢?git reset --hard id 如下:

git reset --hard id中的id是commit id,git 就是通過這個(gè)id來找回對(duì)應(yīng)的版本,而這個(gè)id是怎么獲取的呢?通過git log命令,如第一步,就可以找到了。注:cat命令用來查看文件內(nèi)容
3、回到未來?,F(xiàn)在,你回退到了某個(gè)版本,然后想恢復(fù)到新版本怎么辦?找不到新版本的commit id怎么辦?Git提供了一個(gè)命令git reflog用來記錄你的每一次命令:

這樣就可以回到最新版本了。
4、撤銷修改
比如我現(xiàn)在在read.txt文件里面增加一行 內(nèi)容為12333,在我未提交之前,我發(fā)現(xiàn)添加12333內(nèi)容有誤,所以我得馬上恢復(fù)以前的版本,現(xiàn)在我可以有如下幾種方法可以做修改:
第一:如果我知道要?jiǎng)h掉那些內(nèi)容的話,直接手動(dòng)更改去掉那些需要的文件,然后add添加到暫存區(qū),最后commit掉。
第二:我可以按以前的方法直接恢復(fù)到上一個(gè)版本。使用 git reset? –hard HEAD^
但是現(xiàn)在我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操作呢?可以使用git checkout? — file 可以丟棄工作區(qū)的修改。
命令 git checkout –read.txt 意思就是,把read.txt文件在工作區(qū)做的修改全部撤銷,這里有2種情況,如下:read.txt自動(dòng)修改后,還沒有放到暫存區(qū),使用 撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)。另外一種是read.txt已經(jīng)放入暫存區(qū)了,接著又作了修改,撤銷修改就回到添加暫存區(qū)后的狀態(tài)。(注:git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個(gè)分支”的命令)
5、刪除修改
現(xiàn)在我們?cè)趖est文件下添加b.txt文件,如下:

可以發(fā)現(xiàn),現(xiàn)在test目錄下面有兩個(gè)文件:b.txt和read.txt.(注:lb命令查看當(dāng)前目錄的內(nèi)容)
現(xiàn)在我們想刪除b.txt文件,怎么辦呢?把文件管理器中把沒用的文件刪了,或者用rm命令刪了:

然后用ls命令查看,發(fā)現(xiàn)只剩下read.txt文件了。當(dāng)然,如果我想徹底從版本庫(kù)中刪掉了此文件的話,可以再執(zhí)行commit命令 提交就可以的。
七、分支管理
1.創(chuàng)建與合并
首先創(chuàng)建一個(gè)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)。
現(xiàn)在我們?cè)赿ev上面開發(fā)了。我在read.txt添加一句話:這個(gè)是dev分支添加的Helloworld 如下:

dev工作已經(jīng)做完了,現(xiàn)在切換到master分支上面,使用命令:git checkout master 然后使用cat read.txt命令查看內(nèi)容,發(fā)現(xiàn)master分支沒有剛剛添加的內(nèi)容。說明我們剛剛是在dev上面開發(fā)的,還沒有把內(nèi)容合并到主分支上。
合并分支:使用命令git merge dev 在master主分支來合并dev分支如下:

git merge命令用于合并指定分支到當(dāng)前分支上,合并后,再查看read.txt內(nèi)容,可以看到,和dev分支最新提交的是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非???。
合并完成后,留著dev分支也沒有用途了,我們可以接著刪除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
2、解決沖突
Git用<<<<<<<,=======,>>>>>>>標(biāo)記出 不同分支的內(nèi)容,通過標(biāo)記來找到?jīng)_突,然后解決,在提交就可以了。
3、分支管理策略。
通常合并分支時(shí),git一般使用”Fast forward”模式,在這種模式下,刪除分支后,會(huì)丟掉分支信息,現(xiàn)在我們來使用帶參數(shù) –no-ff來禁用”Fast forward”模式。首先我們來做demo演示下:
1)、創(chuàng)建一個(gè)dev分支。
2)、修改readme.txt內(nèi)容。
3)、添加到暫存區(qū)。
4)、切換回主分支(master)。
5)、合并dev分支,使用命令 git merge –no-ff? -m “注釋” dev
6)、查看歷史記錄
分支策略:首先master主分支應(yīng)該是非常穩(wěn)定的,也就是用來發(fā)布新版本,一般情況下不允許在上面干活,干活一般情況下在新建的dev分支上干活,干完后,比如上要發(fā)布,或者說dev分支代碼穩(wěn)定后可以合并到主分支master上來。
4、多人協(xié)作:多人協(xié)作時(shí),大家都會(huì)往master分支上推送各自的修改
1)、推送分支:
? ? ? ? 就是把該分支上所有本地提交到遠(yuǎn)程庫(kù)中,推送時(shí),要指定本地分支,這樣,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上:使用命令:git push origin master,如果我們現(xiàn)在要推送到其他分支,比如dev分支上,我們還是那個(gè)命令 git push origin dev
那么一般情況下,那些分支要推送呢?
master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步。
一些修復(fù)bug分支不需要推送到遠(yuǎn)程去,可以先合并到主分支上,然后把主分支master推送到遠(yuǎn)程去。
2)、拉取分支:
有這么一種情況:假如我把本地dev分支推送到遠(yuǎn)程服務(wù)器上,之后另一位同事,拉取代碼后,也需要在dev分支上開發(fā),而他的本地沒有dev分支,怎么辦呢?很簡(jiǎn)單,使用命令:git checkout? –b dev origin/dev, 現(xiàn)在小伙伴們就可以在dev分支上做開發(fā)了,開發(fā)完成后把dev分支推送到遠(yuǎn)程庫(kù)時(shí)。
另一種情況:我已經(jīng)在我的本地dev分支開發(fā)了,然而并沒有和遠(yuǎn)程的dev分支關(guān)聯(lián),這是同樣是push不了的。怎么辦呢?使用命令:git branch --set-upstream dev origin/dev,將本地dev和遠(yuǎn)程dev關(guān)聯(lián)起來就可以了
這樣git pull成功,但是合并有沖突,需要手動(dòng)解決,解決的方法和分支管理中的 解決沖突完全一樣。解決后,提交,再push:
多人協(xié)作工作模式一般是這樣的:
首先,可以試圖用git push origin branch-name推送自己的修改.
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新早,需要先用git pull試圖合并。
如果合并有沖突,則需要解決沖突,并在本地提交。再用git push origin branch-name推送。
如果git pull提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name。
Git常用命令
mkdir:? ? ? ? XX (創(chuàng)建一個(gè)空目錄 XX指目錄名)
pwd:? ? ? ? ? 顯示當(dāng)前目錄的路徑。
git init? ? ? ? ? 把當(dāng)前的目錄變成可以管理的git倉(cāng)庫(kù),生成隱藏.git文件。
git add XX? ? ? 把xx文件添加到暫存區(qū)去。
git commit –m “XX”? 提交文件 –m 后面的是注釋。
git status? ? ? ? 查看倉(cāng)庫(kù)狀態(tài)
git diff? XX? ? ? 查看XX文件修改了那些內(nèi)容
git log? ? ? ? ? 查看歷史記錄
git reset? –hard HEAD^ 或者 git reset? –hard HEAD~ 回退到上一個(gè)版本
(如果想回退到100個(gè)版本,使用git reset –hard HEAD~100 )
cat XX? ? ? ? 查看XX文件內(nèi)容
git reflog? ? ? 查看歷史記錄的版本號(hào)id
git checkout — XX? 把XX文件在工作區(qū)的修改全部撤銷。
git rm XX? ? ? ? ? 刪除XX文件
git remote add origin 關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù)
git push –u(第一次要用-u 以后不需要) origin master 把當(dāng)前master分支推送到遠(yuǎn)程庫(kù)
git clone ?從遠(yuǎn)程庫(kù)中克隆
git checkout –b dev? 創(chuàng)建dev分支 并切換到dev分支上
git branch? 查看當(dāng)前所有的分支
git checkout master 切換回master分支
git merge dev? ? 在當(dāng)前的分支上合并dev分支
git branch –d dev 刪除dev分支
git branch name? 創(chuàng)建分支
git stash 把當(dāng)前的工作隱藏起來 等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作
git stash list 查看所有被隱藏的文件列表
git stash apply 恢復(fù)被隱藏的文件,但是內(nèi)容不刪除
git stash drop 刪除文件
git stash pop 恢復(fù)文件的同時(shí) 也刪除文件
git remote 查看遠(yuǎn)程庫(kù)的信息
git remote –v 查看遠(yuǎn)程庫(kù)的詳細(xì)信息
git push origin master? Git會(huì)把master分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上
git tag <tagname>用于新建一個(gè)標(biāo)簽
git tag可以查看所有標(biāo)簽。
命令git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
git push origin --tags可以推送全部未推送過的本地標(biāo)簽;
git tag -d<tagname>可以刪除一個(gè)本地標(biāo)簽;
git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。