Git的安装与使用
一、Git簡(jiǎn)介:
1、分布式:Git版本控制系統(tǒng)是一個(gè)分布式的系統(tǒng),是用來保存工程源代碼歷史狀態(tài)的命令行工具。
2、保存點(diǎn):Git的保存點(diǎn)可以追蹤源碼中的文件, 并能得到某一個(gè)時(shí)間點(diǎn)上的整個(gè)工程項(xiàng)目的狀態(tài);可以在該保存點(diǎn)將多人提交的源碼合并, 也可以回退到某一個(gè)保存點(diǎn)上。
3、Git離線操作性:Git可以離線進(jìn)行代碼提交,因此它稱得上是完全的分布式處理,Git所有的操作不需要在線進(jìn)行;這意味著Git的速度要比SVN等工具快得多,因?yàn)镾VN等工具需要在線時(shí)才能操作,如果網(wǎng)絡(luò)環(huán)境不好, 提交代碼會(huì)變得非常緩慢。
4、Git基于快照:SVN等老式版本控制工具是將提交點(diǎn)保存成補(bǔ)丁文件,Git提交是將提交點(diǎn)指向提交時(shí)的項(xiàng)目快照,提交的東西包含一些元數(shù)據(jù)(作者,日期,GPG等)。
5、Git的分支和合并:分支模型是Git最顯著的特點(diǎn),因?yàn)檫@改變了開發(fā)者的開發(fā)模式,SVN等版本控制工具將每個(gè)分支都要放在不同的目錄中,Git可以在同一個(gè)目錄中切換不同的分支。
6、分支即時(shí)性:創(chuàng)建和切換分支幾乎是同時(shí)進(jìn)行的,用戶可以上傳一部分分支,另外一部分分支可以隱藏在本地,不必將所有的分支都上傳到GitHub中去。
7、分支靈活性:用戶可以隨時(shí)創(chuàng)建、合并、刪除分支,多人實(shí)現(xiàn)不同的功能,可以創(chuàng)建多個(gè)分支進(jìn)行開發(fā),之后進(jìn)行分支合并,這種方式使開發(fā)變得快速、簡(jiǎn)單、安全
另外Git和SVN的主要區(qū)別:
SVN是集中式版本控制系統(tǒng),版本庫(kù)是集中放在中央服務(wù)器的,而干活的時(shí)候,用的都是自己的電腦,所以首先要從中央服務(wù)器那里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)還可以,帶寬夠大,速度夠快,如果在互聯(lián)網(wǎng)下,如果網(wǎng)速慢的話,就非常慢了。
Git是分布式版本控制系統(tǒng),那么它就沒有中央服務(wù)器的,每個(gè)人的電腦就是一個(gè)完整的版本庫(kù),這樣,工作的時(shí)候就不需要聯(lián)網(wǎng)了,因?yàn)榘姹径际窃谧约旱碾娔X上。既然每個(gè)人的電腦都有一個(gè)完整的版本庫(kù),那多個(gè)人如何協(xié)作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時(shí),你們兩之間只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了
二、Git下載地址、安裝及配置教程:
https://blog.csdn.net/zx1996119/article/details/80814752
三、利用Git創(chuàng)建版本庫(kù)
版本庫(kù)又名倉(cāng)庫(kù),英文名repository,你可以簡(jiǎn)單的理解一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來,每個(gè)文件的修改,刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻還可以將文件還原。
1,首先,選擇一個(gè)合適的路徑(我選擇了D盤,我的電腦是Win 7),常見一個(gè)空目錄
$ cd D: //打開路徑
$ cd Repository //打開路徑下的文件夾
$ mkdir testGit //在Repository文件夾下的創(chuàng)建testGit 文件夾
$ pwd //顯示當(dāng)前的路徑
/d/Repository/testGit
2,通過git init命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù):
$ git init
Initialized empty Git repository in d:Repository/testGit /.git
這時(shí)候你當(dāng)前testGit目錄下會(huì)多了一個(gè).git的目錄,這個(gè)目錄是Git來跟蹤管理版本的,沒事千萬不要手動(dòng)亂改這個(gè)目錄里面的文件,否則,會(huì)把git倉(cāng)庫(kù)給破壞了(.git目錄為隱藏文件),這樣就創(chuàng)建了你的Git倉(cāng)庫(kù)。
3,把文件添加到版本庫(kù)中
首先要明確下,所有的版本控制系統(tǒng),只能跟蹤文本文件的改動(dòng),比如txt文件,網(wǎng)頁,所有程序的代碼等,Git也不列外,版本控制系統(tǒng)可以告訴你每次的改動(dòng),但是圖片,視頻這些二進(jìn)制文件,雖能也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)串起來,也就是知道圖片從1kb變成2kb,但是到底改了啥,版本控制也不知道。
(1) 在版本庫(kù)testGit目錄下新建一個(gè)記事本文件 readme.txt ,使用git add將文件添加到倉(cāng)庫(kù):
$ git add readme.txt
(2)使用git commit將文件提交到倉(cāng)庫(kù):
git commit -m "wrote a readme file" //注:git commit命令,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄
(3)可以通過命令git status來查看是否還有文件未提交:
說明沒有任何文件未提交
(4)如果修改readme.txt內(nèi)容,可繼續(xù)使用git status來查看下結(jié)果,如下:
上面的命令告訴我們 readme.txt文件已被修改,但是未被提交的修改。接下來可以使用git diff readme.txt 命令看下readme.txt文件到底改了什么內(nèi)容,知道了對(duì)readme.txt文件做了什么修改后,我們可以放心的提交到倉(cāng)庫(kù)了,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit,如上所述)
3,版本回退
已經(jīng)對(duì)readme.txt文件做了修改,那么可以使用命令 git log 查看修改的歷史記錄。
注:最后你可能會(huì)碰到這個(gè)(END),此后你怎么點(diǎn)都沒有用。那么現(xiàn)在你要輸入:wq或:q退出。這個(gè)命令同linux指令
git log命令顯示從最近到最遠(yuǎn)的顯示日志,我們可以看到最近兩次次提交,如果嫌顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline
使用版本回退操作,想把當(dāng)前的版本回退到上一個(gè)版本,可以使用如下2種命令,第一種是:git reset --hard HEAD^ 那么如果要回退到上上個(gè)版本只需把HEAD^ 改成 HEAD^^ 以此類推。那如果要回退到前100個(gè)版本的話,使用上面的方法肯定不方便,我們可以使用下面的簡(jiǎn)便命令操作:git reset --hard HEAD~100 即可。
回退之后可通過命令cat readme.txt再來查看下 readme.txt內(nèi)容,另外我們可以繼續(xù)使用git log 來查看下歷史記錄信息
我們可以通過版本號(hào)回退,使用命令方法如下:
git reset --hard 版本號(hào)
可以通過git reflog命令即可獲取到版本號(hào)
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
前面的數(shù)字是commit id。知道commit id可以回退上一次執(zhí)行的命令,回退命令為git reset --hard :
四:理解工作區(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。
我們前面說過使用Git提交文件到版本庫(kù)有兩步:
第一步:是使用 git add 把文件添加進(jìn)去,實(shí)際上就是把文件添加到暫存區(qū)。
第二步:使用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支上。
五、Git撤銷修改和刪除文件操作
1,首先在做撤銷之前,可以先用 git status 查看下當(dāng)前的狀態(tài)。
在未提交之前,我發(fā)現(xiàn)內(nèi)容有誤,所以得馬上恢復(fù)以前的版本,現(xiàn)在可以有如下幾種方法可以做修改:
第一:如果我知道要?jiǎng)h掉那些內(nèi)容的話,直接手動(dòng)更改去掉那些需要的文件,然后add添加到暫存區(qū),最后commit掉。
第二:我可以按以前的方法直接恢復(fù)到上一個(gè)版本。使用 git reset --hard HEAD^
第三:命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作區(qū)做的修改全部撤銷,這里有2種情況,如下:
readme.txt自動(dòng)修改后,還沒有放到暫存區(qū),使用 撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)。
另外一種是readme.txt已經(jīng)放入暫存區(qū)了,接著又作了修改,撤銷修改就回到添加暫存區(qū)后的狀態(tài)。
注意:命令git checkout -- readme.txt 中的 -- 很重要,如果沒有 -- 的話,那么命令變成創(chuàng)建分支了
2,一般情況下,可以直接在文件目錄中把文件刪了,或者使用命令rm xx ,如果想徹底從版本庫(kù)中刪掉了此文件的話,可以再執(zhí)行commit命令 提交掉; 只要沒有commit之前,如果想在版本庫(kù)中恢復(fù)此文件可以使用命令 git checkout – xx
六、創(chuàng)建遠(yuǎn)程創(chuàng)庫(kù)
1, 先注冊(cè)github賬號(hào),由于你的本地Git倉(cāng)庫(kù)和github倉(cāng)庫(kù)之間的傳輸是通過SSH加密的,所以需要一點(diǎn)設(shè)置:
第一步:創(chuàng)建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件,如果有的話,直接跳過此如下命令
id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
如果沒有的話,打開命令行,輸入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”,
詳見:https://blog.csdn.net/happystarycy/article/details/52490183
第二步:登錄github,打開” settings”中的SSH Keys頁面,然后點(diǎn)擊“Add SSH Key”,填上任意title,在Key文本框里黏貼id_rsa.pub文件的內(nèi)容。
,2,添加遠(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ù)可以作為備份,又可以其他人通過該倉(cāng)庫(kù)來協(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ù):
現(xiàn)在,我們根據(jù)GitHub的提示,在本地的testgit倉(cāng)庫(kù)下運(yùn)行命令:
git remote add origin https://github.com/賬戶名/testGit.git
把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,使用 git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
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)化命令。推送成功后,可以立刻在github頁面中看到遠(yuǎn)程庫(kù)的內(nèi)容已經(jīng)和本地一模一樣了,上面的要輸入github的用戶名和密碼。
從現(xiàn)在起,只要本地作了提交,就可以通過如下命令:
git push origin master
把本地master分支的最新修改推送到github上了,現(xiàn)在你就擁有了真正的分布式版本庫(kù)了。
3,從遠(yuǎn)程庫(kù)克隆到本地創(chuàng)庫(kù)
首先,登錄github,創(chuàng)建一個(gè)新的倉(cāng)庫(kù),名字叫testgit2.如下:
現(xiàn)在,遠(yuǎn)程庫(kù)已經(jīng)準(zhǔn)備好了,下一步是使用命令git clone克隆一個(gè)本地庫(kù)了
git clone https://github.com/賬戶名/testgit2
接著在本地目錄下 生成testgit2目錄了
七、創(chuàng)建與合并分支
1, 在版本回填退里,你已經(jīng)知道,每次提交,Git都把它們串成一條時(shí)間線,這條時(shí)間線就是一個(gè)分支。截止到目前,只有一條時(shí)間線,在Git里,這個(gè)分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。
git checkout 命令加上 –b參數(shù)表示創(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,分支管理策略:通常合并分支時(shí),git一般使用”Fast forward”模式,在這種模式下,刪除分支后,會(huì)丟掉分支信息,現(xiàn)在使用帶參數(shù) –no-ff來禁用”Fast forward”模式
創(chuàng)建一個(gè)dev分支。修改readme.txt內(nèi)容。添加到暫存區(qū)。切換回主分支(master)。合并dev分支,使用命令 git merge –no-ff -m “注釋” dev查看歷史記錄
分支策略:首先master主分支應(yīng)該是非常穩(wěn)定的,也就是用來發(fā)布新版本,一般情況下不允許在上面干活,干活一般情況下在新建的dev分支上干活,干完后,比如上要發(fā)布,或者說dev分支代碼穩(wěn)定后可以合并到主分支master上來。
八、bug分支
在開發(fā)中,會(huì)經(jīng)常碰到bug問題,那么有了bug就需要修復(fù),在Git中,分支是很強(qiáng)大的,每個(gè)bug都可以通過一個(gè)臨時(shí)分支來修復(fù),修復(fù)完成后,合并分支,然后將臨時(shí)的分支刪除掉
當(dāng)工作進(jìn)行到一半時(shí)候,我們還無法提交,比如一個(gè)分支bug要2天完成,但是我issue-404 bug需要5個(gè)小時(shí)內(nèi)完成。怎么辦呢?Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng) ”隱藏起來”,等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作。
所以現(xiàn)在我可以通過創(chuàng)建issue-404分支來修復(fù)bug了。首先我們要確定在那個(gè)分支上修復(fù)bug,比如我現(xiàn)在是在主分支master上來修復(fù)的,現(xiàn)在我要在master分支上創(chuàng)建一個(gè)臨時(shí)分支, 修復(fù)完成后,切換到master分支上,并完成合并,最后刪除issue-404分支。
現(xiàn)在,我們回到dev分支上干活了。
工作區(qū)是干凈的,我們可以使用命令 git stash list來查看。工作現(xiàn)場(chǎng)還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,可以使用如下2個(gè)方法:
git stash apply恢復(fù),恢復(fù)后,stash內(nèi)容并不刪除,你需要使用命令git stash drop來刪除。
另一種方式是使用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)起來了,并且遠(yuǎn)程庫(kù)的默認(rèn)名稱是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)在要推送到其他分支,比如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ù)到本地來;
現(xiàn)在我們要在dev分支上做開發(fā),就必須把遠(yuǎn)程的origin的dev分支到本地來,于是可以使用命令創(chuàng)建本地dev分支:git checkout –b dev origin/dev
現(xiàn)在就可以在dev分支上做開發(fā)了,開發(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抓下來,然后在本地合并,解決沖突,再推送。
git pull也失敗了,原因是沒有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接,根據(jù)提示,設(shè)置dev和origin/dev的鏈接
這回git pull成功,但是合并有沖突,需要手動(dòng)解決,解決的方法和分支管理中的 解決沖突完全一樣。解決后,提交,再push
因此:多人協(xié)作工作模式一般是這樣的:
首先,可以試圖用git push origin branch-name推送自己的修改.
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新早,需要先用git pull試圖合并。
如果合并有沖突,則需要解決沖突,并在本地提交。再用git push 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)idgit checkout -- XX 把XX文件在工作區(qū)的修改全部撤銷。git rm XX 刪除XX文件git remote add origin https://github.com/tugenhua0707/testgit 關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù)git push –u(第一次要用-u 以后不需要) origin master 把當(dāng)前master分支推送到遠(yuǎn)程庫(kù)git clone https://github.com/tugenhua0707/testgit 從遠(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)程分支上
總結(jié)
- 上一篇: C++多线程之间,线程函数启动之后,多线
- 下一篇: 釜山行有的2部吗?讲的是啥?