您好,登錄后才能下訂單哦!
這篇文章主要講解了“Git倉庫搭建及分支管理的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Git倉庫搭建及分支管理的方法”吧!
Git是一款開源的分布式版本控制系統,可以有效,高速處理從很小到非常大的項目版本管理。 Git是通過C語言開發實現的。
Git和SVN是兩種截然不同的版本控制系統,Git是分布式版本控制系統,而SVN則是集中式版本控制系統。要想比較Git和SVN的區別,首先需要了解分布式版本控制系統和集中式版本控制系統的基本概念。
集中式版本控制系統:一個顯著的特征是版本庫是存放在中央服務器上的,由中央服務器統一管理項目的版本信息和分支信息。團隊中的每個成員在工作時都需要先從中央服務器上拉取最新的代碼,然后開始干活。干完活之后再將代碼提交到中央服務器上。集中式版本服務器有兩個弊端:
必須聯網才能工作,當沒有網絡或者網絡很差時,則團隊中的成員無法協同工作。
安全性不好,因為版本庫存放在了中央服務器,當中央服務器損壞時則會丟失版本庫,使所有成員都沒法工作。
可以看出團隊中所有成員的工作電腦都只與中央服務器打交道。如果把版本庫比做書庫的話,那么每個人(每個電腦)都需要先從書庫借到書(拉取最新的代碼),閱讀完之后然后還給書庫(修改之后提交到中央服務器)
分布式版本控制系統: 與集中式版本控制系統最大的不同是團隊中所有成員的工作電腦上都有一個完整的版本庫,并且沒有中央服務器。,這就相當于團隊中每個成員都有一個自己的小書庫(版本庫),成員之間可以互相交換自己書庫中的圖書(將自己的修改提交給對方)。這里完全不需要中央服務器來管理協調管理。
在實際使用分布式版本控制系統時,其實很少在兩人之間的電腦上進行版本庫推送,這是因為有時候你們不在同一個局域網內,或者你同事的電腦關機了。因此,分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。這臺充當“中央服務器”的電腦上的版本庫稱之為遠程版本庫,其他成員電腦上的版本庫稱之為本地版本庫。
分布式版本控制系統剔除了中央服務器,這充分體現了分布式的核心概念,就是去中心化。這樣帶來的好處有兩點:
沒有網絡也能上班:團隊中的每個成員在沒有網絡的情況下也能工作,因為本地有完整的版本庫,不需要擔心數據的丟失。
數據更安全:當某個成員的電腦壞掉了不要緊,只需要從其他成員的電腦上復制一份即可。但是集中式版本控制系統的中央服務器出問題,則可能會丟失版本庫,使得所有人都沒法工作。
系統 | 版本 |
---|---|
Windows | Windows10 |
Linux | Ubuntu16.04 |
說完了Git的基本概念,接下來還是安裝個Git客戶端下來耍一耍。這里分不同的操作系統簡單的介紹一下Git客戶端的安裝。
首先通過git --version
命令查看電腦上是否已經安裝了Git客戶端。
如果已經安裝了就可以跳過此章節。如果沒有安裝的話就接著往下面看:
Linux系統有不同的發行版本,可以通過cat /proc/version
命令查看Linux的版本。
Debian或Ubuntu下安裝Git
在 Debian或Ubuntu可以通過apt包管理工具安裝Git,命令如下:
sudo apt-get install git
Red Hat 或者CentOS下安裝Git
Red Hat 或者CentOS下可以通過yum包管理工具安裝Git,命令如下:
yum install git -y
如果找不到yum命令的話,則需要先安裝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下安裝好Git之后會出現Git Bash 和Git GUI兩個應用程序,其中Git Bash是Git的命令行工具,而Git GUI則是Git的可視化工具(一般很少用)。
創建本地版本庫分為兩步:
第一步是創建一個空文件夾,命名為: git_learn。
第二步就是在該文件夾下執行git init
命令將該文件夾變成git可以管理的版本庫。
執行第二步之后,在 git_learn目錄下會出現一個名為.git的隱藏文件夾,該文件夾就是git的版本庫。切記不要手動修改.git文件夾下的任何內容,以免本地版本庫不可用。
本地版本庫建好之后就可以在git_learn文件夾下創建一個文件進行測試了。這里創建了一個名為readme.txt的文件。
添加到暫存區
通過git add readme.txt
命令可以將readme.txt文件提交到暫存區(關于暫存區的概念后面會詳細介紹)。如果有多個文件需要添加的話,可以執行git add .
命令。
提交到版本庫
因為git的本地都是有完整版本庫的,所以還需要將前面創建的readme.txt文件提交到本地版本庫的當前分支,默認是master。命令格式是git commit -m '<message>'
,其中寫入你的提交備注。
這里有兩個很重要的概念,一個是工作區,另一個是暫存區(Git特有的概念)。
工作區
工作區就是你電腦上能看到的目錄(不包括隱藏文件),例如:git_learn目錄就是一個工作區。
暫存區
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫,其中最重要的是暫存區(stage)。
還有Git為我們自動創建的第一個分支叫master,以及指向master的一個指針叫HEAD。
通過add命令將工作區中ABC文件夾提交到暫存區stage,在通過commit命令將stage中的ABC文件夾提交到當前分支master。
Git管理的是修改而非文件。這里的修改指的是對工作區的任何操作,包括新增文件;刪除文件;修改文件等等。哪怕是在文件中增加一句話或者刪除一個字符都可以算是修改。下面就舉例說明下,還是以readme.txt文件為例:
第一次在readme.txt文件中增加一個詞語 gittest。然后執行git add readme.txt
,并通過命令git status
查看狀態。
hello world
gittest
第二次再在readme.txt文件上添加一行內容git tracks changes
。
hello world
gittest
git tracks changes
直接執行git commit -m 'git tracks changes'
命令。然后通過 git status
,可以發現第二次的修改沒有提交。這是因為第二次的修改沒有先提交到暫存區中。
我們的操作過程是第一次修改 -> git add -> 第二次修改 -> git commit
。當使用git add
命令后,在工作區中的第一次修改被放入暫存區中,準備提交,在工作區中的第二次修改沒有被放入暫存區中,所以,git commit
只負責把暫存區中的修改提交到當前分支。所以第二次的修改沒有提交。
也就是說,所有的修改必須先通過git add 提交到暫存區,然后通過git commit 提交到當前分支。。在實際開發中一般是將所有修改合并起來add,然后在一起commit。
當前分支上有一個已經廢棄不用的文件,該如何刪除呢?比如要刪除一個名為test1.txt文件。只需要兩行命令。
git rm test1.txtgit commit -m "remove test.txt"
前面介紹了在實際開發中,一般會拿一臺電腦作為“中央倉庫”,充當中央倉庫的電腦需要安裝一個代碼倉庫軟件,這里選用開源軟件GitLab,它是基于git實現的在線代碼倉庫軟件,提供web可視化管理界面,可以在本地部署。通常用于企業團隊內部協作開發。當然,如果你不想搭建私人的git倉庫,那么也可以直接使用最大的同性交友網站Github(使用與GitLab類似)。
那么該如何在Ubuntu上安裝GitLab軟件,搭建私有的Git倉庫呢?
安裝必須的一些服務
#更新apt源sudo apt-get update#安裝依賴包,運行命令sudo apt-get install curl openssh-server ca-certificates postfixsudo apt-get install -y postfix
接著信任 GitLab 的 GPG 公鑰:
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
配置鏡像路徑
由于國外的下載速度過慢,所以配置清華大學鏡像的路徑。
sudo vi /etc/apt/sources.list.d/gitlab-ce.list
在該文件中寫入如下代碼
deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main
安裝gitlab-ce
sudo apt-get updatesudo apt-get install gitlab-ce
安裝gitlab-ce成功之后。
5. 修改外部url
在gitlab配置文件/etc/gitlab/gitlab.rb中修改外部url,改為自己的ip地址或者域名。
sudo vi /etc/gitlab/gitlab.rb
找到external_url,修改其默認的地址,這里改成了我本機局域網IP:192.168.40.138
external_url 'http://192.168.40.138/' ## 本機的局域網ip地址為192.168.41.128
執行配置
前面步驟順利的話就可以執行配置了,該過程可能需要較長的時間。
sudo gitlab-ctl reconfigure
啟動GitLab
sudo gitlab-ctl start
可以通過ps -ef|grep gitlab
命令查看GitLab是否啟動成功。
8. 進行瀏覽器訪問
GitLab成功啟動之后就可以通過瀏覽器訪問GitLab的主頁了。在瀏覽器上輸入http://192.168.40.138/
;
默認輸入的用戶名是root用戶,輸入的密碼是root的賬戶密碼。
至此GitLab的安裝就全部結束,我們也成功的搭建了屬于自己的Git倉庫。
點擊設置按鈕,進入設置欄,選中Users->New User
進入添加用戶頁面。
輸入姓名,用戶名,和郵箱即可注冊添加新用戶。
用戶添加好之后,就是將用戶添加到團隊中,GitLab中默認會有一個名為GitLab Instance的團隊,你也可以添加自己的團隊,這里我添加了一個名為ai_edu的團隊。并在團隊中添加了兩個成員。
選中要添加成員的團隊,在右側會出現一個添加Add user(s) to the group的欄目。再此欄目中所有用戶并添加到團隊中。用戶的角色有游客,測試人員,開發人員,管理者,擁有者等幾個不同的角色。
說完了用戶和團隊的設置后,現在就進入了重點了,如何新建一個遠程倉庫。同樣也是比較方便。操作步驟是:Project->Your projects->New project
這里新建了一個名為git_test的遠程倉庫,倉庫的所有這是屬于ai_edu團隊。
這里倉庫的權限等級有三個等級,分別是:Private(只有你團隊的人才能拉取和推送代碼),Internal(除了黑名單之外的用戶可以拉取和推送代碼)。Public (所有的用戶都可以拉取)。
為啥要配置SSH key呢?這是因為GitLab與你的電腦是通過SSH協議來通信的。說白了,如果你沒有配置SSH key的話,則你不能推送代碼到遠程庫。這里首先在你本地生成公鑰和私鑰文件,然后把公鑰文件的內容復制到GitLab上。
配置用戶名
git config --global user.name “username”
配置郵箱
git config --global user.email jayxiang31@gmail.com
jayxiang31@gmail.com替換成你實際的郵箱地址。不需要加單引號。
4. 生成公鑰和私鑰
ssh-keygen -C 'you email jayxiang31@gmail.com' -t rsa
如果簡單些的話可以直接填寫ssh-keygen
命令。郵箱地址填寫前面設置的郵箱地址。有提示的話一直按Enter鍵。
2 找到公鑰文件id_rsa.pub,復制公鑰內容到GitLab
分支的概念:分支就是每次提交創建的點所連接成的時間線。這條時間線就是一個分支,默認的話只有一個主分支master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交,HEAD指向的就是當前分支。
一開始的時候,master分支就是一條線,Git用master指向最新的提交,再用HEAD指向master,就能夠確定當前的分支以及當前分支的提交點。
每次提交,master分支都會向前進移動一步,這樣隨著你不斷提交,master分支的線也會越來越長。
當我們新創建一個分支dev時,Git會創建一個指針dev指向master分支當前的提交點。當切換到dev分支后,HEAD指針會指向dev。也就是說HEAD始終是指向當前分支的。
git checkout -b dev
git checkout 加上-b參數表示創建并切換到dev分支上,相當于下面兩條命令。
$ git branch dev $ git checkout dev
當在dev分支上提交代碼(未改變master分支)之后,dev分支會不斷的向后推進。而master指針的指向則不會變。git checkout
命令是一個比較特殊的命令,傳入不同的參數會有截然不同的效果。例如:git checkout -- file
命令,表示的意思是撤銷file文件中所有的修改。所以Git還提供了git switch
命令用于創建和切換分支。
## 創建并切換到新的dev分支git switch -c dev## 切換到已有的master分支git switch master
分支創建好之后,可以通過git branch
命令進行查看。
當團隊成員在dev分支上開發完畢之后,就可以將dev分支上的內容合并到master分支上,合并分支的原理就是將master指針指向dev的當前提交。Git合并分支只是改了下指針,工作區的內容沒有改變。
其合并的命令分兩步,第一步是切換到master分支,第二步是合并dev分支
#切換到master分支git checkout master#合并dev分支git merge dev
刪除dev分支
現在dev分支的內容也合并到了master分支上了,可以將dev分支刪除了。Git刪除dev分支其實就是刪除dev指針。刪除之后又只剩下master分支了。需要注意的是必須要先切換到master分支上再進行刪除dev分支的操作。刪除dev分支的命令如下:
git branch -d dev
在團隊協作過程中,難免會碰到各種修改沖突。那么該如何解決這些沖突呢? 例如:你和你同事分別修改了readme.txt文件,那么當你們同時提交時就會出現沖突。又或者在你在master分支和feature1分支上分別修改了readme.txt文件。那么當你合并feature1分支到master分支時就會出現沖突。舉個栗子吧:
在feature1分支上給readme.txt文件中加上了文本處理沖突
。然后提交到feature1分支。
切換到master分支,給readme.txt文件中加上文本
沖突處理 master有沖突
然后提交到master分支上。
3. 將feature1分支合并到master分支,此時就會出現合并沖突。如下圖所示:
沖突之后,Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容。如下圖所示:
處理沖突的方式就是編輯沖突內容。然后重新提交。
$ git add README.md $ git commit -m "解決沖突"
比較兩個提交之間的差異 git diff 36e4fd7 b55da38
比較工作區與倉庫區的不同,HEAD表示最新的那次提交 git diff HEAD
通常情況下,Git在合并分支時,會使用Fast forward模式。但是,這種模式下,刪除分支后,會丟掉分支信息。如下圖所示,刪除dev分支之后,分支的信息也就就丟失了
如果要強制禁用Fast forward模式,Git會在merge時生成一個新的commit。當刪除分支時就不會丟失分支信息。其命令是git merge --no-ff -m "merge with no-ff" dev
準備合并dev分支,其中--no-ff
參數,表示禁用Fast forward,因為本次合并要創建一個新的commit,所以加上-m
參數。把commit描述寫進去。
當你接到一個修復代號為01的bug的任務時,很自然地,你會創建一個分支issue-01來修復它,但是,如果這是你正在dev分支上進行的工作還沒有提交,提交吧,可是你在dev上的工作只進行了一般,還沒法提交,預計完成還需1天的時間。但是,現在必須要在兩個小時內修復代號01的bug。這時候該怎么辦呢?你不是期望有一個功能可以隱藏你當前在dev上未提交的工作,然后,切換到issue-01分支修改bug呢。
通過stash功能可以滿足你的愿望,將當前工作現場隱藏起來。如下圖所示:執行git stash
命令之后,新建的hello.html文件就從工作區中消失了。
git stash
git stash命令可以將當前未提交的工作隱藏起來。讓你的工作區變的干凈清爽。
git stash list 可以查看當前倉庫所有已經保存的工作現場。
git stash list
現在代號為01的bug已經修復好了,你可以繼續切換到dev分支上進行開發了。那么這時候你需要做的第一件事就是恢復之前保存的工作現場。恢復工作現場的命令是:
git stash apply
通過git stash apply
命令可以恢復工作現場。但是,恢復之后工作現場還在。那么這時候我們還需要一個命令來刪除工作現場。其命令是:
git stash drop
恢復工作現場一條命令,刪除工作現場又是一條命令。未免有點繁瑣了吧。有沒有將兩者合二為一的命令呢?答案是有的:通過下面的命令就可以實現:
git stash pop
在master分支上修復了bug后,我們想一想,dev分支是早期從master分支分出來的,所以,這個bug其實在當前dev分支上也存在。那怎么在dev分支上修復同樣的bug?重復操作一次,提交不就行了?這種方法也不是不行,如果該BUG涉及的修改過多,這樣的方式就顯得有點捉襟見肘了。那么我們能不能把修改BUG做的提交復制到當前的dev分支呢?答案是有的:
git cherry-pick 821ea4d
通過git cherry-pick
命令可以將單個的提交復制到當前分支。可以通過 git log 查看提交的提交的版本號。
添加一個新功能時,你肯定不希望因為一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合并,最后,刪除該feature分支。
前面介紹可以通過git branch -d branchname
命令刪除分支。但是,如果被刪除的分支還沒有合并到主分支的話,用該命令刪除的話分支的話,Git會拋出一個錯誤提示并不能刪除該分支。如下:要刪除一個名為feature-01的分支。但是該分支還沒有被merge。這時候就需要強制刪除分支的命令了。
git branch -D feature-01
其中feature-01為待刪除的分支名。其實就是將-d
參數換成-D
參數。
前面說了那么多,好像都是一個人在本地操作,沒有涉及到多人協作的情況。這在團隊開發中肯定是不可能的啦,因為我們是一個team。那么多人協作的情況涉及哪些操作呢?
git remote add origin http://192.168.40.138/ai-edu/git-demo.git
或者,推薦使用下面這種,因為前面配置了SSH公鑰和私鑰
git remote add origin git@gitee.com:jayxiang31/python_learn.git
git pull --rebase origin master
前面第三章已經搭好了私有的Git倉庫管理器GitLab。同時也創建了一個名為git_test的倉庫。現在要做的就是將遠程倉庫克隆下來。克隆的命令是git clone
git clone http://192.168.40.138/ai-edu/git_test.git
其中http://192.168.40.138/ai-edu/git_test.git
是遠程倉庫的地址。
當然也可以在IDEA上直接通過圖形界面操作,還省去了導入項目的過程。其操作步驟是:
選中File->New->Project from Version Control->Git
。
在URL中填入遠程倉庫的地址,點擊Clone按鈕。
需要注意的是默認情況下只會克隆master分支,其他的分支不會被克隆下來。其他的分支需要通過git pull命令拉取,后面會詳細介紹。
git remote rm origin
通過git remote
命令可以查看遠程倉庫,origin表示遠程主機。
通過git remote -v
命令可以查看遠程倉庫詳細的信息,包括遠程倉庫的地址。
$ 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的地址。如果沒有推送權限,就看不到push的地址。
現在將遠程倉庫克隆下來了,那么該如何將當前分支上所有的本地提交推送到遠程庫呢?答案是通過git push
命令,其語法結構是git push <remote branch> <local branch>
其中<remote branch>
表示遠程分支名,<local branch>
表示本地分支名。
git push origin master
該語句表示將本地的master分支推送到遠程的origin分支上。在實際應用中會在git push
命令后面加上-u
參數,就像git push -u origin master
這樣。這是因為如果當前分支與多個主機存在追蹤關系,則可以使用 -u 參數指定一個默認主機,這樣后面就可以不加任何參數使用git push。那么哪些分支該與遠程分支保持一致呢?一般認為:
master 分支是主分支,需要時時與遠程同步
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步
bug分支只用于在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
feature分支是否推到遠程,取決于你是否和你的小伙伴合作在上面開發。
說白了就是需要團隊協作的分支一定要推送到遠程庫,否則則不需要
通過git push
命令還能創建遠程分支。
git push origin dev
假設你本地已經有了dev分支。通過上面的命令可以將dev分支推送到遠程庫,并創建遠程的dev分支。
通過git pull
命令可以拉取遠程倉庫的數據和分支信息。假設如下這個場景:你同事在他本地創建了一個dev分支,并提交到了遠程庫。同時你也在本地創建了一個dev庫,當你push時會推送失敗。結果如下圖所示:
因為你同事的最新提交和你試圖推送的的提交有沖突。解決的辦法就是根據Git的提示,先用git pull
把最新的提交從origin/dev
抓下來,然后,在本地合并,解決沖突后,在推送。
$ 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
也失敗了。原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置dev和origin/dev的鏈接:
$ git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.
關聯好本地分支和遠程分支之后,在pull就能成功了。這回git pull
成功,但是合并有沖突,需要手動解決,解決的方式也是在本地手動處理沖突文件,解決后,提交,在push。
通過
git push origin :dev
命令可以刪除遠程dev分支。但是這時候本地的dev分支還是存在的。所以還需要通過git branch -d dev
刪除本地的dev分支。
通過git branch
可以查看本地分支
通過git branch -a
可以查看本地分支和遠程分支。
在實際開發中我們經常會碰到這樣一個場景,比如:你誤提交了一段有問題的代碼,導致其他同事更新代碼之后項目啟動不了,這時候該怎么辦呢?我們首先想到的就是將版本回退。回退到之前那個沒有問題的版本。
通過git log
命令找到當前的倉庫所有的提交日志。然后,找到你需要回退到的版本。如下圖所示:
回退到上一個版本:git reset HEAD
回退到指定版本:git reset commitId
其中commitId是指定版本的版本號,比如這里將版本信息回退到b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
這個版本。那么命令就是:
git reset b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
回退之后,再次通過git log
查看,則最新的提交日志已經變成了hello 提交
這個版本了。
當然,通過IDEA來回退則更加的簡單。直接在Version Control->Log
在待回退到的版本上右鍵,選中Reset Current Branch to Here
即可。
其實回退操作的本質,就是將HEAD指針的指向要回退的那個版本上。
git branch -m oldname newname
標簽管理比較簡單,再此只是簡單描述一下。
#創建標簽 v1.0git tag v1.0#查看標簽git tag#刪除標簽v1.0git tag -d v0.1#推送標簽git push origin --tags#刪除遠程標簽git push origin :refs/tags/v1.0
感謝各位的閱讀,以上就是“Git倉庫搭建及分支管理的方法”的內容了,經過本文的學習后,相信大家對Git倉庫搭建及分支管理的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。