歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Git分布式版本控制系統最佳實踐

Git分布式版本控制系統最佳實踐

日期:2017/3/1 12:16:13   编辑:關於Linux

今天在高鐵閒來無事,決定把我之前遺漏的Git好好整理一番。

首先感謝老男孩架構師班趙班長深入講解Git,綜合自己實踐整理而來,特此在今天分享給大家。

1.1Git誕生歷史

我想大家還記得Linustorvalds在1991年時發布了Linux操作系統吧,從那以後Linux系統變不斷發展壯大,因為Linux系統開源的特性,所以一直接受著來自全球Linux技術愛好者的貢獻,志願者們通過郵件向Linus發送著自己編寫的源代碼文件,然後由Linus本人通過手工的方式將代碼合並,但這樣不僅沒有效率,而且真的是太痛苦了。一直到2002年,Linux系統經過十余年的不斷發展,代碼庫已經龐大到無法再讓Linus通過手工的方式管理了,但是Linus真的很不喜歡CVS或者Subversion版本控制系統,於是商業公司BitMover決定將其公司的BitKeeper分布式版本控制系統授權給Linux開發社區來免費使用,當時的BitKeeper可以比較文件內容的不同,還能夠將出錯的文檔還原到歷史某個狀態,Linus終於放下了心裡的石頭。

wKioL1bKo3CRIzC1AAG1-2SKC68203.png

分布式版本控制流程圖

CVS和Subversion屬於傳統的版本控制系統,而分布式版本控制系統最大的特點是不需要每次提交都把文件推送到版本控制服務器,而是采用分布式版本庫的機制,使得每個開發人員都夠從服務器中克隆一份完整的版本庫到自己計算機本地,不必再完全依賴於版本控制服務器,使得源代碼的發布和合並更加方便,並且因為數據都在自己本地,不僅效率提高了,而且即便我們離開了網絡依然可以執行提交文件、查看歷史版本記錄、創建分支等等操作,真的是開發者的福音啊。

就這樣平靜的度過了三年時間,但是Linux社區聚集著太多的黑客人物,2005年時,那位曾經開發Samba服務程序的Andrew因為試圖破解BitKeeper軟件協議而激怒了BitMover公司,當即決定不再向Linux社區提供免費的軟件授權了,此時的Linus其實也早已有自己編寫分布式版本控制系統的打算了,於是便用C語言花了2周創建了Git分布式版本控制系統,並上傳了Linux系統的源代碼。

wKioL1bKo3-DHHNsAAAzBz7fW-w985.png

git_logo

Git不僅是一款開源的分布式版本控制系統,而且有其獨特的功能特性,例如大多數的分布式版本控制系統只會記錄每次文件的變化,說白了就是只會關心文件的內容變化差異,而Git則是關注於文件數據整體的變化,直接會將文件提交時的數據保存成快照,而非僅記錄差異內容,並且使用SHA-1加密算法保證數據的完整性。

Git為了提高效率,對於沒有被修改的文件,則不會重復存儲,而是創建一個鏈接指向之前存儲過的文件。

wKiom1bKoyKwBMAIAACaq9cvRj0014.png

git提交流程圖

在正式使用前,我們還需要弄清楚Git的三種重要模式,分別是已提交、已修改、已暫存

已提交(committed):表示數據文件已經順利提交到Git數據庫中。

已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。

已暫存(staged):表示數據文件已經被修改,並會在下次提交時提交到Git數據庫中。

提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程為:

1.在工作目錄中修改數據文件。

2.將文件的快照放入暫存區域。

3.將暫存區域的文件快照提交到Git倉庫中。

wKiom1bKozLReEoPAABu7hnnq7o219.png

git工作模式

1.2Git環境准備

[root@git-node1~]# cat /etc/redhat-release #查看系統版本

CentOSLinux release 7.1.1503 (Core)

[root@git-node1~]# uname -r #查看內核版本

3.10.0-229.el7.x86_64

[root@git-node1~]# getenforce #確認Selinux關閉狀態

Disabled

[root@git-node1 ~]# systemctlstop firewalld #關閉防火牆

[root@git-node1~]# ifconfig eth0|awk -F '[ ]+' 'NR==2{print $3}' #查看當前主機IP地址

192.168.56.115

1.3Git安裝部署

Git是分布式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分布到不同的主機之上,並且每台主機的版本庫都是一樣的,沒有主次之分,極大的保證了數據安全性,並使得用戶能夠自主選擇向那個Git服務器推送文件了,其實部署一個git服務器是非常簡單的。

[root@git-node1~]# yum install git #安裝Git

[root@git-node1~]# git config --global user.name"xubusi" #配置git使用用戶

[root@git-node1~]# git config --global user.email"[email protected]" #配置git使用郵箱

[root@git-node1~]# git config --global color.ui true

[root@git-node1~]# git config --list

user.name=xubusi

[email protected]

color.ui=true

1.4Git常用命令

add #添加文件內容至索引

bisect#通過二分查找定位引入 bug 的變更

branch#列出、創建或刪除分支

checkout #檢出一個分支或路徑到工作區

clone#克隆一個版本庫到一個新目錄

commit#記錄變更到版本庫

diff#顯示提交之間、提交和工作區之間等的差異

fetch#從另外一個版本庫下載對象和引用

grep#輸出和模式匹配的行

init#創建一個空的 Git 版本庫或重新初始化一個已存在的版本庫

log#顯示提交日志

merge#合並兩個或更多開發歷史

mv#移動或重命名一個文件、目錄或符號鏈接

pull#獲取並合並另外的版本庫或一個本地分支

push#更新遠程引用和相關的對象

rebase#本地提交轉移至更新後的上游分支中

reset#重置當前HEAD到指定狀態

rm#從工作區和索引中刪除文件

show#顯示各種類型的對象

status#顯示工作區狀態

tag#創建、列出、刪除或校驗一個GPG簽名的 tag 對象

1.5Git基本操作

1.5.1Git提交數據

我們可以簡單的把工作目錄理解成是一個被Git服務程序管理的目錄,Git會時刻的追蹤目錄內文件的改動,另外在安裝好了Git服務程序後,默認就會創建好了一個叫做master的分支,我們直接可以提交數據到了

[root@git-node1~]# mkdir xubusi #創建本地工作目錄

[root@git-node1~]# cd xubusi/ #進入本地工作目錄

[root@git-node1xubusi]# git init #初始為git工作目錄

Initializedempty Git repository in /root/xubusi/.git/

[root@git-node1xubusi]# touch readme#創建文件

[root@git-node1xubusi]# git status #查看git狀態

#Untracked files:

# (use "git add ..." toinclude in what will be committed)

# readme.txt #發現新建的readme.txt文件

[root@git-node1xubusi]# git add readme.txt #git添加文件至暫存區

[root@git-node1xubusi]# git status #再次查看狀態

#Changes to be committed:

# (use "git rm --cached..." to unstage)

# new file: readme.txt#發現新建立的文件readme.txt已經變綠

[root@git-node1xubusi]# git commit -m "thefirst commit" #git cmmit提交暫存取文件至git版本倉庫

[master(root-commit) dde9e40] the first commit

1 file changed, 1 insertion(+)

create mode 100644 readme.txt

1.5.2Git移除數據

有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。

[root@git-node1xubusi]# touch database #建立文件

[root@git-node1xubusi]# git add database #添加文件至暫存區

[root@git-node1xubusi]# git status #查看當前git狀態

# Onbranch master

# Yourbranch is ahead of 'origin/master' by 4 commits.

# (use "git push" to publish yourlocal commits)

#

#Changes to be committed:

# (use "git reset HEAD..." to unstage)

#

# new file: database

[root@git-node1xubusi]# git rm --cached database #將文件從git暫存區域的追蹤列表移除(並不會刪除當前工作目錄內的數據文件)

rm'database'

[root@git-node1xubusi]# git status #此時文件已經是未追蹤狀態了

# Onbranch master

#Untracked files:

# (use "git add ..." toinclude in what will be committed)

#

# database

nochanges added to commit (use "git add" and/or "git commit-a")

#如果想將文件數據從git暫存區和工作目錄一起刪除,可以做如下操作。

[root@git-node1xubusi]# git add database #再將database文件提交到git暫存區

[root@git-node1xubusi]# git rm -f database #但如果在刪除之前數據文件已經被放入到暫存區域的話,git會擔心你誤刪未提交的文件而報錯信息,此時可追加強制刪除-f參數。

rm'database'

[root@git-node1xubusi]# ls #查看工作區也沒database文件

LICENSE deployhelp.md readme.txt

[root@git-node1xubusi]# git status #查看當前狀態

# Onbranch master

nochanges added to commit (use "git add" and/or "git commit-a")

1.5.3Git移動數據

[root@git-node1xubusi]# git mv readme.txt test.txt #git如果要修改文件名稱,則使用git mv命令

[root@git-node1xubusi]# git status #查看狀態發現下次提交會有一個改名操作

# Onbranch master

#Changes to be committed:

# (use "git reset HEAD..." to unstage)

#

# renamed: readme.txt -> test.txt

[root@git-node1xubusi]# git commit -m "changedname" #提交到git版本倉庫

[master88f3791] changed name

2 files changed, 31 deletions(-)

delete mode 100644 1

rename readme.txt => test.txt (100%)

#其實可以如下方法改名

[root@git-node1xubusi]# mv test.txt readme.txt #先修改名稱

[root@git-node1xubusi]# git rm test.txt #然後刪除git版本倉庫內的文件快照

rm'test.txt'

[root@git-node1xubusi]# git add readme.txt #最後再將新的文件添加進入

[root@git-node1xubusi]# git commit -m "changedthe file name" #提交至git版本倉庫

[master2caa209] changed the file name

1 file changed, 0 insertions(+), 0deletions(-)

rename test.txt => readme.txt (100%)

1.5.4Git歷史記錄

[root@git-node1xubusi]# git log #查看提交歷史記錄

commit2caa2090efa1aaf5c32524a13c500c1524e0a5ee

Author:xubusi

Date: Sat Jan 16 18:32:53 2016 +0800

changed the file name

commit88f379175b5ead7e0d84e47bd6db6f5a3b072921

Author:xubusi

Date: Sat Jan 16 18:31:03 2016 +0800

changed name

commit76c486fcf5d70b6a443ba9e7dad209c6722c8bee

Author:xubusi

Date: Sat Jan 16 18:22:39 2016 +0800

tet

[root@git-node1xubusi]# git log -2 #查看最近幾條記錄

commit2caa2090efa1aaf5c32524a13c500c1524e0a5ee

Author:xubusi

Date: Sat Jan 16 18:32:53 2016 +0800

changed the file name

commit88f379175b5ead7e0d84e47bd6db6f5a3b072921

Author:xubusi

Date: Sat Jan 16 18:31:03 2016 +0800

changed name

[root@git-node1xubusi]#

[root@git-node1xubusi]# git log -p -1 #-p顯示每次提交的內容差異,例如僅查看最近一次差異

commit2caa2090efa1aaf5c32524a13c500c1524e0a5ee

Author:xubusi

Date: Sat Jan 16 18:32:53 2016 +0800

changed the file name

diff--git a/readme.txt b/readme.txt

newfile mode 100644

index0000000..a9b574e

---/dev/null

+++b/readme.txt

@@-0,0 +1,3 @@

+1hehe

+Createnew mode two

+Createnew branch is linux

diff--git a/test.txt b/test.txt

deletedfile mode 100644

indexa9b574e..0000000

---a/test.txt

+++/dev/null

@@-1,3 +0,0 @@

-1hehe

-Createnew mode two

-Createnew branch is linux

[root@git-node1xubusi]# git log --stat -2#--stat簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,並在最後列出所有增減行的概要信息

commit2caa2090efa1aaf5c32524a13c500c1524e0a5ee

Author:xubusi

Date: Sat Jan 16 18:32:53 2016 +0800

changed the file name

readme.txt | 3 +++

test.txt| 3 ---

2 files changed, 3 insertions(+), 3deletions(-)

commit88f379175b5ead7e0d84e47bd6db6f5a3b072921

Author:xubusi

Date: Sat Jan 16 18:31:03 2016 +0800

changed name

1| 31 -------------------------------

readme.txt |3 ---

test.txt| 3 +++

3 files changed, 3 insertions(+), 34deletions(-)

[root@git-node1xubusi]# git log --pretty=oneline #--pretty根據不同的格式展示提交的歷史信息

2caa2090efa1aaf5c32524a13c500c1524e0a5eechanged the file name

88f379175b5ead7e0d84e47bd6db6f5a3b072921changed name

76c486fcf5d70b6a443ba9e7dad209c6722c8beetet

[root@git-node1xubusi]# git log --pretty=fuller -2 #以更詳細的模式輸出提交的歷史記錄

commit2caa2090efa1aaf5c32524a13c500c1524e0a5ee

Author: xubusi

AuthorDate:Sat Jan 16 18:32:53 2016 +0800

Commit: xubusi

CommitDate:Sat Jan 16 18:32:53 2016 +0800

changed the file name

commit88f379175b5ead7e0d84e47bd6db6f5a3b072921

Author: xubusi

AuthorDate:Sat Jan 16 18:31:03 2016 +0800

Commit: xubusi

CommitDate:Sat Jan 16 18:31:03 2016 +0800

changed name

還可以使用format參數來指定具體的輸出格式,這樣非常便於後期編程的提取分析哦,常用的格式有:

%s 提交說明。

%cd 提交日期。

%an 作者的名字。

%cn 提交者的姓名。

%ce 提交者的電子郵件。

%H 提交對象的完整SHA-1哈希字串。

%h 提交對象的簡短SHA-1哈希字串。

%T 樹對象的完整SHA-1哈希字串。

%t 樹對象的簡短SHA-1哈希字串。

%P 父對象的完整SHA-1哈希字串。

%p 父對象的簡短SHA-1哈希字串。

%ad 作者的修訂時間。

[root@git-node1xubusi]# git log--pretty=fomat:"%h %cn"#查看當前所有提交記錄的簡短SHA-1哈希字串與提交著的姓名

fomat:2caa209xubusi

fomat:88f3791xubusi

fomat:76c486fxubusi

1.5.5Git還原數據

[root@git-node1xubusi]# echo "Git is a versioncontrol system" >> readme.txt#追加一段話

[root@git-node1xubusi]# git add readme.txt #添加至暫存區

[root@git-node1xubusi]# git commit -m"introduction software" #提交至git版本倉庫

[master4bf5b29] introduction software

1 file changed, 1 insertion(+)

此時覺得寫得不妥,想還原某一次提交的文件快照

[root@git-node1xubusi]# git log --pretty=oneline #提交的歷史信息

4bf5b296db9678f1851b896ed040fe37e6d7efb5introduction software

2caa2090efa1aaf5c32524a13c500c1524e0a5eechanged the file name

88f379175b5ead7e0d84e47bd6db6f5a3b072921changed name

Git服務程序中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,但是因為Git是分布式版本控制系統,為了避免歷史記錄沖突,故使用了SHA-1計算出十六進制的哈希字串來區分每個提交版本,另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第五個提交版本。

[root@git-node1xubusi]# git reset --hard HEAD^ #還原歷史提交版本上一次

HEADis now at 2caa209 changed the file name

[root@git-node1xubusi]# cat readme.txt #查看文件內容(已經還原)

Createnew branch is linux

剛剛的操作實際上就是改變了一下HEAD版本指針的位置,就是你將HEAD指針放在那裡,那麼你的當前工作版本就會定位在那裡,要想把內容再還原到最新提交的版本,先看查看下提交版本號

[root@git-node1xubusi]# git log --pretty=oneline

2caa2090efa1aaf5c32524a13c500c1524e0a5eechanged the file name

88f379175b5ead7e0d84e47bd6db6f5a3b072921changed name

怎麼搞得?竟然沒有了Introduction software這個提交版本記錄?

原因很簡單,因為我們當前的工作版本是歷史的一個提交點,這個歷史提交點還沒有發生過Introduction software更新記錄,所以當然就看不到了,要是想“還原到未來”的歷史更新點,可以用git reflog命令來查看所有的歷史記錄:

[root@git-node1xubusi]# git reflog #查看未來歷史更新點

2caa209HEAD@{0}: reset: moving to HEAD^

4bf5b29 HEAD@{1}: commit:introduction software

2caa209HEAD@{2}: commit: changed the file name

[root@git-node1xubusi]# git reset --hard4bf5b29 #找到歷史還原點的SHA-1值後,就可以還原(值不寫全,系統會自動匹配)

HEADis now at 4bf5b29 introduction software

[root@git-node1xubusi]# cat readme.txt #查看文件內容(已經還原)

Createnew branch is linux

Git isa version control system

如是只是想把某個文件內容還原,就不必這麼麻煩,直接用git checkout命令就可以的,先寫一段話

[root@git-node1xubusi]# echo "Some mistkes words">> readme.txt

[root@git-node1xubusi]# cat readme.txt #查看內容

Git isa version control system

Somemistkes words

我們突然發現不應該寫一句話的,可以手工刪除(當內容比較多的時候會很麻煩),還可以將文件內容從暫存區中恢復

[root@git-node1xubusi]# git checkout -- readme.txt

[root@git-node1xubusi]# cat readme.txt

Git isa version control system

這其中是有一套規則,如果暫存區中有該文件,則直接從暫存區恢復,如果暫存區沒有該文件,則將還原成最近一次文件提交時的快照。

1.6Git管理分支結構

分支即是平行空間,假設你在為某個手機系統研發拍照功能,代碼已經完成了80%,但如果將這不完整的代碼直接提交到git倉庫中,又有可能影響到其他人的工作,此時我們便可以在該軟件的項目之上創建一個名叫“拍照功能”的分支,這種分支只會屬於你自己,而其他人看不到,等代碼編寫完成後再與原來的項目主分支合並下即可,這樣即能保證代碼不丟失,又不影響其他人的工作。

wKioL1bKo7HCNXsMAAAw30rkKyc701.png

一般在實際的項目開發中,我們要盡量保證master分支是非常穩定的,僅用於發布新版本,平時不要隨便直接修改裡面的數據文件,而工作的時候則可以新建不同的工作分支,等到工作完成後在合並到master分支上面,所以團隊的合作分支看起來會像上面圖那樣。

wKiom1bKo1Pihz5PAABfONSGkIg127.png

生產代碼提交方式

1.6.1Git創建分支

[root@git-node1xubusi]# git branch linux #創建分支

[root@git-node1xubusi]# git checkout linux #切換分支

Switchedto branch 'linux'

[root@git-node1xubusi]# git branch #查看當前分支情況,當前分支前有*號

* linux

master

[root@git-node1xubusi]# echo "Create new branchis linux" >> readme.txt #我們對文件追加一行字符串

[root@git-node1xubusi]# git add readme.txt #提交到暫存區

[root@git-node1xubusi]# git commit -m "newbranch" #提交到git版本倉庫

[linux8bf5757] new branch

1 file changed, 1 insertion(+)

[root@git-node1xubusi]# git checkout master #我們在提交文件後再切回master分支

Switchedto branch 'master'

[root@git-node1xubusi]# cat readme.txt #查看文件內容,發現並沒有新追加的字符串

1 hehe

1.6.2Git合並分支

現在,我們想把linux的工作成果合並到master分支上了,則可以使用”git merge”命令來將指定的的分支與當前分支合並

wKioL1bKo8zQfDVNAABTholrxeE215.png

git合並分之示意圖

[root@git-node1xubusi]# git branch #查看是否在master分支

linux

*master

[root@git-node1xubusi]# git merge linux #合並Linux分支至master

Updating185d668..8bf5757

Fast-forward

readme.txt | 1 +

1 file changed, 1 insertion(+)

[root@git-node1xubusi]# cat readme.txt #查看合並後的readme文件

1 hehe

Createnew branch is linux

[root@git-node1xubusi]# git branch -d linux #確認合並完成後,可以放心地刪除Linux分支

Deletedbranch linux (was 8bf5757).

[root@git-node1xubusi]# git branch #刪除後,查看branch,只剩下master分支了

*master

1.6.3Git分支沖突

但是Git並不能每次都為我們自動的合並分支,當遇到了內容沖突比較復雜的情況,則必須手工將差異內容處理點,比如這樣的情況:wKiom1bKo2-jBrx9AABH9ztbopQ847.png

git分支沖突示意圖

[root@git-node1xubusi]# git checkout -b linux #創建分支並切換到該分支

[root@git-node1xubusi]# git branch #查看分支

* linux

master

[root@git-node1xubusi]# vim readme.txt #編輯readme文件

[root@git-node1xubusi]# git add readme.txt #在Linux分支添加readme至暫存區

[root@git-node1xubusi]# git commit -m "createtwo" #在Linux分支提交readme

[linux13a42ad] create two

1 file changed, 1 insertion(+), 2 deletions(-)

[root@git-node1xubusi]# git checkout master #切換到master分支

Switchedto branch 'master'

[root@git-node1xubusi]# git branch #查看是否切換至master分支

linux

* master

[root@git-node1xubusi]# vim readme.txt #編在master分支上修改readme文件同一行的內容

[root@git-node1xubusi]# git add readme.txt#添加至暫存區

[root@git-node1xubusi]# git commit -m 'create tomaster' #提交至Git版本倉庫

[master75bd55c] create to master

1 file changed, 1 insertion(+)

[root@git-node1xubusi]# git merge linux #合並Linux分支(沖突)

Auto-mergingreadme.txt

CONFLICT(content): Merge conflict in readme.txt

Automaticmerge failed; fix conflicts and then commit the result.

#那麼此時,我們在master與linux分支上都分別對中readme文件進行了修改並提交了,那這種情況下Git就沒法再為我們自動的快速合並了,它只能告訴我們readme文件的內容有沖突,需要手工處理沖突的內容後才能繼續合並

[root@git-node1xubusi]# cat readme.txt #沖突內容如下

#Git用< <<<<<<,=======,>>>>>>>分割開了各個分支沖突的內容,我們需要手工的刪除這些符號,並將內容修改

1 hehe

<<<<<<

=======

>>>>>>>linux

Createnew branch is linux

[root@git-node1xubusi]# git add readme.txt #再次添加至暫存區

[root@git-node1xubusi]# git commit -m 'config' #提交至git版本倉庫

[mastereb9bb83] config

[root@git-node1xubusi]# git branch -d linux #最後刪除Linux分支結束

Deletedbranch linux (was 13a42ad).

[root@git-node1xubusi]# git branch #檢查是否刪除完畢

* master

1.7Git管理標簽

當版本倉庫內的數據有個大的改善或者功能更新,我們經常會打一個類似於軟件版本號的標簽,這樣通過標簽就可以將版本庫中的某個歷史版本給記錄下來,方便我們隨時將特定歷史時期的數據取出來用,另外打標簽其實只是像某個歷史版本做了一個指針,所以一般都是瞬間完成的。

[root@git-node1~]# cd xubusi/ #進入git版本控制系統

[root@git-node1xubusi]# git tag v1.0 #當前提交內容打一個標簽(方便快速回滾)

[root@git-node1xubusi]# git tag #查看當前所有的標簽

v1.0

[root@git-node1xubusi]# git show v1.0 #查看當前1.0版本的詳細信息

commit4bf5b296db9678f1851b896ed040fe37e6d7efb5

Author:xubusi

Date: Sat Jan 16 19:02:14 2016 +0800

introduction software

diff--git a/readme.txt b/readme.txt

indexa9b574e..412b267 100644

---a/readme.txt

+++b/readme.txt

@@-1,3 +1,4 @@

1 hehe

Create new mode two

Create new branch is linux

+Gitis a version control system

[root@git-node1xubusi]# git tag v1.2 -m"version 1.2 release is test" #創建帶有說明的標簽,-a指定標簽名字,-m指定說明文字

[root@git-node1xubusi]# git tag -d v1.0 #我們為同一個提交版本設置了兩次標簽,刪除之前的v1.0

Deletedtag 'v1.0' (was 4bf5b29)

[root@git-node1xubusi]# git tag #再次查看,v1.0已經被刪除

v1.2

1.8GitLab安裝部署

1. 安裝和配置必要的依賴關系Install and configure thenecessary dependencies

如果你安裝postfix發送郵件,請選擇“網站設置”中。而不是使用後綴也可以用郵件或配置自定義SMTP服務器。如果你想使用的進出口,請配置為SMTP服務器。

在CentOS7,下面的命令將在系統防火牆打開HTTP和SSH訪問。

yum install curl openssh-server postfix

systemctl enable sshd postfix

systemctl start sshd postfix

firewall-cmd --permanent --add-service=http

systemctl reload firewalld

2. 添加gitlab包服務器安裝包Add the GitLab package server and install the package

curl-sShttps://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh| sudo bash

yuminstall gitlab-ce

3. 配置並啟動gitlab Configure and start GitLab

gitlab-ctlreconfigure

gitlab-ctlstatus

gitlab-ctlstop

gitlab-ctlstart

4. 浏覽到主機名和登錄Browse to the hostname and login

Username:root Password:5iveL!fe

1.8.1GitLab配置ssh

gitlab搭配ssh默認端口引發的血戰

問題如下:

wKiom1bKo3_i8fMHAAEfPqPBVtE529.png

仔細發現故障情況

[root@git-node1xubusi]# sed -i 's/#Port 22/Port52113/g' /etc/ssh/sshd_config#如果是默認的22,就必須修改,否則不生效,我這裡改為了52113

[root@git-node1xubusi]# systemctl restart sshd #重啟sshd服務

[root@git-node1xubusi]# grep "ssh_port"/etc/gitlab/gitlab.rb #修改gitlab裡面的ssh_prot端口為自己服務器的sshd端口,聲明gitlab.yml中的配置會被這個給覆蓋

gitlab_rails['gitlab_shell_ssh_port']= 52113

[root@git-node1xubusi]# gitlab-ctl reconfigure #gitlab重新加載配置文件即可

wKiom1bKo43A0O2SAAD9c0vbOKg102.png

解決後效果,做一個對比,細心的朋友肯定能發現

gitlab和github其實pull和push是一樣的,所以我會在下面介紹如何用github來pull和push

1.9GitHub托管服務

Github顧名思義是一個Git版本庫的托管服務,是目前全球最大的軟件倉庫,擁有上百萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑,Github不僅可以托管各種Git版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發者為開源項貢獻代碼變得更加容易,當然也可以付費購買私有庫,這樣高性價比的私有庫真的是幫助到了很多團隊和企業。大多數用戶都是為了尋找資源而愛上Github的,首先進入網站,點擊注冊(Sign up):

wKioL1bKpAnAGnKeAAF_2w86im4371.png

如果沒有注冊的朋友點擊注冊

wKioL1bKpCrBjiXJAAEKruZf2pE561.png

填寫注冊信息wKiom1bKo8GT8YvXAAFE9_Db-cY360.png

選擇倉庫類型,默認免費,點擊底下finishsign up注冊

wKioL1bKpC-iLivXAAFte-ewyww509.png

我們的GitHub賬號注冊完成

我們在向Github推送文件時,可以選擇SSH協議模式,在本機生成密鑰

[root@git-node1~]# ssh-keygen #生成密鑰命令

Generatingpublic/private rsa key pair.

Enterfile in which to save the key (/root/.ssh/id_rsa):

Enterpassphrase (empty for no passphrase):

Entersame passphrase again:

Youridentification has been saved in /root/.ssh/id_rsa.

Yourpublic key has been saved in /root/.ssh/id_rsa.pub.

Thekey fingerprint is:

00:93:62:97:fd:a8:7a:7b:33:0f:2d:81:e1:11:17:[email protected]

Thekey's randomart image is:

+--[RSA 2048]----+

| =+o.|

| o +B.|

| . oE.o |

| . +...|

| o.. S|

| .o |

| . o. |

| . . +o|

| ..o +.|

+-----------------+

[root@git-node1 ~]# cat ~/.ssh/id_rsa.pub #查看公鑰

ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQCXv4xsa4l9fvKCDTWMvG0meoMveklG/beOvkw9xVnmFVhTg4qOCVhLXaaQtR1PJnKVhMok1vtYZu+ldAMHsSmHMuUCK2KMNFrZZaEloMeCNRkFY2vhY5XHuUBK2NjwgLjDXCYtIU40UmlFCU974ybWZJaCteIoHstLLQPoG/5PF5gqBOCeNLxkpq35jJTO9JvexeBMr2hG7NSzg9uZEDyRPUwEVY2yYZkq7hlAnR5H4f1X6HPePc64ZWLT3ZyddlK/9EXDLPu2VLMC7lj5mTGrJlQ54TU3dqSYQXzIV88GsdqxfZj8xbb9JOUZJK4KjAvqUkVmtaVFTTM77zCPUJSNroot@git-node1.com

wKiom1bKo_agZ2BnAAD22DiRb9Y161.png

點擊setting賬戶配置

wKioL1bKpHHQMk_zAADDGpaBwfU111.png

點擊SSH keys

wKiom1bKpBbyOgg8AAEDvMWhYbA904.png

添加git服務器上生成的公鑰id_rsa.pub點擊Add key添加

wKiom1bKpCWinoN9AACdBzAWgco023.png

查看ssh公鑰信息

wKioL1bKpJ3gE6XxAABopRW8BkA916.png

准備工作已經完畢,右上角點擊創建一個新的倉庫wKioL1bKpK2yDDYMAAElVYS6k34498.png

填寫倉庫的信息wKioL1bKpL2gZbJtAAES8g0Hu_k854.png

創建成功後會跳轉到該倉庫,選擇ssh模式,復制版本倉庫克隆地址

[root@git-node1~]# git [email protected]:xubusi3/demo.git #手動克隆測試

Cloninginto 'demo'...

remote:Counting objects: 3, done.

remote:Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

Receivingobjects: 100% (3/3), done.

[root@git-node1 ~]# cat demo/README.md #查看詳細信息

# demo

描述信息--可以不寫

[root@git-node1 ~]# cd demo/ #進入github clone下來的倉庫

[root@git-node1 demo]# echo "test is git" >>test.txt #添加新文件

[root@git-node1 demo]# git add test.txt #添加到git暫存區

[root@git-node1 demo]# git commit -m "add test file" #提交到git版本倉庫

[master 66cace0] add test file

1 file changed, 1insertion(+)

create mode 100644test.txt

[root@git-node1 demo]# git remote #查看本機列表

origin

[root@git-node1 demo]# git push -u origin master#然後將本地的Git倉庫同步到遠程Github服務器上(第一次請加上參數-u,代表關聯本地與遠程)

Counting objects: 4, done.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To [email protected]:xubusi3/demo.git

1b836ba..66cace0 master ->master

Branch master set up to track remote branch master fromorigin.

wKiom1bKpGSREy-FAAC00ajcfRs043.png

刷新一下web,果然看到版本倉庫已經同步了

1.10Git客戶端工具

https://www.sourcetreeapp.com/

Git和Mercurial的Windows或Mac的客戶端

Copyright © Linux教程網 All Rights Reserved