文章目錄
-
- @[toc]
- git簡介
- 安裝git
- 建立版本庫
-
- 生成本地倉庫
- .git目錄
- git送出檔案到版本庫
- 版本管理
-
- 版本回退
- 工作區和暫存區
-
- 工作區
- 暫存區
- 分支管理
-
- 分支的建立、合并及解決沖突
- 遠端倉庫
-
- 建立遠端倉庫
- @[toc]
- git簡介
- 安裝git
- 建立版本庫
-
- 生成本地倉庫
- .git目錄
- git送出檔案到版本庫
- 版本管理
-
- 版本回退
- 工作區和暫存區
-
- 工作區
- 暫存區
- 分支管理
-
- 分支的建立、合并及解決沖突
- 遠端倉庫
-
- 建立遠端倉庫
git簡介
Git是目前世界上最騷,最先進的分布式版本控制系統,說到分布式管理系統那就不得先提下集中式管理系統,最典型的當屬我們常用的svn。
-
什麼是集中式管理系統
集中式版本管理系統版本庫是集中存放在中央伺服器的(例如公司的一台svn遠端伺服器),而我們開發的時候,用的都是自己的電腦,是以開發前要先從中央伺服器取得最新的版本,然後開始編碼,幹完活了,再把自己的代碼推送給中央伺服器。中央伺服器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。
-
什麼是分布式管理系統
分布式的版本控制就是每個人都可以建立一個獨立的代碼倉庫用于管理,各種版本控制的操作都可以在本地完成。分布式版本控制系統根本沒有"中央伺服器",每個人的電腦上都是一個完整的版本庫,這樣你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上,我們每次送出都隻需要先送出到本地就行。當多人協作開發時。可以将自己的修改推送給對方(當然實際開發中是沒得傻帽這樣做的)。是以,分布式版本控制系統通常也有一台充當“中央伺服器”的電腦,但這個伺服器的作用僅僅是用來友善“交換”大家的修改,沒有它大家也一樣幹活,隻是交換修改不友善而已。
- 分布式管理系統PK集中式管理系統
-
集中式管理系統(舉例svn)的優缺點
優點:
- 管理友善,邏輯明确,符合一般人思維習慣。
- 易于管理,集中式伺服器更能保證安全性。
- 代碼一緻性非常高。
- 适合開發人數不多的項目開發。
- 必須聯網才能工作,網絡不好的時候很難受。
- 伺服器一旦當機風險極大。
- svn按檔案存儲,伺服器壓力太大,按照原始檔案存儲,體積較大。
- 分支是一個完整的目錄,且這個目錄擁有完整的實際檔案,建立新的分支則所有的人都會擁有和你一樣的分支,一下載下傳就是整個目錄的代碼,不能安安靜靜的做個美男子。
-
分布式管理系統(舉例git)的優缺點:
優點:
- 每一個開發人員的電腦上都有一個倉庫,沒有網絡也可以commit,檢視曆史版本記錄,建立項目分支,等網絡再次連接配接上Push到遠端伺服器,而svn網絡不好或者沒網了啥也幹不了。
- git按照中繼資料方式存儲,體積很小,“.git”目錄是處于你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如标簽、分支、版本記錄等。
- 可以任意在自己的本地版本庫開啟無限個分支,别人并看不到,可以安安靜靜做個美男子,等到所有的做完了再推送到遠端伺服器,并且這個不需要這個分支時從本地版本庫删除這個分支即可。
- 代碼送出速度快、靈活,送出到本地倉庫比本地複制還快,與svn不同的是git是先送出到本地倉庫(其實已完成了送出),推送到遠端倉庫其實是在執行同步操作。
- 學習周期相對而言比較長。
- 不符合正常思維。
- 代碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有代碼和版本資訊。
-
安裝git
主要基于windows系統上的安裝簡單說明(用Linux的大神和Mac的土豪略過)
在Windows上使用Git,可以從Git官網(https://git-scm.com/downloads)直接下載下傳安裝程式,(網速慢的同學請移步國内鏡像),然後按預設選項安裝即可。 安裝完成後,在開始菜單裡找到“Git”->“Git Bash”,蹦出一個類似指令行視窗的東西,就說明Git安裝成功!
因為Git是分布式版本控制系統,是以,每個機器都必須自報家門:你的名字和Email位址,我們需要在gitBash中配置自己在姓名和郵箱(例如gitlab上面的使用者名和郵箱)。
$ git config --global user.name “zhengzhao”
$ git config --global user.email "[email protected]"
注意git config指令的–global參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名和Email位址,做法是在項目根目錄下進行單獨配置,不加–global。
$ git config user.name “zhengzhao”
$ git config user.email "[email protected]"
建立版本庫
生成本地倉庫
第一步、在本地建立一個空目錄,windows系統上確定目錄名(包括父目錄)不包含中文。
第二步、通過git init指令把這個目錄變成Git可以管理的倉庫。
.git目錄
主要包含HEAD,config,description檔案和branches、hooks、info、objects、refs五個檔案夾。
- hooks存放一些鈎子腳本。
- info檔案夾是全局性排除檔案,它和.gitignore是互補的。裡面就一個exclude檔案。
- objects存放所有資料。
- refs 送出對象的指針。
- 其中config是項目特有的Git配置檔案。
- description但是GitWeb專用的檔案。
- HEAD記錄目前被checkout的分支。
git送出檔案到版本庫
- 在git倉庫下建立一個本地檔案test1.txt。
- 用指令過git add 檔案名告訴git,把檔案添加到倉庫暫存區(後面細講),然後git commit,将檔案送出到倉庫,- m後面輸入的是本次送出的說明。用指令送出必須先add在commit,使用工具tortoisegit可以直接commit(應該是工具做了優化,commit時必須寫送出資訊)。
- 用add可反複多次使用,添加多個檔案,再使用commit全部送出。
版本管理
版本回退
版本管理這塊的講解就不用指令去說了,對于我們小白來說大部分還是用工具來完成的,主要講講用工具去回退,指令回退這塊大家可以去廖雪峰老師的部落格上看看
- 右鍵項目,選擇TortoiseGit,然後點選 show log。
- 選中需要回退到的代碼版本。
- 選擇 “Reset "master to this”。
- 選擇hard 。 最後我們打開log會看到head指向的是第四次送出,第五次送出沒了,head指向的版本就是目前版本,是以,Git允許我們在版本的曆史之間穿梭。
工作區和暫存區
工作區
電腦中存放檔案的目錄,例如我電腦中的E:\gittest目錄,.git目錄不是工作區,是以我們不要在裡面工作,它是我們的版本庫。
暫存區
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。
我們把檔案往Git版本庫裡添加的時候,是分兩步執行的:
第一步是用git add把檔案添加進去,實際上就是把檔案修改添加到暫存區;
第二步是用git commit送出更改,實際上就是把暫存區的所有内容送出到目前分支。
簡單了解為,需要送出的檔案修改通通放到暫存區,然後,一次性送出暫存區的所有修改。
底層實際實際操作(用指令執行)上面必須先add到緩存區然後commit到版本庫,add代表的意思不是新增的檔案而是一個将工作區内容add到暫存區,是以底層上哪怕修改的檔案也要先add,我們平時使用的工具例如TortoiseGit一般是直接可以commit,這是由于它内部先執行了add操作。是以,git add指令實際上就是把要送出的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改送出到分支。
分支管理
分支的建立、合并及解決沖突
在我們建立git倉庫的時候我們處于git的主分支即master分支,在遠端伺服器gitlab上建立項目同樣也是預設在主分支master。最開始的時候master分支是一條線,git用master指向最新的送出,在用HEAD指向master,即可确定目前分支。上面有說道在git中用HEAD表示目前版本,即最新的送出,它是一個指針。
每次送出,master都會向前移動,然後HEAD指向目前分支中最新的版本。
大家可能會覺得那我建立一個分支呢,是不是有兩個HEAD呢?不是,當我們建立新得分支develop,這時候develop指向master相同的送出,我們切換到develop分支,這時候HEAD會指向develop,就表示目前分支在develop上面,是以git中建立分支非常快速友善,隻是增加了一個develop的指針改變了HEAD的指向,工作區的檔案沒有發生任何變化,不像svn那樣每建一個分支都是要重建立一個目錄,然後将檔案全拷貝到新的分支目錄中,是以git中鼓勵大量使用分支。
當我們切換到develop分支後,對工作區的修改和送出就是針對develop分支了,沒新送出一次,develop指針往前移動一步而master指針不變
當我們在develop分支上完成了工作,就可以把develop分支合并到master上面來了,先切換到master,這時候HEAD指向哪裡?(坐等大家回答),我們在master上面合并develop,并沒有把develop的檔案改動合并到master,這是為什麼?很簡單,不要局限于分布式管理系統的思維,它是将指針從master主分支最後送出那個位置指向到了develop的目前的送出,是以git的合并隻是改改指針,非常快速友善。
下面我們開始用工具tortoisegit實戰演練:
- 在master主分支下建立檔案,并送出,此處就不展示圖形了,建立檔案test1.txt後直接用工具commit就行。
- 建立分支develop,右擊選擇Create Branch。
- 切換到develop分支,右擊選擇Switch/CheckOut,然後選擇develop分支即可。
- 我們對檔案test1.txt進行修改并commit,再切回到master分支,master分支中test1.txt是空的。
- 我們此時在master分支開始合并,git的合并規則是在目前分支上合并其他分支,我們此時在master主分支上面,右擊選擇Merge,并選中要合并的分支develop,點選ok,那麼我們合并成功,在master分支中可以看到test1.txt檔案中有了修改。
- 說道合并就不能不說說解決沖突,大家都繞不過去的坎,我們在master分支上将test1.txt檔案修改下,并送出,再切換到develop分支上修改檔案并送出,再切換到master上面合并develop分支,這時候test1.txt檔案就報沖突了。
- 如何解決呢?選中沖突的檔案右擊選擇edit conficts處理完沖突後選擇mark as resolved标記此檔案沖突已解決,然後送出。
###分支管理政策
此處推薦一片文章,實際工作中的分支使用講的賊好,我就偷個懶
https://blog.csdn.net/shusheng0007/article/details/80791849
遠端倉庫
建立遠端倉庫
上面說過git嚴格意義上是沒有中央伺服器的,每個個體本地電腦上都有一個倉庫,但是一方面為了整體的管理(集中式的優點),另一方面也是照顧大家正常邏輯的使用習慣,一般都會在遠端伺服器上托管,比較常見的例如全球最大同性交友網站github,碼雲(國内版的github),gitlab(github被微軟收購後崛起),以下我們就以gitlab為例簡單說明下。
- 注冊并登陸gitlab(此處略過~)。
- 建立項目,不過為了友善管理我們建立項目之前一般都要建立群組,群組你可以了解為一個可以設定使用者通路權限的檔案夾。
- 群組的管理,我們進入群組在成員清單可以邀請成員并配置設定權限,權限說明如下:
- 在群組中建立項目,建立成功後會展示如下,下面是我建的項目位址testgroup是群組,testproject是項目名,項目位址有HTTP和SSH兩種方式,可發送給開發人員下載下傳和初始化項目。(提示:通過SSH方式拉取推送項目代碼必須要導入SSH key,這個稍後再介紹)
HTTPS:https://git.dtinsure.com/testgroup/testproject.git
SSH:[email protected]:testgroup/testproject.git
- 生成SSH key并且配置到gitlab上
- 此時遠端倉庫預設的是主分支master,在遠端倉庫gitlab上面建立分支
- 配置使用者名和郵箱
git config --global user.name “zhengzhao”
git config --global user.email "[email protected]"
- 将遠端倉庫clone到本地,進入本地的一個檔案夾,用工具tortoisegit右擊 git clone,或者騷一點用指令去clone
git clone https://git.dtinsure.com/testgroup/testproject.git
- 唉,這是後你會發現一直要你輸密碼,你輸賬戶登入密碼還是會報錯,我也不太清楚這個到底該輸那個密碼,别急我們有更好的免密方式,生成秘鑰配置上去,直接用指令就不用tortoisegit(工具生成秘鑰要麻煩很多)了,右擊打開git bash輸入以下指令,然後一直enter。
ssh-keygen -t rsa -C "[email protected]" -b 4096
- 成功後顯示如下圖,然後我們将生成的公鑰配到gitlab上。
- 我們再次重複步驟7去clone即可将遠端倉庫clone到本地。
-
這時候我們本地倉庫和遠端倉庫都是空的,是以我們建立一個檔案推送(push)到遠端倉庫,注意流程是先add到暫存區(用工具省略這一步),然後commit到本地倉庫,然後push到遠端倉庫。
注意:在push到遠端伺服器時一定要先從遠端伺服器pull或者fetch。
- pull(拉取)和fetch(擷取)的差別,若是中文版的tortoisegit工具一定要注意這點,盡量按裝英文版的工具。
- pull(拉取),從遠端伺服器上拉取分支并直接合并到目前分支上,這個類似svn的update。
- fetch(擷取),從伺服器上擷取分支在本地生成一個新的分支FETCH-HEAD,不會自動合并,需要手動将master和FETCH-HEAD分支合并。 fetch相對而言要安全些,但是繁瑣一些,我們一般采用pull(拉取)即可。
- 遠端倉庫建立新的分支develop,如何将遠端分支develop同步到本地倉庫呢?這時候我們不能用步驟7去clone,因為clone的是整個倉庫而不是某一個分支,我們在本地倉庫同樣根據本地master主分支建立一個分支develop,并且在master上pull(拉取)遠端master,就可以将遠端倉庫branch資訊拉取到本地,這樣我們本地倉庫master和遠端倉庫master,本地分支develop和遠端分支develop就一一對應上了。