這篇文章來自于老男孩教育高級架構師班12期的徐亮偉同學。
首先感謝老男孩架構師班趙班長深入講解Git,綜合自己實踐整理而來,特此在今天分享給大家。
Git誕生歷史
我想大家還記得Linus torvalds在1991年時發布了Linux操作系統吧,從那以后Linux系統變不斷發展壯大,因為Linux系統開源的特性,所以一直接受著來自全球Linux技術愛好者的貢獻,志愿者們通過郵件向Linus發送著自己編寫的源代碼文件,然后由Linus本人通過手工的方式將代碼合并,但這樣不僅沒有效率,而且真的是太痛苦了。
一直到2002年,Linux系統經過十余年的不斷發展,代碼庫已經龐大到無法再讓Linus通過手工的方式管理了,但是Linus真的很不喜歡CVS或者Subversion版本控制系統,于是商業公司BitMover決定將其公司的BitKeeper分布式版本控制系統授權給Linux開發社區來免費使用,當時的BitKeeper可以比較文件內容的不同,還能夠將出錯的文檔還原到歷史某個狀態,Linus終于放下了心里的石頭。
分布式版本控制流程圖
CVS和Subversion屬于傳統的版本控制系統,而分布式版本控制系統最大的特點是不需要每次提交都把文件推送到版本控制服務器,而是采用分布式版本庫的機制,使得每個開發人員都夠從服務器中克隆一份完整的版本庫到自己計算機本地,不必再完全依賴于版本控制服務器,使得源代碼的發布和合并更加方便,并且因為數據都在自己本地,不僅效率提高了,而且即便我們離開了網絡依然可以執行提交文件、查看歷史版本記錄、創建分支等等操作,真的是開發者的福音啊。
就這樣平靜的度過了三年時間,但是Linux社區聚集著太多的黑客人物,2005年時,那位曾經開發Samba服務程序的Andrew因為試圖破解BitKeeper軟件協議而激怒了BitMover公司,當即決定不再向Linux社區提供免費的軟件授權了,此時的Linus其實也早已有自己編寫分布式版本控制系統的打算了,于是便用C語言花了2周創建了Git分布式版本控制系統,并上傳了Linux系統的源代碼。
git_logo
Git不僅是一款開源的分布式版本控制系統,而且有其獨特的功能特性,例如大多數的分布式版本控制系統只會記錄每次文件的變化,說白了就是只會關心文件的內容變化差異,而Git則是關注于文件數據整體的變化,直接會將文件提交時的數據保存成快照,而非僅記錄差異內容,并且使用SHA-1加密算法保證數據的完整性。
Git為了提高效率,對于沒有被修改的文件,則不會重復存儲,而是創建一個鏈接指向之前存儲過的文件。
git提交流程圖
在正式使用前,我們還需要弄清楚Git的三種重要模式,分別是已提交、已修改、已暫存
已提交(committed):表示數據文件已經順利提交到Git數據庫中。
已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。
已暫存(staged):表示數據文件已經被修改,并會在下次提交時提交到Git數據庫中。
提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程為:
1.在工作目錄中修改數據文件。
2.將文件的快照放入暫存區域。
3.將暫存區域的文件快照提交到Git倉庫中。
git工作模式
Git環境準備
[root@git-node1 ~]# cat /etc/redhat-release#查看系統版本
CentOS Linux 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 ~]# systemctl stop firewalld#關閉防火墻
[root@git-node1 ~]# ifconfig eth0|awk -F ‘[ ]+’ ‘NR==2{print $3}’#查看當前主機IP地址
192.168.56.115
Git安裝部署
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 “xubusi@mail.com”
#配置git使用郵箱
[root@git-node1 ~]#git config –global color.ui true
[root@git-node1 ~]#git config –list
user.name=xubusi
user.email=xubusi@mail.com
color.ui=true
Git常用命令
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對象
Git基本操作
Git提交數據
我們可以簡單的把工作目錄理解成是一個被Git服務程序管理的目錄,Git會時刻的追蹤目錄內文件的改動,另外在安裝好了Git服務程序后,默認就會創建好了一個叫做master的分支,我們直接可以提交數據到了
[root@git-node1 ~]#mkdir xubusi
#創建本地工作目錄
[root@git-node1 ~]#cd xubusi/
#進入本地工作目錄
[root@git-node1 xubusi]#git init#初始為git工作目錄
Initialized empty Git repository in /root/xubusi/.git/
[root@git-node1 xubusi]# touch readme
#創建文件
[root@git-node1 xubusi]#git status
#查看git狀態
# Untracked files:
# (use “git add …” to include in what will be committed)
#readme.txt
#發現新建的readme.txt文件
…
[root@git-node1 xubusi]#git add readme.txt
#git添加文件至暫存區
[root@git-node1 xubusi]#git status#再次查看狀態
# Changes to be committed:
# (use “git rm –cached …” to unstage)
#new file: readme.txt#發現新建立的文件readme.txt已經變綠
…
[root@git-node1 xubusi]#git commit -m “the first commit”#git cmmit提交暫存取文件至git版本倉庫
[master (root-commit) dde9e40] the first commit
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
Git移除數據
有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。
[root@git-node1 xubusi]#touch database
#建立文件
[root@git-node1 xubusi]#git add database
#添加文件至暫存區
[root@git-node1 xubusi]#git status#查看當前git狀態
# On branch master
# Your branch is ahead of ‘origin/master’ by 4 commits.
# (use “git push” to publish your local commits)
#
# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# new file: database
[root@git-node1 xubusi]#git rm –cached database
#將文件從git暫存區域的追蹤列表移除(并不會刪除當前工作目錄內的數據文件)
rm ‘database’
[root@git-node1 xubusi]#git status#此時文件已經是未追蹤狀態了
# On branch master
# Untracked files:
# (use “git add …” to include in what will be committed)
#
# database
no changes added to commit (use “git add” and/or “git commit -a”)
#如果想將文件數據從git暫存區和工作目錄一起刪除,可以做如下操作。
[root@git-node1 xubusi]#git add database
#再將database文件提交到git暫存區
[root@git-node1 xubusi]#git rm -f database#但如果在刪除之前數據文件已經被放入到暫存區域的話,git會擔心你誤刪未提交的文件而報錯信息,此時可追加強制刪除-f參數。
rm ‘database’
[root@git-node1 xubusi]#ls#查看工作區也沒database文件
LICENSE deploy help.md readme.txt
[root@git-node1 xubusi]#git status#查看當前狀態
# On branch master
no changes added to commit (use “git add” and/or “git commit -a”)
Git移動數據
[root@git-node1 xubusi]#git mv readme.txt test.txt#git如果要修改文件名稱,則使用git mv命令
[root@git-node1 xubusi]#git status
#查看狀態發現下次提交會有一個改名操作
# On branch master
# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# renamed: readme.txt -> test.txt
[root@git-node1 xubusi]#git commit -m “changed name”
#提交到git版本倉庫
[master 88f3791] changed name
2 files changed, 31 deletions(-)
delete mode 100644 1
rename readme.txt => test.txt (100%)
#其實可以如下方法改名
[root@git-node1 xubusi]#mv test.txt readme.txt#先修改名稱
[root@git-node1 xubusi]# git rm test.txt#然后刪除git版本倉庫內的文件快照
rm ‘test.txt’
[root@git-node1 xubusi]#git add readme.txt#最后再將新的文件添加進入
[root@git-node1 xubusi]#git commit -m “changed the file name”#提交至git版本倉庫
[master 2caa209] changed the file name
1 file changed, 0 insertions(+), 0 deletions(-)
rename test.txt => readme.txt (100%)
Git歷史記錄
[root@git-node1 xubusi]#git log#查看提交歷史記錄
commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee
Author: xubusi
Date: Sat Jan 16 18:32:53 2016 +0800
changed the file name
commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921
Author: xubusi
Date: Sat Jan 16 18:31:03 2016 +0800
changed name
commit 76c486fcf5d70b6a443ba9e7dad209c6722c8bee
Author: xubusi
Date: Sat Jan 16 18:22:39 2016 +0800
tet
[root@git-node1 xubusi]#git log -2#查看最近幾條記錄
commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee
Author: xubusi
Date: Sat Jan 16 18:32:53 2016 +0800
changed the file name
commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921
Author: xubusi
Date: Sat Jan 16 18:31:03 2016 +0800
changed name
[root@git-node1 xubusi]#
[root@git-node1 xubusi]#git log -p -1#-p顯示每次提交的內容差異,例如僅查看最近一次差異
commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee
Author: xubusi
Date: Sat Jan 16 18:32:53 2016 +0800
changed the file name
diff –git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..a9b574e
— /dev/null
+++ b/readme.txt
@@ -0,0 +1,3 @@
+1 hehe
+Create new mode two
+Create new branch is linux
diff –git a/test.txt b/test.txt
deleted file mode 100644
index a9b574e..0000000
— a/test.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-1 hehe
-Create new mode two
-Create new branch is linux
[root@git-node1 xubusi]#git log –stat -2
#–stat簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,并在最后列出所有增減行的概要信息
commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee
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(+), 3 deletions(-)
commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921
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(+), 34 deletions(-)
[root@git-node1 xubusi]#git log –pretty=oneline#–pretty根據不同的格式展示提交的歷史信息
2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name
88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name
76c486fcf5d70b6a443ba9e7dad209c6722c8bee tet
[root@git-node1 xubusi]#git log –pretty=fuller -2#以更詳細的模式輸出提交的歷史記錄
commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee
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
commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921
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-node1 xubusi]#git log –pretty=fomat:”%h %cn”
#查看當前所有提交記錄的簡短SHA-1哈希字串與提交著的姓名
fomat:2caa209 xubusi
fomat:88f3791 xubusi
fomat:76c486f xubusi
Git還原數據
[root@git-node1 xubusi]#echo “Git is a version control system” >> readme.txt
#追加一段話
[root@git-node1 xubusi]#git add readme.txt#添加至暫存區
[root@git-node1 xubusi]#git commit -m “introduction software”#提交至git版本倉庫
[master 4bf5b29] introduction software
1 file changed, 1 insertion(+)
此時覺得寫得不妥,想還原某一次提交的文件快照
[root@git-node1 xubusi]#git log –pretty=oneline#提交的歷史信息
4bf5b296db9678f1851b896ed040fe37e6d7efb5 introduction software
2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name
88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name
Git服務程序中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,但是因為Git是分布式版本控制系統,為了避免歷史記錄沖突,故使用了SHA-1計算出十六進制的哈希字串來區分每個提交版本,另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第五個提交版本。
[root@git-node1 xubusi]#git reset –hard HEAD^
#還原歷史提交版本上一次
HEAD is now at 2caa209 changed the file name
[root@git-node1 xubusi]#cat readme.txt
#查看文件內容(已經還原)
Create new branch is linux
剛剛的操作實際上就是改變了一下HEAD版本指針的位置,就是你將HEAD指針放在那里,那么你的當前工作版本就會定位在那里,要想把內容再還原到最新提交的版本,先看查看下提交版本號
[root@git-node1 xubusi]#git log –pretty=oneline
2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name
88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name
怎么搞得?竟然沒有了Introduction software這個提交版本記錄?
原因很簡單,因為我們當前的工作版本是歷史的一個提交點,這個歷史提交點還沒有發生過Introduction software更新記錄,所以當然就看不到了,要是想”還原到未來”的歷史更新點,可以用git reflog命令來查看所有的歷史記錄:
[root@git-node1 xubusi]#git reflog#查看未來歷史更新點
2caa209 HEAD@{0}: reset: moving to HEAD^
4bf5b29 HEAD@{1}: commit: introduction software
2caa209 HEAD@{2}: commit: changed the file name
[root@git-node1 xubusi]#git reset –hard 4bf5b29#找到歷史還原點的SHA-1值后,就可以還原(值不寫全,系統會自動匹配)
HEAD is now at 4bf5b29 introduction software
[root@git-node1 xubusi]#cat readme.txt#查看文件內容(已經還原)
Create new branch is linux
Git is a version control system
如是只是想把某個文件內容還原,就不必這么麻煩,直接用git checkout命令就可以的,先寫一段話
[root@git-node1 xubusi]#echo “Some mistkes words” >> readme.txt
[root@git-node1 xubusi]#cat readme.txt#查看內容
Git is a version control system
Some mistkes words
我們突然發現不應該寫一句話的,可以手工刪除(當內容比較多的時候會很麻煩),還可以將文件內容從暫存區中恢復
[root@git-node1 xubusi]#git checkout — readme.txt
[root@git-node1 xubusi]#cat readme.txt
Git is a version control system
這其中是有一套規則,如果暫存區中有該文件,則直接從暫存區恢復,如果暫存區沒有該文件,則將還原成最近一次文件提交時的快照。
Git管理分支結構
分支即是平行空間,假設你在為某個手機系統研發拍照功能,代碼已經完成了80%,但如果將這不完整的代碼直接提交到git倉庫中,又有可能影響到其他人的工作,此時我們便可以在該軟件的項目之上創建一個名叫”拍照功能”的分支,這種分支只會屬于你自己,而其他人看不到,等代碼編寫完成后再與原來的項目主分支合并下即可,這樣即能保證代碼不丟失,又不影響其他人的工作。
一般在實際的項目開發中,我們要盡量保證master分支是非常穩定的,僅用于發布新版本,平時不要隨便直接修改里面的數據文件,而工作的時候則可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以團隊的合作分支看起來會像上面圖那樣。
生產代碼提交方式
Git創建分支
[root@git-node1 xubusi]#git branch linux
#創建分支
[root@git-node1 xubusi]#git checkout linux#切換分支
Switched to branch ‘linux’
[root@git-node1 xubusi]#git branch
#查看當前分支情況,當前分支前有*號
* linux
master
[root@git-node1 xubusi]#echo “Create new branch is linux” >> readme.txt
#我們對文件追加一行字符串
[root@git-node1 xubusi]#git add readme.txt#提交到暫存區
[root@git-node1 xubusi]#git commit -m “new branch”
#提交到git版本倉庫
[linux 8bf5757] new branch
1 file changed, 1 insertion(+)
[root@git-node1 xubusi]#git checkout master#我們在提交文件后再切回master分支
Switched to branch ‘master’
[root@git-node1 xubusi]#cat readme.txt#查看文件內容,發現并沒有新追加的字符串
1 hehe
Git合并分支
現在,我們想把linux的工作成果合并到master分支上了,則可以使用”git merge”命令來將指定的的分支與當前分支合并
git合并分之示意圖
[root@git-node1 xubusi]#git branch
#查看是否在master分支
linux
* master
[root@git-node1 xubusi]#git merge linux#合并Linux分支至master
Updating 185d668..8bf5757
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
[root@git-node1 xubusi]#cat readme.txt#查看合并后的readme文件
1 hehe
Create new branch is linux
[root@git-node1 xubusi]#git branch -d linux#確認合并完成后,可以放心地刪除Linux分支
Deleted branch linux (was 8bf5757).
[root@git-node1 xubusi]#git branch#刪除后,查看branch,只剩下master分支了
* master
Git分支沖突
但是Git并不能每次都為我們自動的合并分支,當遇到了內容沖突比較復雜的情況,則必須手工將差異內容處理點,比如這樣的情況:
git分支沖突示意圖
[root@git-node1 xubusi]#git checkout -b linux
#創建分支并切換到該分支
[root@git-node1 xubusi]#git branch#查看分支
* linux
master
[root@git-node1 xubusi]#vim readme.txt#編輯readme文件
[root@git-node1 xubusi]#git add readme.txt
#在Linux分支添加readme至暫存區
[root@git-node1 xubusi]#git commit -m “create two”#在Linux分支提交readme
[linux 13a42ad] create two
1 file changed, 1 insertion(+), 2 deletions(-)
[root@git-node1 xubusi]#git checkout master
#切換到master分支
Switched to branch ‘master’
[root@git-node1 xubusi]#git branch
#查看是否切換至master分支
linux
* master
[root@git-node1 xubusi]#vim readme.txt#編在master分支上修改readme文件同一行的內容
[root@git-node1 xubusi]#git add readme.txt
#添加至暫存區
[root@git-node1 xubusi]#git commit -m ‘create to master’
#提交至Git版本倉庫
[master 75bd55c] create to master
1 file changed, 1 insertion(+)
[root@git-node1 xubusi]#git merge linux
#合并Linux分支(沖突)
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
#那么此時,我們在master與linux分支上都分別對中readme文件進行了修改并提交了,那這種情況下Git就沒法再為我們自動的快速合并了,它只能告訴我們readme文件的內容有沖突,需要手工處理沖突的內容后才能繼續合并
[root@git-node1 xubusi]#cat readme.txt#沖突內容如下
#Git用< <<<<<<,=======,>>>>>>>分割開了各個分支沖突的內容,我們需要手工的刪除這些符號,并將內容修改
1 hehe
<<<<<<< HEAD
=======
>>>>>>> linux
Create new branch is linux
[root@git-node1 xubusi]#git add readme.txt#再次添加至暫存區
[root@git-node1 xubusi]#git commit -m ‘config’#提交至git版本倉庫
[master eb9bb83] config
[root@git-node1 xubusi]#git branch -d linux#最后刪除Linux分支結束
Deleted branch linux (was 13a42ad).
[root@git-node1 xubusi]#git branch#檢查是否刪除完畢
* master
Git管理標簽
當版本倉庫內的數據有個大的改善或者功能更新,我們經常會打一個類似于軟件版本號的標簽,這樣通過標簽就可以將版本庫中的某個歷史版本給記錄下來,方便我們隨時將特定歷史時期的數據取出來用,另外打標簽其實只是像某個歷史版本做了一個指針,所以一般都是瞬間完成的。
[root@git-node1 ~]#cd xubusi/#進入git版本控制系統
[root@git-node1 xubusi]#git tag v1.0#當前提交內容打一個標簽(方便快速回滾)
[root@git-node1 xubusi]#git tag#查看當前所有的標簽
v1.0
[root@git-node1 xubusi]#git show v1.0#查看當前1.0版本的詳細信息
commit 4bf5b296db9678f1851b896ed040fe37e6d7efb5
Author: xubusi
Date: Sat Jan 16 19:02:14 2016 +0800
introduction software
diff –git a/readme.txt b/readme.txt
index a9b574e..412b267 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
1 hehe
Create new mode two
Create new branch is linux
+Git is a version control system
[root@git-node1 xubusi]#git tag v1.2 -m “version 1.2 release is test”#創建帶有說明的標簽,-a指定標簽名字,-m指定說明文字
[root@git-node1 xubusi]#git tag -d v1.0#我們為同一個提交版本設置了兩次標簽,刪除之前的v1.0
Deleted tag ‘v1.0’ (was 4bf5b29)
[root@git-node1 xubusi]#git tag
#再次查看,v1.0已經被刪除
v1.2
GitLab安裝部署
1.安裝和配置必要的依賴關系Install and configure the necessary 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 -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum install gitlab-ce
3.配置并啟動gitlab Configure and start GitLab
gitlab-ctl reconfigure
gitlab-ctl status
gitlab-ctl stop
gitlab-ctl start
4.瀏覽到主機名和登錄Browse to the hostname and login
Username:root
Password:5iveL!fe
GitLab配置ssh
gitlab搭配ssh默認端口引發的血戰
問題如下:
仔細發現故障情況
[root@git-node1 xubusi]#sed -i ‘s/#Port 22/Port 52113/g’ /etc/ssh/sshd_config
#如果是默認的22,就必須修改,否則不生效,我這里改為了52113
[root@git-node1 xubusi]#systemctl restart sshd#重啟sshd服務
[root@git-node1 xubusi]#grep “ssh_port” /etc/gitlab/gitlab.rb#修改gitlab里面的ssh_prot端口為自己服務器的sshd端口,聲明gitlab.yml中的配置會被這個給覆蓋
gitlab_rails[‘gitlab_shell_ssh_port’] = 52113
[root@git-node1 xubusi]#gitlab-ctl reconfigure#gitlab重新加載配置文件即可
解決后效果,做一個對比,細心的朋友肯定能發現
gitlab和github其實pull和push是一樣的,所以我會在下面介紹如何用github來pull和push
GitHub托管服務
Github顧名思義是一個Git版本庫的托管服務,是目前全球最大的軟件倉庫,擁有上百萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑,Github不僅可以托管各種Git版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發者為開源項貢獻代碼變得更加容易,當然也可以付費購買私有庫,這樣高性價比的私有庫真的是幫助到了很多團隊和企業。
大多數用戶都是為了尋找資源而愛上Github的,首先進入網站,點擊注冊(Sign up):
如果沒有注冊的朋友點擊注冊
填寫注冊信息
選擇倉庫類型,默認免費,點擊底下finish sign up注冊
我們的GitHub賬號注冊完成
我們在向Github推送文件時,可以選擇SSH協議模式,在本機生成密鑰
[root@git-node1 ~]#ssh-keygen#生成密鑰命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
00:93:62:97:fd:a8:7a:7b:33:0f:2d:81:e1:11:17:b2 root@git-node1.com
The key’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-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCXv4xsa4l9fvKCDTWMvG0meoMveklG/beOvkw9xVnmFVhTg4qOCVhLXaaQtR1PJnKVhMok1vtYZu+ldAMHsSmHMuUCK2KMNFrZZaEloMeCNRkFY2vhY5XHuUBK2NjwgLjDXCYtIU40UmlFCU974ybWZJaCteIoHstLLQPoG/5PF5gqBOCeNLxkpq35jJTO9JvexeBMr2hG7NSzg9uZEDyRPUwEVY2yYZkq7hlAnR5H4f1X6HPePc64ZWLT3ZyddlK/9EXDLPu2VLMC7lj5mTGrJlQ54TU3dqSYQXzIV88GsdqxfZj8xbb9JOUZJK4KjAvqUkVmtaVFTTM77zCPUJSN root@git-node1.com
點擊setting賬戶配置
點擊SSH keys
添加git服務器上生成的公鑰id_rsa.pub點擊Add key添加
查看ssh公鑰信息
準備工作已經完畢,右上角點擊創建一個新的倉庫
填寫倉庫的信息
創建成功后會跳轉到該倉庫,選擇ssh模式,復制版本倉庫克隆地址
[root@git-node1 ~]#git clone git@github.com:xubusi3/demo.git
#手動克隆測試
Cloning into ‘demo’…
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 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, 1 insertion(+)
create mode 100644 test.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 git@github.com:xubusi3/demo.git
1b836ba..66cace0 master -> master
Branch master set up to track remote branch master from origin.
刷新一下web,果然看到版本倉庫已經同步了
Git客戶端工具
https://www.sourcetreeapp.com/
Git和Mercurial的Windows或Mac的客戶端
原文鏈接:http://www.xuliangwei.com/xubusi/385.html
筆者QQ:572891887
Linux架構交流群:471443208