從私有Git倉(cāng)庫(kù)的搭建到命令的使用再到分支管理,全流程全套服務(wù)包您滿意
文章目錄
- 6. 分支管理
1. Git是什么?
Git是一款開(kāi)源的分布式版本控制系統(tǒng),可以有效,高速處理從很小到非常大的項(xiàng)目版本管理。 Git是通過(guò)C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)的。
2. Git與SVN的比較
Git和SVN是兩種截然不同的版本控制系統(tǒng),Git是分布式版本控制系統(tǒng),而SVN則是集中式版本控制系統(tǒng)。要想比較Git和SVN的區(qū)別,首先需要了解分布式版本控制系統(tǒng)和集中式版本控制系統(tǒng)的基本概念。
集中式版本控制系統(tǒng):一個(gè)顯著的特征是版本庫(kù)是存放在中央服務(wù)器上的,由中央服務(wù)器統(tǒng)一管理項(xiàng)目的版本信息和分支信息。團(tuán)隊(duì)中的每個(gè)成員在工作時(shí)都需要先從中央服務(wù)器上拉取最新的代碼,然后開(kāi)始干活。干完活之后再將代碼提交到中央服務(wù)器上。集中式版本服務(wù)器有兩個(gè)弊端:
- 必須聯(lián)網(wǎng)才能工作,當(dāng)沒(méi)有網(wǎng)絡(luò)或者網(wǎng)絡(luò)很差時(shí),則團(tuán)隊(duì)中的成員無(wú)法協(xié)同工作。
- 安全性不好,因?yàn)榘姹編?kù)存放在了中央服務(wù)器,當(dāng)中央服務(wù)器損壞時(shí)則會(huì)丟失版本庫(kù),使所有成員都沒(méi)法工作。
集中式版本控制系統(tǒng)的網(wǎng)絡(luò)拓?fù)鋱D如下圖所示:
可以看出團(tuán)隊(duì)中所有成員的工作電腦都只與中央服務(wù)器打交道。如果把版本庫(kù)比做書(shū)庫(kù)的話,那么每個(gè)人(每個(gè)電腦)都需要先從書(shū)庫(kù)借到書(shū)(拉取最新的代碼),閱讀完之后然后還給書(shū)庫(kù)(修改之后提交到中央服務(wù)器)
分布式版本控制系統(tǒng): 與集中式版本控制系統(tǒng)最大的不同是團(tuán)隊(duì)中所有成員的工作電腦上都有一個(gè)完整的版本庫(kù),并且沒(méi)有中央服務(wù)器。,這就相當(dāng)于團(tuán)隊(duì)中每個(gè)成員都有一個(gè)自己的小書(shū)庫(kù)(版本庫(kù)),成員之間可以互相交換自己書(shū)庫(kù)中的圖書(shū)(將自己的修改提交給對(duì)方)。這里完全不需要中央服務(wù)器來(lái)管理協(xié)調(diào)管理。
在實(shí)際使用分布式版本控制系統(tǒng)時(shí),其實(shí)很少在兩人之間的電腦上進(jìn)行版本庫(kù)推送,這是因?yàn)橛袝r(shí)候你們不在同一個(gè)局域網(wǎng)內(nèi),或者你同事的電腦關(guān)機(jī)了。因此,分布式版本控制系統(tǒng)通常也有一臺(tái)充當(dāng)“中央服務(wù)器”的電腦,但這個(gè)服務(wù)器的作用僅僅是用來(lái)方便“交換”大家的修改,沒(méi)有它大家也一樣干活,只是交換修改不方便而已。這臺(tái)充當(dāng)“中央服務(wù)器”的電腦上的版本庫(kù)稱(chēng)之為遠(yuǎn)程版本庫(kù),其他成員電腦上的版本庫(kù)稱(chēng)之為本地版本庫(kù)。后面會(huì)詳細(xì)介紹。
分布式版本控制系統(tǒng)的網(wǎng)絡(luò)拓?fù)鋱D如下圖所示:
分布式版本控制系統(tǒng)剔除了中央服務(wù)器,這充分體現(xiàn)了分布式的核心概念,就是去中心化。這樣帶來(lái)的好處有兩點(diǎn):
- 沒(méi)有網(wǎng)絡(luò)也能上班:團(tuán)隊(duì)中的每個(gè)成員在沒(méi)有網(wǎng)絡(luò)的情況下也能工作,因?yàn)楸镜赜型暾陌姹編?kù),不需要擔(dān)心數(shù)據(jù)的丟失。
- 數(shù)據(jù)更安全:當(dāng)某個(gè)成員的電腦壞掉了不要緊,只需要從其他成員的電腦上復(fù)制一份即可。但是集中式版本控制系統(tǒng)的中央服務(wù)器出問(wèn)題,則可能會(huì)丟失版本庫(kù),使得所有人都沒(méi)法工作。
3. 系統(tǒng)環(huán)境
系統(tǒng) | 版本 |
---|---|
Windows | Windows10 |
Linux | Ubuntu16.04 |
4. 安裝Git客戶端
說(shuō)完了Git的基本概念,接下來(lái)還是安裝個(gè)Git客戶端下來(lái)耍一耍。這里分不同的操作系統(tǒng)簡(jiǎn)單的介紹一下Git客戶端的安裝。
Linux系統(tǒng)下
首先通過(guò)git --version
命令查看電腦上是否已經(jīng)安裝了Git客戶端。
如果已經(jīng)安裝了就可以跳過(guò)此章節(jié)。如果沒(méi)有安裝的話就接著往下面看:
Linux系統(tǒng)有不同的發(fā)行版本,可以通過(guò)cat /proc/version
命令查看Linux的版本。
- Debian或Ubuntu下安裝Git
在 Debian或Ubuntu可以通過(guò)apt包管理工具安裝Git,命令如下:
sudo apt-get install git
- Red Hat 或者CentOS下安裝Git
Red Hat 或者CentOS下可以通過(guò)yum包管理工具安裝Git,命令如下:
yum install git -y
如果找不到y(tǒng)um命令的話,則需要先安裝yum工具。可以參考下面命令
#刪除yum.repos.d目錄下所有文件
rm -f /etc/yum.repos.d/*
#然后重新下載阿里的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#清理緩存
yun clean all
Windows系統(tǒng)下
Git的官方下載地址是:Git的下載地址
下載好安裝包之后,一直點(diǎn)擊下一步即可安裝。再次就不在贅述。
5.本地版本庫(kù)操作
Windows下安裝好Git之后會(huì)出現(xiàn)Git Bash 和Git GUI兩個(gè)應(yīng)用程序,其中Git Bash是Git的命令行工具,而Git GUI則是Git的可視化工具(一般很少用)。
創(chuàng)建本地版本庫(kù)
創(chuàng)建本地版本庫(kù)分為兩步:
第一步是創(chuàng)建一個(gè)空文件夾,命名為: git_learn。
第二步就是在該文件夾下執(zhí)行git init
命令將該文件夾變成git可以管理的版本庫(kù)。
執(zhí)行第二步之后,在 git_learn目錄下會(huì)出現(xiàn)一個(gè)名為.git的隱藏文件夾,該文件夾就是git的版本庫(kù)。切記不要手動(dòng)修改.git文件夾下的任何內(nèi)容,以免本地版本庫(kù)不可用。
本地版本庫(kù)建好之后就可以在git_learn文件夾下創(chuàng)建一個(gè)文件進(jìn)行測(cè)試了。這里創(chuàng)建了一個(gè)名為readme.txt的文件。
添加到暫存區(qū)
通過(guò)git add readme.txt
命令可以將readme.txt文件提交到暫存區(qū)(關(guān)于暫存區(qū)的概念后面會(huì)詳細(xì)介紹)。如果有多個(gè)文件需要添加的話,可以執(zhí)行git add .
命令。
提交到版本庫(kù)
因?yàn)間it的本地都是有完整版本庫(kù)的,所以還需要將前面創(chuàng)建的readme.txt文件提交到本地版本庫(kù)的當(dāng)前分支,默認(rèn)是master。命令格式是git commit -m '<message>'
,其中寫(xiě)入你的提交備注。
工作區(qū)和暫存區(qū)
這里有兩個(gè)很重要的概念,一個(gè)是工作區(qū),另一個(gè)是暫存區(qū)(Git特有的概念)。
工作區(qū)
工作區(qū)就是你電腦上能看到的目錄(不包括隱藏文件),例如:git_learn目錄就是一個(gè)工作區(qū)。
暫存區(qū)
工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù),其中最重要的是暫存區(qū)(stage)。
還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支叫master,以及指向master的一個(gè)指針叫HEAD。
前面提到了工作區(qū),暫存區(qū),git add
命令和git comit
命令。那么他們之間有啥關(guān)系呢?下面就用一張流程圖展示一下:
通過(guò)add命令將工作區(qū)中ABC文件夾提交到暫存區(qū)stage,在通過(guò)commit命令將stage中的ABC文件夾提交到當(dāng)前分支master。
管理修改
Git管理的是修改而非文件。這里的修改指的是對(duì)工作區(qū)的任何操作,包括新增文件;刪除文件;修改文件等等。哪怕是在文件中增加一句話或者刪除一個(gè)字符都可以算是修改。下面就舉例說(shuō)明下,還是以readme.txt文件為例:
- 第一次在readme.txt文件中增加一個(gè)詞語(yǔ) gittest。然后執(zhí)行
git add readme.txt
,并通過(guò)命令git status
查看狀態(tài)。
hello world
gittest
- 第二次再在readme.txt文件上添加一行內(nèi)容
git tracks changes
。
hello world
gittest
git tracks changes
直接執(zhí)行git commit -m 'git tracks changes'
命令。然后通過(guò) git status
,可以發(fā)現(xiàn)第二次的修改沒(méi)有提交。這是因?yàn)榈诙蔚男薷臎](méi)有先提交到暫存區(qū)中。
我們的操作過(guò)程是第一次修改 -> git add -> 第二次修改 -> git commit
。當(dāng)使用git add
命令后,在工作區(qū)中的第一次修改被放入暫存區(qū)中,準(zhǔn)備提交,在工作區(qū)中的第二次修改沒(méi)有被放入暫存區(qū)中,所以,git commit
只負(fù)責(zé)把暫存區(qū)中的修改提交到當(dāng)前分支。所以第二次的修改沒(méi)有提交。
也就是說(shuō),所有的修改必須先通過(guò)git add 提交到暫存區(qū),然后通過(guò)git commit 提交到當(dāng)前分支。。在實(shí)際開(kāi)發(fā)中一般是將所有修改合并起來(lái)add,然后在一起commit。
刪除文件
當(dāng)前分支上有一個(gè)已經(jīng)廢棄不用的文件,該如何刪除呢?比如要?jiǎng)h除一個(gè)名為test1.txt文件。只需要兩行命令。
git rm test1.txt
git commit -m "remove test.txt"
5.Ubuntu搭建私有的git倉(cāng)庫(kù)
前面介紹了在實(shí)際開(kāi)發(fā)中,一般會(huì)拿一臺(tái)電腦作為“中央倉(cāng)庫(kù)”,充當(dāng)中央倉(cāng)庫(kù)的電腦需要安裝一個(gè)代碼倉(cāng)庫(kù)軟件,這里選用開(kāi)源軟件GitLab,它是基于git實(shí)現(xiàn)的在線代碼倉(cāng)庫(kù)軟件,提供web可視化管理界面,可以在本地部署。通常用于企業(yè)團(tuán)隊(duì)內(nèi)部協(xié)作開(kāi)發(fā)。當(dāng)然,如果你不想搭建私人的git倉(cāng)庫(kù),那么也可以直接使用最大的同性交友網(wǎng)站Github(使用與GitLab類(lèi)似)。
那么該如何在Ubuntu上安裝GitLab軟件,搭建私有的Git倉(cāng)庫(kù)呢?
- 安裝必須的一些服務(wù)
#更新apt源
sudo apt-get update
#安裝依賴包,運(yùn)行命令
sudo apt-get install curl openssh-server ca-certificates postfix
sudo apt-get install -y postfix
- 接著信任 GitLab 的 GPG 公鑰:
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
- 配置鏡像路徑
由于國(guó)外的下載速度過(guò)慢,所以配置清華大學(xué)鏡像的路徑。
sudo vi /etc/apt/sources.list.d/gitlab-ce.list
在該文件中寫(xiě)入如下代碼
deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main
- 安裝gitlab-ce
sudo apt-get update
sudo apt-get install gitlab-ce
安裝gitlab-ce成功之后。
5. 修改外部url
在gitlab配置文件/etc/gitlab/gitlab.rb中修改外部url,改為自己的ip地址或者域名。
sudo vi /etc/gitlab/gitlab.rb
找到external_url,修改其默認(rèn)的地址,這里改成了我本機(jī)局域網(wǎng)IP:192.168.40.138
external_url 'http://192.168.40.138/' ## 本機(jī)的局域網(wǎng)ip地址為192.168.41.128
- 執(zhí)行配置
前面步驟順利的話就可以執(zhí)行配置了,該過(guò)程可能需要較長(zhǎng)的時(shí)間。
sudo gitlab-ctl reconfigure
- 啟動(dòng)GitLab
sudo gitlab-ctl start
可以通過(guò)ps -ef|grep gitlab
命令查看GitLab是否啟動(dòng)成功。
8. 進(jìn)行瀏覽器訪問(wèn)
GitLab成功啟動(dòng)之后就可以通過(guò)瀏覽器訪問(wèn)GitLab的主頁(yè)了。在瀏覽器上輸入http://192.168.40.138/
;
默認(rèn)輸入的用戶名是root用戶,輸入的密碼是root的賬戶密碼。
至此GitLab的安裝就全部結(jié)束,我們也成功的搭建了屬于自己的Git倉(cāng)庫(kù)。
GitLab的使用
添加用戶
點(diǎn)擊設(shè)置按鈕,進(jìn)入設(shè)置欄,選中Users->New User
進(jìn)入添加用戶頁(yè)面。
輸入姓名,用戶名,和郵箱即可注冊(cè)添加新用戶。
添加團(tuán)隊(duì)
用戶添加好之后,就是將用戶添加到團(tuán)隊(duì)中,GitLab中默認(rèn)會(huì)有一個(gè)名為GitLab Instance的團(tuán)隊(duì),你也可以添加自己的團(tuán)隊(duì),這里我添加了一個(gè)名為ai_edu的團(tuán)隊(duì)。并在團(tuán)隊(duì)中添加了兩個(gè)成員。
選中要添加成員的團(tuán)隊(duì),在右側(cè)會(huì)出現(xiàn)一個(gè)添加Add user(s) to the group的欄目。再此欄目中所有用戶并添加到團(tuán)隊(duì)中。用戶的角色有游客,測(cè)試人員,開(kāi)發(fā)人員,管理者,擁有者等幾個(gè)不同的角色。
新建遠(yuǎn)程倉(cāng)庫(kù)
說(shuō)完了用戶和團(tuán)隊(duì)的設(shè)置后,現(xiàn)在就進(jìn)入了重點(diǎn)了,如何新建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)。同樣也是比較方便。操作步驟是:Project->Your projects->New project
這里新建了一個(gè)名為git_test的遠(yuǎn)程倉(cāng)庫(kù),倉(cāng)庫(kù)的所有這是屬于ai_edu團(tuán)隊(duì)。
這里倉(cāng)庫(kù)的權(quán)限等級(jí)有三個(gè)等級(jí),分別是:Private(只有你團(tuán)隊(duì)的人才能拉取和推送代碼),Internal(除了黑名單之外的用戶可以拉取和推送代碼)。Public (所有的用戶都可以拉取)。
SSH key的配置(生成公鑰和私鑰)
為啥要配置SSH key呢?這是因?yàn)镚itLab與你的電腦是通過(guò)SSH協(xié)議來(lái)通信的。說(shuō)白了,如果你沒(méi)有配置SSH key的話,則你不能推送代碼到遠(yuǎn)程庫(kù)。這里首先在你本地生成公鑰和私鑰文件,然后把公鑰文件的內(nèi)容復(fù)制到GitLab上。
- 配置用戶名
git config --global user.name “username”
- 配置郵箱
git config --global user.email jayxiang31@gmail.com
jayxiang31@gmail.com替換成你實(shí)際的郵箱地址。不需要加單引號(hào)。
4. 生成公鑰和私鑰
ssh-keygen -C 'you email jayxiang31@gmail.com' -t rsa
如果簡(jiǎn)單些的話可以直接填寫(xiě)ssh-keygen
命令。郵箱地址填寫(xiě)前面設(shè)置的郵箱地址。有提示的話一直按Enter鍵。正確執(zhí)行后會(huì)輸入如下信息
2 找到公鑰文件id_rsa.pub,復(fù)制公鑰內(nèi)容到GitLab
6. 分支管理
創(chuàng)建與合并分支
分支的概念:分支就是每次提交創(chuàng)建的點(diǎn)所連接成的時(shí)間線。這條時(shí)間線就是一個(gè)分支,默認(rèn)的話只有一個(gè)主分支master分支。HEAD嚴(yán)格來(lái)說(shuō)不是指向提交,而是指向master,master才是指向提交,HEAD指向的就是當(dāng)前分支。
一開(kāi)始的時(shí)候,master分支就是一條線,Git用master指向最新的提交,再用HEAD指向master,就能夠確定當(dāng)前的分支以及當(dāng)前分支的提交點(diǎn)。
每次提交,master分支都會(huì)向前進(jìn)移動(dòng)一步,這樣隨著你不斷提交,master分支的線也會(huì)越來(lái)越長(zhǎng)。其結(jié)構(gòu)如下圖所示:
1. 創(chuàng)建dev分支
當(dāng)我們新創(chuàng)建一個(gè)分支dev時(shí),Git會(huì)創(chuàng)建一個(gè)指針dev指向master分支當(dāng)前的提交點(diǎn)。當(dāng)切換到dev分支后,HEAD指針會(huì)指向dev。也就是說(shuō)HEAD始終是指向當(dāng)前分支的。
git checkout -b dev
git checkout 加上-b參數(shù)表示創(chuàng)建并切換到dev分支上,相當(dāng)于下面兩條命令。
$ git branch dev
$ git checkout dev
執(zhí)行該上面的命令之后的git的提交時(shí)間線如下圖所示:
當(dāng)在dev分支上提交代碼(未改變master分支)之后,dev分支會(huì)不斷的向后推進(jìn)。而master指針的指向則不會(huì)變。
git checkout
命令是一個(gè)比較特殊的命令,傳入不同的參數(shù)會(huì)有截然不同的效果。例如:git checkout -- file
命令,表示的意思是撤銷(xiāo)file文件中所有的修改。所以Git還提供了git switch
命令用于創(chuàng)建和切換分支。
## 創(chuàng)建并切換到新的dev分支
git switch -c dev
## 切換到已有的master分支
git switch master
2. 查看所有分支
分支創(chuàng)建好之后,可以通過(guò)git branch
命令進(jìn)行查看。
3. 分支合并
當(dāng)團(tuán)隊(duì)成員在dev分支上開(kāi)發(fā)完畢之后,就可以將dev分支上的內(nèi)容合并到master分支上,合并分支的原理就是將master指針指向dev的當(dāng)前提交。Git合并分支只是改了下指針,工作區(qū)的內(nèi)容沒(méi)有改變。
其合并的命令分兩步,第一步是切換到master分支,第二步是合并dev分支
#切換到master分支
git checkout master
#合并dev分支
git merge dev
- 刪除dev分支
現(xiàn)在dev分支的內(nèi)容也合并到了master分支上了,可以將dev分支刪除了。Git刪除dev分支其實(shí)就是刪除dev指針。刪除之后又只剩下master分支了。需要注意的是必須要先切換到master分支上再進(jìn)行刪除dev分支的操作。刪除dev分支的命令如下:
git branch -d dev
解決沖突
在團(tuán)隊(duì)協(xié)作過(guò)程中,難免會(huì)碰到各種修改沖突。那么該如何解決這些沖突呢? 例如:你和你同事分別修改了readme.txt文件,那么當(dāng)你們同時(shí)提交時(shí)就會(huì)出現(xiàn)沖突。又或者在你在master分支和feature1分支上分別修改了readme.txt文件。那么當(dāng)你合并feature1分支到master分支時(shí)就會(huì)出現(xiàn)沖突。舉個(gè)栗子吧:
- 在feature1分支上給readme.txt文件中加上了文本
處理沖突
。然后提交到feature1分支。 - 切換到master分支,給readme.txt文件中加上文本
沖突處理
master有沖突
然后提交到master分支上。
3. 將feature1分支合并到master分支,此時(shí)就會(huì)出現(xiàn)合并沖突。如下圖所示:
沖突之后,Git用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容。如下圖所示:
處理沖突的方式就是編輯沖突內(nèi)容。然后重新提交。
$ git add README.md
$ git commit -m "解決沖突"
比較差異
- 比較兩個(gè)提交之間的差異
git diff 36e4fd7 b55da38
- 比較工作區(qū)與倉(cāng)庫(kù)區(qū)的不同,HEAD表示最新的那次提交
git diff HEAD
分支管理策略
通常情況下,Git在合并分支時(shí),會(huì)使用Fast forward模式。但是,這種模式下,刪除分支后,會(huì)丟掉分支信息。如下圖所示,刪除dev分支之后,分支的信息也就就丟失了
如果要強(qiáng)制禁用Fast forward模式,Git會(huì)在merge時(shí)生成一個(gè)新的commit。當(dāng)刪除分支時(shí)就不會(huì)丟失分支信息。其命令是
git merge --no-ff -m "merge with no-ff" dev
準(zhǔn)備合并dev分支,其中--no-ff
參數(shù),表示禁用Fast forward,因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit,所以加上-m
參數(shù)。把commit描述寫(xiě)進(jìn)去。
Bug分支
當(dāng)你接到一個(gè)修復(fù)代號(hào)為01的bug的任務(wù)時(shí),很自然地,你會(huì)創(chuàng)建一個(gè)分支issue-01來(lái)修復(fù)它,但是,如果這是你正在dev分支上進(jìn)行的工作還沒(méi)有提交,提交吧,可是你在dev上的工作只進(jìn)行了一般,還沒(méi)法提交,預(yù)計(jì)完成還需1天的時(shí)間。但是,現(xiàn)在必須要在兩個(gè)小時(shí)內(nèi)修復(fù)代號(hào)01的bug。這時(shí)候該怎么辦呢?你不是期望有一個(gè)功能可以隱藏你當(dāng)前在dev上未提交的工作,然后,切換到issue-01分支修改bug呢。
通過(guò)stash功能可以滿足你的愿望,將當(dāng)前工作現(xiàn)場(chǎng)隱藏起來(lái)。如下圖所示:執(zhí)行git stash
命令之后,新建的hello.html文件就從工作區(qū)中消失了。
保存工作現(xiàn)場(chǎng)
git stash
git stash命令可以將當(dāng)前未提交的工作隱藏起來(lái)。讓你的工作區(qū)變的干凈清爽。
查看工作現(xiàn)場(chǎng)
git stash list 可以查看當(dāng)前倉(cāng)庫(kù)所有已經(jīng)保存的工作現(xiàn)場(chǎng)。
git stash list
恢復(fù)工作現(xiàn)場(chǎng)
現(xiàn)在代號(hào)為01的bug已經(jīng)修復(fù)好了,你可以繼續(xù)切換到dev分支上進(jìn)行開(kāi)發(fā)了。那么這時(shí)候你需要做的第一件事就是恢復(fù)之前保存的工作現(xiàn)場(chǎng)。恢復(fù)工作現(xiàn)場(chǎng)的命令是:
git stash apply
刪除工作現(xiàn)場(chǎng)
通過(guò)git stash apply
命令可以恢復(fù)工作現(xiàn)場(chǎng)。但是,恢復(fù)之后工作現(xiàn)場(chǎng)還在。那么這時(shí)候我們還需要一個(gè)命令來(lái)刪除工作現(xiàn)場(chǎng)。其命令是:
git stash drop
恢復(fù)并刪除工作現(xiàn)場(chǎng)
恢復(fù)工作現(xiàn)場(chǎng)一條命令,刪除工作現(xiàn)場(chǎng)又是一條命令。未免有點(diǎn)繁瑣了吧。有沒(méi)有將兩者合二為一的命令呢?答案是有的:通過(guò)下面的命令就可以實(shí)現(xiàn):
git stash pop
在master分支上修復(fù)了bug后,我們想一想,dev分支是早期從master分支分出來(lái)的,所以,這個(gè)bug其實(shí)在當(dāng)前dev分支上也存在。那怎么在dev分支上修復(fù)同樣的bug?重復(fù)操作一次,提交不就行了?這種方法也不是不行,如果該BUG涉及的修改過(guò)多,這樣的方式就顯得有點(diǎn)捉襟見(jiàn)肘了。那么我們能不能把修改BUG做的提交復(fù)制到當(dāng)前的dev分支呢?答案是有的:
合并某一次的提交
git cherry-pick 821ea4d
通過(guò)git cherry-pick
命令可以將單個(gè)的提交復(fù)制到當(dāng)前分支??梢酝ㄟ^(guò) git log 查看提交的提交的版本號(hào)。
feature分支
添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開(kāi)發(fā),完成后,合并,最后,刪除該feature分支。
前面介紹可以通過(guò)git branch -d branchname
命令刪除分支。但是,如果被刪除的分支還沒(méi)有合并到主分支的話,用該命令刪除的話分支的話,Git會(huì)拋出一個(gè)錯(cuò)誤提示并不能刪除該分支。如下:要?jiǎng)h除一個(gè)名為feature-01的分支。但是該分支還沒(méi)有被merge。這時(shí)候就需要強(qiáng)制刪除分支的命令了。
git branch -D feature-01
其中feature-01為待刪除的分支名。其實(shí)就是將-d
參數(shù)換成-D
參數(shù)。
遠(yuǎn)程倉(cāng)庫(kù)(多人協(xié)作)
前面說(shuō)了那么多,好像都是一個(gè)人在本地操作,沒(méi)有涉及到多人協(xié)作的情況。這在團(tuán)隊(duì)開(kāi)發(fā)中肯定是不可能的啦,因?yàn)槲覀兪且粋€(gè)team。那么多人協(xié)作的情況涉及哪些操作呢?
本地倉(cāng)庫(kù)關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin http://192.168.40.138/ai-edu/git-demo.git
或者,推薦使用下面這種,因?yàn)榍懊媾渲昧薙SH公鑰和私鑰
git remote add origin git@gitee.com:jayxiang31/python_learn.git
第一次先拉取遠(yuǎn)程庫(kù)中的README.md和.gitignore等文件
git pull --rebase origin master
克隆遠(yuǎn)程倉(cāng)庫(kù)
前面第三章已經(jīng)搭好了私有的Git倉(cāng)庫(kù)管理器GitLab。同時(shí)也創(chuàng)建了一個(gè)名為git_test的倉(cāng)庫(kù)?,F(xiàn)在要做的就是將遠(yuǎn)程倉(cāng)庫(kù)克隆下來(lái)??寺〉拿钍?code>git clone
git clone http://192.168.40.138/ai-edu/git_test.git
其中http://192.168.40.138/ai-edu/git_test.git
是遠(yuǎn)程倉(cāng)庫(kù)的地址。
當(dāng)然也可以在IDEA上直接通過(guò)圖形界面操作,還省去了導(dǎo)入項(xiàng)目的過(guò)程。其操作步驟是:
- 選中
File->New->Project from Version Control->Git
。如下圖所示:
- 在URL中填入遠(yuǎn)程倉(cāng)庫(kù)的地址,點(diǎn)擊Clone按鈕。如下圖所示:
需要注意的是默認(rèn)情況下只會(huì)克隆master分支,其他的分支不會(huì)被克隆下來(lái)。其他的分支需要通過(guò)git pull命令拉取,后面會(huì)詳細(xì)介紹。
刪除遠(yuǎn)程Git倉(cāng)庫(kù)
git remote rm origin
查看遠(yuǎn)程分支
通過(guò)git remote
命令可以查看遠(yuǎn)程倉(cāng)庫(kù),origin表示遠(yuǎn)程主機(jī)。
通過(guò)git remote -v
命令可以查看遠(yuǎn)程倉(cāng)庫(kù)詳細(xì)的信息,包括遠(yuǎn)程倉(cāng)庫(kù)的地址。
$ git remote -v
origin http://192.168.40.138/ai-edu/git_test.git (fetch)
origin http://192.168.40.138/ai-edu/git_test.git (push)
上面顯示了可以抓取和推送的origin的地址。如果沒(méi)有推送權(quán)限,就看不到push的地址。
推送分支
現(xiàn)在將遠(yuǎn)程倉(cāng)庫(kù)克隆下來(lái)了,那么該如何將當(dāng)前分支上所有的本地提交推送到遠(yuǎn)程庫(kù)呢?答案是通過(guò)git push
命令,其語(yǔ)法結(jié)構(gòu)是git push <remote branch> <local branch>
其中<remote branch>
表示遠(yuǎn)程分支名,<local branch>
表示本地分支名。
git push origin master
該語(yǔ)句表示將本地的master分支推送到遠(yuǎn)程的origin分支上。在實(shí)際應(yīng)用中會(huì)在git push
命令后面加上-u
參數(shù),就像git push -u origin master
這樣。這是因?yàn)槿绻?dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系,則可以使用 -u 參數(shù)指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push。那么哪些分支該與遠(yuǎn)程分支保持一致呢?一般認(rèn)為:
- master 分支是主分支,需要時(shí)時(shí)與遠(yuǎn)程同步
- dev分支是開(kāi)發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步
- bug分支只用于在本地修復(fù)bug,就沒(méi)必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;
- feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開(kāi)發(fā)。
說(shuō)白了就是需要團(tuán)隊(duì)協(xié)作的分支一定要推送到遠(yuǎn)程庫(kù),否則則不需要。
創(chuàng)建遠(yuǎn)程分支
通過(guò)git push
命令還能創(chuàng)建遠(yuǎn)程分支。
git push origin dev
假設(shè)你本地已經(jīng)有了dev分支。通過(guò)上面的命令可以將dev分支推送到遠(yuǎn)程庫(kù),并創(chuàng)建遠(yuǎn)程的dev分支。
拉取分支
通過(guò)git pull
命令可以拉取遠(yuǎn)程倉(cāng)庫(kù)的數(shù)據(jù)和分支信息。假設(shè)如下這個(gè)場(chǎng)景:你同事在他本地創(chuàng)建了一個(gè)dev分支,并提交到了遠(yuǎn)程庫(kù)。同時(shí)你也在本地創(chuàng)建了一個(gè)dev庫(kù),當(dāng)你push時(shí)會(huì)推送失敗。結(jié)果如下圖所示:
因?yàn)槟阃碌淖钚绿峤缓湍阍噲D推送的的提交有沖突。解決的辦法就是根據(jù)Git的提示,先用git pull
把最新的提交從origin/dev
抓下來(lái),然后,在本地合并,解決沖突后,在推送。
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
git pull
也失敗了。原因是沒(méi)有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接,根據(jù)提示,設(shè)置dev和origin/dev的鏈接:
關(guān)聯(lián)本地分支和遠(yuǎn)程分支
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
關(guān)聯(lián)好本地分支和遠(yuǎn)程分支之后,在pull就能成功了。這回git pull
成功,但是合并有沖突,需要手動(dòng)解決,解決的方式也是在本地手動(dòng)處理沖突文件,解決后,提交,在push。
刪除遠(yuǎn)程分支
通過(guò)
git push origin :dev
命令可以刪除遠(yuǎn)程dev分支。但是這時(shí)候本地的dev分支還是存在的。所以還需要通過(guò)git branch -d dev
刪除本地的dev分支。
查看分支
通過(guò)git branch
可以查看本地分支
通過(guò)git branch -a
可以查看本地分支和遠(yuǎn)程分支。
版本回退
在實(shí)際開(kāi)發(fā)中我們經(jīng)常會(huì)碰到這樣一個(gè)場(chǎng)景,比如:你誤提交了一段有問(wèn)題的代碼,導(dǎo)致其他同事更新代碼之后項(xiàng)目啟動(dòng)不了,這時(shí)候該怎么辦呢?我們首先想到的就是將版本回退?;赝说街澳莻€(gè)沒(méi)有問(wèn)題的版本。
- 通過(guò)
git log
命令找到當(dāng)前的倉(cāng)庫(kù)所有的提交日志。然后,找到你需要回退到的版本。如下圖所示: - 回退到上一個(gè)版本:
git reset HEAD
- 回退到指定版本:
git reset commitId
其中commitId是指定版本的版本號(hào),比如這里將版本信息回退到b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
這個(gè)版本。那么命令就是:
git reset b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
回退之后,再次通過(guò)git log
查看,則最新的提交日志已經(jīng)變成了hello 提交
這個(gè)版本了。
當(dāng)然,通過(guò)IDEA來(lái)回退則更加的簡(jiǎn)單。直接在Version Control->Log
在待回退到的版本上右鍵,選中Reset Current Branch to Here
即可。
其實(shí)回退操作的本質(zhì),就是將HEAD指針的指向要回退的那個(gè)版本上。
分支重命名
git branch -m oldname newname
7. 標(biāo)簽管理
標(biāo)簽管理比較簡(jiǎn)單,再此只是簡(jiǎn)單描述一下。
#創(chuàng)建標(biāo)簽 v1.0
git tag v1.0
#查看標(biāo)簽
git tag
#刪除標(biāo)簽v1.0
git tag -d v0.1
#推送標(biāo)簽
git push origin --tags
#刪除遠(yuǎn)程標(biāo)簽
git push origin :refs/tags/v1.0
在這里插入圖片描述
總結(jié)
一萬(wàn)六千多字,我寫(xiě)的累,你們看的也累?。。∥闹蟹钌蠋讖埫琅掌o各位讀者大大解解乏。我真真正正的肝了兩天了?,F(xiàn)在終于肝完了。希望對(duì)讀者朋友們有所幫助。
看文字實(shí)在是太累了。下面就用一張圖來(lái)做一個(gè)總結(jié)吧。
這張圖清晰的表明了Git的基本流程。
Python知識(shí)圖譜
作者:碼農(nóng)飛哥
微信公眾號(hào):碼農(nóng)飛哥