目錄
一痹届、代碼管理平臺介紹
二、客戶端上使用svn(linux)
三、客戶端上使用svn(windows)
四翻斟、單機(jī)上使用git
五玻褪、建立遠(yuǎn)程倉庫
六纵菌、克隆遠(yuǎn)程倉庫
七吻氧、分支管理
八、遠(yuǎn)程分支管理
九融欧、標(biāo)簽管理
十敏弃、git別名
十一、搭建git服務(wù)器
十二噪馏、安裝gitlab
十三麦到、使用gitlab
十四、gitlab備份與恢復(fù)
一欠肾、代碼管理平臺介紹
- 需要了解的常識
? 版本控制瓶颠,記錄若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況
? 版本管理工具發(fā)展簡史刺桃,cvs → svn → git 參考http://luckypoem14.github.io/test/2012/04/24/scm-history/
? svn全稱subversion粹淋,是一個開源版本控制系統(tǒng),始于2000年
? git是linux創(chuàng)始人linus發(fā)起的瑟慈,2005年發(fā)布桃移,最初目的是更好管理linux內(nèi)核代碼
? git和svn不同在于git不需要依賴服務(wù)端就可以工作,即git是分布式的
? 關(guān)于git和svn的比較大家參考http://blog.lishiming.net/?p=305
? github是基于git的在線web頁面代碼托管平臺封豪,可以選擇付費服務(wù)
? gitlab可以認(rèn)為是一個開源的github谴轮,兩者沒有直接關(guān)系
- 安裝svn
[root@minglinux-01 ~] yum install -y subversion
- 創(chuàng)建版本庫
[root@minglinux-01 ~] mkdir -p /data/svnroot/myproject
[root@minglinux-01 ~] svnadmin create /data/svnroot/myproject #初始化目錄文件
[root@minglinux-01 ~] ls -la !$
ls -la /data/svnroot/myproject
總用量 8
drwxr-xr-x 6 root root 86 2月 25 17:39 .
drwxr-xr-x 3 root root 23 2月 25 17:38 ..
drwxr-xr-x 2 root root 54 2月 25 17:39 conf
drwxr-sr-x 6 root root 233 2月 25 17:39 db
-r--r--r-- 1 root root 2 2月 25 17:39 format
drwxr-xr-x 2 root root 231 2月 25 17:39 hooks
drwxr-xr-x 2 root root 41 2月 25 17:39 locks
-rw-r--r-- 1 root root 229 2月 25 17:39 README.txt
[root@minglinux-01 ~] cd !$/conf
cd /data/svnroot/myproject/conf
[root@minglinux-01 /data/svnroot/myproject/conf] ls
authz passwd svnserve.conf
##authz為權(quán)限配置文件,passwd為密碼文件吹埠,svnserve.conf是倉庫的配置文件
[root@minglinux-01 /data/svnroot/myproject/conf] vim authz
#配置文件改為如下
···
[groups]
admins = lucci,user1 #admins組下有兩個用戶
[/] #指定目錄形式,根目錄就是/data/svnroot/myproject/
@admins = rw #admins組讀寫權(quán)限
*= r #除admins組外只讀權(quán)限
[myproject:/] #指定項目形式疮装,用于/data/svnroot目錄下有多個項目時指定myproject的權(quán)限
user1 = rw
[root@minglinux-01 /data/svnroot/myproject/conf] vim passwd
···
#加入以下內(nèi)容
[users]
lucci = lucci_!(*$123
user1 = user1_^^^123
user2 = user2-***123
[root@minglinux-01 /data/svnroot/myproject/conf] vim svnserve.conf
#更改或增加如下內(nèi)容
···
anon-access = none #匿名用戶無權(quán)限
auth-access = write #被授權(quán)用戶可寫
password-db = passwd #密碼文件
authz-db = authz #權(quán)限配置文件
realm = /data/svnroot/myproject #對該目錄生效
#啟動
[root@minglinux-01 /data/svnroot/myproject/conf] svnserve -d -r /data/svnroot
[root@minglinux-01 /data/svnroot/myproject/conf] ps aux |grep svn
root 1838 0.0 0.0 180716 804 ? Ss 21:00 0:00 svnserve -d -r /data/svnroot
root 1852 0.0 0.0 112720 984 pts/0 S+ 21:01 0:00 grep --color=auto svn
[root@minglinux-01 /data/svnroot/myproject/conf] netstat -lntp |grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1838/svnserve
###注意檢查關(guān)閉防火墻
二缘琅、客戶端上使用svn(linux)
yum install -y subversion
svn checkout svn://192.168.133.130/myproject --username=aming
cd myproject ; ls -la
cp /etc/fstab .
svn add . //添加到版本控制中心
svn commit -m “add file” //把文件上傳到服務(wù)器
svn delete filename //在本地刪除
svn commit -m “delete filename” //在服務(wù)器上刪除
svn update //把當(dāng)前目錄下的文件都更新到最新版
svn log //查看變更日志
#這里在服務(wù)端測試,無需再安裝svn
[root@minglinux-01 ~] mkdir /home/svntest
[root@minglinux-01 ~] cd !$
cd /home/svntest
[root@minglinux-01 /home/svntest] svn checkout svn://192.168.162.130/myproject --username=lucci
認(rèn)證領(lǐng)域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“l(fā)ucci”的密碼: #輸入配置文件中自定義的密碼
-----------------------------------------------------------------------
注意! 你的密碼廓推,對于認(rèn)證域:
<svn://192.168.162.130:3690> /data/svnroot/myproject
只能明文保存在磁盤上! 如果可能的話刷袍,請考慮配置你的系統(tǒng),讓 Subversion
可以保存加密后的密碼樊展。請參閱文檔以獲得詳細(xì)信息呻纹。
你可以通過在“/root/.subversion/servers”中設(shè)置選項“store-plaintext-passwords”為“yes”或“no”堆生,
來避免再次出現(xiàn)此警告。
-----------------------------------------------------------------------
保存未加密的密碼(yes/no)?yes
取出版本 0雷酪。
[root@minglinux-01 /home/svntest] ls
myproject
[root@minglinux-01 /home/svntest] ls -la myproject/
總用量 0
drwxr-xr-x 3 root root 18 2月 27 17:26 .
drwxr-xr-x 3 root root 23 2月 27 17:26 ..
drwxr-xr-x 4 root root 75 2月 27 17:26 .svn
- 測試
#使用另一臺虛擬機(jī)當(dāng)客戶端測試
[root@minglinux-02 ~] cd /home/
[root@minglinux-02 /home] ls
mysql
[root@minglinux-02 /home] yum install -y subversion #先安裝svn
[root@minglinux-02 /home] svn checkout svn://192.168.162.130/myproject --username=user1
認(rèn)證領(lǐng)域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“user1”的密碼:
-----------------------------------------------------------------------
注意! 你的密碼淑仆,對于認(rèn)證域:
<svn://192.168.162.130:3690> /data/svnroot/myproject
只能明文保存在磁盤上! 如果可能的話,請考慮配置你的系統(tǒng)哥力,讓 Subversion
可以保存加密后的密碼蔗怠。請參閱文檔以獲得詳細(xì)信息。
你可以通過在“/root/.subversion/servers”中設(shè)置選項“store-plaintext-passwords”為“yes”或“no”吩跋,
來避免再次出現(xiàn)此警告寞射。
-----------------------------------------------------------------------
保存未加密的密碼(yes/no)?yes
取出版本 0。
[root@minglinux-02 /home] ls
myproject mysql
[root@minglinux-02 /home] cd myproject/
[root@minglinux-02 /home/myproject] ls
[root@minglinux-02 /home/myproject] cp /etc/fstab .
[root@minglinux-02 /home/myproject] ls
fstab
[root@minglinux-02 /home/myproject] svn add ./fstab #添加到版本控制中心
A fstab
[root@minglinux-02 /home/myproject] svn commit -m "add fstab" #把文件上傳到服務(wù)器
正在增加 fstab
傳輸文件數(shù)據(jù).
提交后的版本為 1锌钮。
#查看服務(wù)端
[root@minglinux-01 /home/svntest] ls
myproject
[root@minglinux-01 /home/svntest] cd myproject/
[root@minglinux-01 /home/svntest/myproject] ls
[root@minglinux-01 /home/svntest/myproject] svn up #=svn update把當(dāng)前目錄下的文件都更新到最新版
正在升級 '.':
A fstab
更新到版本 1桥温。
[root@minglinux-01 /home/svntest/myproject] ls
fstab
#用戶名密碼保存路徑
[root@minglinux-01 /home/svntest/myproject] cd /root/.subversion/
[root@minglinux-01 ~/.subversion] ls
auth config README.txt servers
[root@minglinux-01 ~/.subversion] cd auth/
[root@minglinux-01 ~/.subversion/auth] ls
svn.simple svn.ssl.client-passphrase svn.ssl.server svn.username
[root@minglinux-01 ~/.subversion/auth] cd svn.simple/
[root@minglinux-01 ~/.subversion/auth/svn.simple] ls
392d59636ff2a63e4544b2b34dfc0bb7
[root@minglinux-01 ~/.subversion/auth/svn.simple] cat 392d59636ff2a63e4544b2b34dfc0bb7
K 8
passtype
V 6
simple
K 8
password
V 13
lucci_!(*$123
K 15
svn:realmstring
V 52
<svn://192.168.162.130:3690> /data/svnroot/myproject
K 8
username
V 5
lucci
END
#密碼都是明文存儲,若用戶名密碼不想保存在本地梁丘,可以刪除它
[root@minglinux-01 ~/.subversion/auth/svn.simple] rm -f 392d59636ff2a63e4544b2b34dfc0bb7
#在客戶端上進(jìn)行一些修改
[root@minglinux-02 /home/myproject] vim fstab
[root@minglinux-02 /home/myproject] svn add ./fstab
svn: 警告: W150002: “/home/myproject/fstab”已納入版本控制
svn: E200009: 因為一些目標(biāo)已經(jīng)版本化侵浸,所以不能增加全部目標(biāo)
svn: E200009: 此請求操作的目標(biāo)非法
[root@minglinux-02 /home/myproject] svn commit -m "ch fstab"
正在發(fā)送 fstab
傳輸文件數(shù)據(jù).
提交后的版本為 2。
#返回服務(wù)端可以看到fstab增加的最后一行
[root@minglinux-01 /home/svntest/myproject] svn up
正在升級 '.':
認(rèn)證領(lǐng)域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“root”的密碼:
認(rèn)證領(lǐng)域: <svn://192.168.162.130:3690> /data/svnroot/myproject
用戶名: lucci
“l(fā)ucci”的密碼:
-----------------------------------------------------------------------
注意! 你的密碼兰吟,對于認(rèn)證域:
<svn://192.168.162.130:3690> /data/svnroot/myproject
只能明文保存在磁盤上! 如果可能的話通惫,請考慮配置你的系統(tǒng),讓 Subversion
可以保存加密后的密碼混蔼。請參閱文檔以獲得詳細(xì)信息履腋。
你可以通過在“/root/.subversion/servers”中設(shè)置選項“store-plaintext-passwords”為“yes”或“no”,
來避免再次出現(xiàn)此警告惭嚣。
-----------------------------------------------------------------------
保存未加密的密碼(yes/no)?yes
U fstab
更新到版本 2遵湖。
[root@minglinux-01 /home/svntest/myproject] cat fstab
#
# /etc/fstab
# Created by anaconda on Wed Sep 5 01:17:51 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=22416a3c-e656-4cea-8cfe-c46e3caaff9c / xfs defaults 0 0
UUID=71ee1ccd-ae34-4561-9182-e90e1609d50e /boot xfs defaults 0 0
UUID=39354d09-4036-4ca8-8621-ad26d2cc5b69 swap swap defaults 0 0
hktgkghoasg
#服務(wù)端刪除文件
[root@minglinux-01 /home/svntest/myproject] svn delete fstab
D fstab
[root@minglinux-01 /home/svntest/myproject] svn commit -m "delete fstab" #徹底刪除
正在刪除 fstab
提交后的版本為 3。
#在客戶端查看文件也已經(jīng)被刪除
[root@minglinux-02 /home/myproject] svn up
正在升級 '.':
D fstab
更新到版本 3晚吞。
[root@minglinux-02 /home/myproject] ls
#查看變更日志
[root@minglinux-02 /home/myproject] svn log
------------------------------------------------------------------------
r3 | lucci | 2019-02-27 18:51:32 +0800 (三, 2019-02-27) | 1 行
delete fstab
------------------------------------------------------------------------
r2 | user1 | 2019-02-27 18:42:09 +0800 (三, 2019-02-27) | 1 行
ch fstab
------------------------------------------------------------------------
r1 | user1 | 2019-02-27 18:26:45 +0800 (三, 2019-02-27) | 1 行
add fstab
------------------------------------------------------------------------
三延旧、客戶端上使用svn(windows)
官網(wǎng) https://tortoisesvn.net/index.zh.html
下載TortoiseSVN 并安裝
簡明教程 http://www.reibang.com/p/6b3b7b915332
-
TortoiseSVN使用
文件夾沒有綠色狀態(tài)符號重啟一次電腦即可
磁盤新建myproject文件夾,右鍵選擇SVN Checkout
填入服務(wù)端地址槽地,然后點OK
輸入用戶名密碼迁沫,點OK
完成checkout
在windows的myproject文件夾下創(chuàng)建文本文檔并寫入一些內(nèi)容
右鍵文檔,選擇TortoiseSVN→Add
右鍵點擊SVN Commit
在新出現(xiàn)的頁面寫下此次提交的說明捌蚊,然后點OK
在另一臺Linux客戶端上查看和修改
[root@minglinux-02 /home/myproject] svn up
正在升級 '.':
A lucci.txt.txt
更新到版本 4集畅。
[root@minglinux-02 /home/myproject] cat lucci.txt.txt
abc
123
[root@minglinux-02 /home/myproject] echo update > lucci.txt.txt
[root@minglinux-02 /home/myproject] svn add lucci.txt.txt
svn: 警告: W150002: “/home/myproject/lucci.txt.txt”已納入版本控制
svn: E200009: 因為一些目標(biāo)已經(jīng)版本化,所以不能增加全部目標(biāo)
svn: E200009: 此請求操作的目標(biāo)非法
[root@minglinux-02 /home/myproject] svn commit -m "add lucci.txt.txt"
正在發(fā)送 lucci.txt.txt
傳輸文件數(shù)據(jù).
提交后的版本為 5缅糟。
windows的文件夾上右鍵點擊SVN Update挺智,可以看到文件檔內(nèi)容已被修改
四、單機(jī)上使用git
yum install -y git
mkdir /data/gitroot
cd /data/gitroot
git init //初始化倉庫
echo -e “123\naaa\n456\nbbb” > 1.txt //創(chuàng)建一個新文件
git add 1.txt//把1.txt添加到倉庫
git commit -m “add new file 1.txt” //add完了必須要commit才算真正把文件提交到git倉庫里
再次更改1.txt
git status //查看當(dāng)前倉庫中的狀態(tài)窗宦,比如是否有改動的文件
git diff 1.txt //可以對比1.txt本次修改了什么內(nèi)容赦颇,相比較倉庫里面的版本
版本回退
多更改幾次1.txt二鳄,然后add,commit
git log//查看所有提交記錄
git log --pretty=oneline//一行顯示
git reset --hard f7c8e9//回退版本,其中后面跟的字符串是簡寫
撤銷修改
rm -f 1.txt//不小心刪除了1.txt
git checkout -- 1.txt//恢復(fù)1.txt
如果1.txt文件修改媒怯,add后但沒有commit订讼,再想回退到上一次提交的狀態(tài),可以使用git reset HEAD 1.txt沪摄,再執(zhí)行g(shù)it checkout -- 1.txt
git reflog //查看所有歷史版本
刪除文件
echo -e "11111111111\n2222222222" > 2.txt
git rm 2.txt
git commit -m "rm 2.txt"
#git的安裝和初始化
[root@minglinux-01 ~] yum install -y git
[root@minglinux-01 ~] mkdir /data/gitroot
[root@minglinux-01 ~] cd !$
cd /data/gitroot
[root@minglinux-01 /data/gitroot] git init #初始化倉庫
初始化空的 Git 版本庫于 /data/gitroot/.git/
[root@minglinux-01 /data/gitroot] ls
[root@minglinux-01 /data/gitroot] ls -la
總用量 0
drwxr-xr-x 3 root root 18 3月 4 14:54 .
drwxr-xr-x 13 root root 194 3月 4 14:54 ..
drwxr-xr-x 7 root root 119 3月 4 14:54 .git
[root@minglinux-01 /data/gitroot] ls .git/
branches config description HEAD hooks info objects refs
#提交文件到倉庫
[root@minglinux-01 /data/gitroot] echo -e "123/abc/456" > 1.txt #創(chuàng)建一個文件
[root@minglinux-01 /data/gitroot] git add 1.txt #把1.txt添加到倉庫
[root@minglinux-01 /data/gitroot] git commit -m "add 1.txt" #add完了必須要commit才算真正把文件提交到git倉庫里
[master(根提交) 11590f1] add 1.txt
1 file changed, 1 insertion(+)
create mode 100644 1.txt
#查看倉庫狀態(tài)
[root@minglinux-01 /data/gitroot] git status #查看當(dāng)前倉庫中的狀態(tài)躯嫉,比如是否有改動的文件
# 位于分支 master
無文件要提交,干凈的工作區(qū)
[root@minglinux-01 /data/gitroot] echo "qwer" > 1.txt #修改1.txt杨拐,但未提交到倉庫
[root@minglinux-01 /data/gitroot] cat 1.txt
qwer
[root@minglinux-01 /data/gitroot] git status
# 位于分支 master
# 尚未暫存以備提交的變更:
# (使用 "git add <file>..." 更新要提交的內(nèi)容)
# (使用 "git checkout -- <file>..." 丟棄工作區(qū)的改動)
#
# 修改: 1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@minglinux-01 /data/gitroot] git add 1.txt
[root@minglinux-01 /data/gitroot] git commit -m "ch 1.txt"
[master c13d1bf] add 1.txt
1 file changed, 1 insertion(+), 1 deletion(-)
[root@minglinux-01 /data/gitroot] git status #經(jīng)過add祈餐,commit后查看狀態(tài)
# 位于分支 master
無文件要提交,干凈的工作區(qū)
[root@minglinux-01 /data/gitroot] echo "asdf" >> 1.txt
[root@minglinux-01 /data/gitroot] git diff 1.txt #可以對比1.txt本次修改了什么內(nèi)容哄陶,相比較倉庫里面的版本
diff --git a/1.txt b/1.txt
index a1afb10..9d96aca 100644
--- a/1.txt
+++ b/1.txt
@@ -1 +1,2 @@
qwer
+asdf
#多更改幾次1.txt帆阳,然后add,commit
[root@minglinux-01 /data/gitroot] vim 1.txt
[root@minglinux-01 /data/gitroot] git add 1.txt
[root@minglinux-01 /data/gitroot] git commit -m "add 1.txt"
[master f1d17e8] add 1.txt
1 file changed, 1 insertion(+)
[root@minglinux-01 /data/gitroot] vim 1.txt
[root@minglinux-01 /data/gitroot] git add 1.txt
[root@minglinux-01 /data/gitroot] git commit -m "add 1.txt"
[master edf16ef] add 1.txt
1 file changed, 1 deletion(-)
#查看所有提交記錄
[root@minglinux-01 /data/gitroot] git log
commit edf16efbe4ab16886bf93a5750bf1ce548a1eb78
Author: your name <your email>
Date: Mon Mar 4 15:37:18 2019 +0800
add 1.txt
commit f1d17e814d67cf8cca5441a69ce715ddc04f68a7
Author: your name <your email>
Date: Mon Mar 4 15:37:05 2019 +0800
add 1.txt
···
···
[root@minglinux-01 /data/gitroot] git log --pretty=oneline #一行顯示
edf16efbe4ab16886bf93a5750bf1ce548a1eb78 add 1.txt
f1d17e814d67cf8cca5441a69ce715ddc04f68a7 add 1.txt
c13d1bf6d67fbf2a1168b200693391cd1a325239 add 1.txt
11590f1b5682b9a12d474081b62749713ddd1ab5 add 1.txt
#git commit -m "解釋說明" ,工作中解釋說明要盡可能詳細(xì)
#版本回退
[root@minglinux-01 /data/gitroot] cat 1.txt
qwer
[root@minglinux-01 /data/gitroot] git reset --hard f1d17e814d67cf8cca5441a69ce715ddc04f68a7
HEAD 現(xiàn)在位于 f1d17e8 add 1.txt
[root@minglinux-01 /data/gitroot] cat 1.txt
qwer
asdf
[root@minglinux-01 /data/gitroot] git log --pretty=oneline #版本回滾后最新版本就沒有了
f1d17e814d67cf8cca5441a69ce715ddc04f68a7 add 1.txt
c13d1bf6d67fbf2a1168b200693391cd1a325239 add 1.txt
11590f1b5682b9a12d474081b62749713ddd1ab5 add 1.txt
[root@minglinux-01 /data/gitroot] git reflog #查看所有歷史版本
f1d17e8 HEAD@{0}: reset: moving to f1d17e814d67cf8cca5441a69ce715dd
edf16ef HEAD@{1}: commit: add 1.txt
f1d17e8 HEAD@{2}: commit: add 1.txt
c13d1bf HEAD@{3}: commit: add 1.txt
11590f1 HEAD@{4}: commit (initial): add 1.txt
...skipping...
f1d17e8 HEAD@{0}: reset: moving to f1d17e814d67cf8cca5441a69ce715dd
edf16ef HEAD@{1}: commit: add 1.txt
f1d17e8 HEAD@{2}: commit: add 1.txt
c13d1bf HEAD@{3}: commit: add 1.txt
11590f1 HEAD@{4}: commit (initial): add 1.txt
[root@minglinux-01 /data/gitroot] git reset --hard edf16ef
HEAD 現(xiàn)在位于 edf16ef add 1.txt
[root@minglinux-01 /data/gitroot] git log --pretty=oneline #又回到執(zhí)行回滾前的狀態(tài)了
edf16efbe4ab16886bf93a5750bf1ce548a1eb78 add 1.txt
f1d17e814d67cf8cca5441a69ce715ddc04f68a7 add 1.txt
c13d1bf6d67fbf2a1168b200693391cd1a325239 add 1.txt
11590f1b5682b9a12d474081b62749713ddd1ab5 add 1.txt
#撤銷修改
[root@minglinux-01 /data/gitroot] rm -f 1.txt #不小心刪除了1.txt
[root@minglinux-01 /data/gitroot] ls
[root@minglinux-01 /data/gitroot] git checkout -- 1.txt #恢復(fù)1.txt屋吨,即將倉庫中最新文件恢復(fù)回來
[root@minglinux-01 /data/gitroot] ls
1.txt
#如果1.txt文件修改蜒谤,add后但沒有commit,
#再想回退到上一次提交的狀態(tài)至扰,可以使用git reset HEAD 1.txt鳍徽,再執(zhí)行g(shù)it checkout -- 1.txt
[root@minglinux-01 /data/gitroot] echo "good" > 1.txt
[root@minglinux-01 /data/gitroot] cat 1.txt
good
[root@minglinux-01 /data/gitroot] git add 1.txt
[root@minglinux-01 /data/gitroot] git reset HEAD 1.txt
重置后撤出暫存區(qū)的變更:
M 1.txt
[root@minglinux-01 /data/gitroot] git checkout -- 1.txt
[root@minglinux-01 /data/gitroot] cat 1.txt
qwer
#刪除文件
[root@minglinux-01 /data/gitroot] git rm 1.txt
rm '1.txt'
[root@minglinux-01 /data/gitroot] git commit -m "delete 1.txt"
[master f3b2e9a] delete 1.txt
1 file changed, 1 deletion(-)
delete mode 100644 1.txt
[root@minglinux-01 /data/gitroot] ls
[root@minglinux-01 /data/gitroot] git checkout -- 1.txt
error: pathspec '1.txt' did not match any file(s) known to git.
#將文件再恢復(fù)回來
[root@minglinux-01 /data/gitroot] git log --pretty=oneline
f3b2e9a7355b28a0acbc8444c4218013073bfbe7 delete 1.txt
edf16efbe4ab16886bf93a5750bf1ce548a1eb78 add 1.txt
f1d17e814d67cf8cca5441a69ce715ddc04f68a7 add 1.txt
c13d1bf6d67fbf2a1168b200693391cd1a325239 add 1.txt
11590f1b5682b9a12d474081b62749713ddd1ab5 add 1.txt
[root@minglinux-01 /data/gitroot] git reset --hard edf16ef
HEAD 現(xiàn)在位于 edf16ef add 1.txt
[root@minglinux-01 /data/gitroot] ls
1.txt
五、建立遠(yuǎn)程倉庫
? 首先到 https://github.com 注冊一個賬號敢课,創(chuàng)建自己的git阶祭,點repositories 再點new
? 名字自定義,比如叫studygit 選擇public 點 create repository
? 添加key:右上角點自己頭像直秆,選擇settings濒募,左側(cè)選擇SSH and GPG keys
? 左側(cè)點New SSH key,把linux機(jī)器上的~/.ssh/id_rsa.pub內(nèi)容粘貼到這里
? 把本地倉庫推送到遠(yuǎn)程倉庫 git remote add origin git@github.com:luccilinux/studygit.git //這一步是在遠(yuǎn)程創(chuàng)建一個新的倉庫studygit圾结,名字盡量和本地的一致
? git push -u origin master //然后把本地的studygit倉庫推送到遠(yuǎn)程的studygit
下一次再推送瑰剃,就可以直接 git push
#create SSH key
[root@minglinux-01 ~] 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:
SHA256:HtymAYuh8dHAxPRzKMgk2+a+lx9Tj2ETkjW3VEIMSZg root@minglinux-01
The key's randomart image is:
+---[RSA 2048]----+
|. .=+ +===.. |
| * .o+E+.+.o |
|. * + O o . |
| o + = B o |
| o o . S o |
| . + X |
| . .o + . |
| .o o |
| .. .. |
+----[SHA256]-----+
[root@minglinux-01 ~] cat .ssh/id_rsa
id_rsa id_rsa.pub
[root@minglinux-01 ~] cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLqBZ25bFoIDOLbZxWH54H2VWnkTXKf7lDC9vdCBN9C7ryA4Rb+iTp9Lzk1AJxy++Zu97nndhACxdLPLs0A4j90yoXBkZ07QNZl2PGqWFZB0mMMvwG24MUsYk+3POG1n+nY4l6J7U//XVJWHfic+WD/1+Y2mLo+zWALTHA2pV/ebcuRxE5AIWAbzTas3vSDbkHgcDEQxMJRa+nltVOald+wt4O/H1Ic8nbbwPbAvJlotxm3x59D8ul8HnmOiT4FqzngIOoijjUmyouUFJzCIQf+UZKgA1GiXDZ1ap5wq1PMp8XFJpUuuF+nVs5M86TBJ54kxD4eq+bDAJ4jOUR2s57 root@minglinux-01
#連接遠(yuǎn)程倉庫
[root@minglinux-01 ~] cd /tmp/
[root@minglinux-01 /tmp] mkdir linux
[root@minglinux-01 /tmp] cd linux/
[root@minglinux-01 /tmp/linux] echo "# linux" >> README.md
[root@minglinux-01 /tmp/linux] git init
初始化空的 Git 版本庫于 /tmp/linux/.git/
[root@minglinux-01 /tmp/linux] ls -la
總用量 4
drwxr-xr-x 3 root root 80 3月 4 22:09 .
drwxrwxrwt 10 root root 260 3月 4 22:08 ..
drwxr-xr-x 7 root root 200 3月 4 22:09 .git
-rw-r--r-- 1 root root 8 3月 4 22:09 README.md
[root@minglinux-01 /tmp/linux] git add README.md
[root@minglinux-01 /tmp/linux] git commit -m "first commit"
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@minglinux-01.(none)')
[root@minglinux-01 /tmp/linux] vim .git/config
[root@minglinux-01 /tmp/linux] git commit -m "first commit"
[master(根提交) 8f2c9a4] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@minglinux-01 /tmp/linux] git remote add origin git@github.com:Lucci9/linux.git
[root@minglinux-01 /tmp/linux] git push -u origin master
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.250.177.223' (RSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 210 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Lucci9/linux.git
* [new branch] master -> master
分支 master 設(shè)置為跟蹤來自 origin 的遠(yuǎn)程分支 master。
[root@minglinux-01 /tmp/linux] ls
README.md
[root@minglinux-01 /tmp/linux] vim 2.txt
[root@minglinux-01 /tmp/linux] vim 1.txt
[root@minglinux-01 /tmp/linux] git add 1.txt
[root@minglinux-01 /tmp/linux] git commit -m "add 1.txt"
[master d543699] add 1.txt
1 file changed, 1 insertion(+)
create mode 100644 1.txt
[root@minglinux-01 /tmp/linux] git push -u origin master
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 266 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Lucci9/linux.git
8f2c9a4..d543699 master -> master
分支 master 設(shè)置為跟蹤來自 origin 的遠(yuǎn)程分支 master筝野。
六晌姚、克隆遠(yuǎn)程倉庫
cd /home
git clone git@github.com:aminglinux/lanmp.git
它提示,會在當(dāng)前目錄下初始化一個倉庫歇竟,并創(chuàng)建一個.git的目錄舀凛,如下
Initialized empty Git repository in /home/lanmp/.
git/完成后,ls可以看到一個lanmp的目錄
cd lanmp
vi lanmp.sh 編輯一下文件途蒋,然后提交
git add lanmp.sh
git commit -m "sdlfasdf"
然后再推送到遠(yuǎn)程服務(wù)端
git push
[root@minglinux-01 ~] cd /home/
[root@minglinux-01 /home] git clone git@github.com:aminglinux/lanmp.git
正克隆到 'lanmp'...
remote: Enumerating objects: 32, done.
remote: Total 32 (delta 0), reused 0 (delta 0), pack-reused 32
接收對象中: 100% (32/32), 5.99 KiB | 0 bytes/s, done.
處理 delta 中: 100% (6/6), done.
[root@minglinux-01 /home] cd lanmp/
[root@minglinux-01 /home/lanmp] ls
lanmp.sh README.md
七、分支管理
- 分支
git branch //查看分支
git branch aming //創(chuàng)建分支
git checkout aming //切換到了aming分支下
再用git branch查看馋记,會看到有兩個分支master和aming号坡,當(dāng)前使用的分支前面會有一個*在aming分支下 懊烤,編輯2.txt,并提交到新分支
echo "askdfjlksadjflk" > 2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"
切換回master分支
git checkout master //此時cat 2.txt發(fā)現(xiàn)并沒有更改內(nèi)容
#分支
[root@minglinux-01 ~] cd /data/gitroot/
[root@minglinux-01 /data/gitroot] git branch
* master
[root@minglinux-01 /data/gitroot] git branch lucci
[root@minglinux-01 /data/gitroot] git branch
lucci
* master
[root@minglinux-01 /data/gitroot] git checkout lucci
切換到分支 'lucci'
[root@minglinux-01 /data/gitroot] git branch
* lucci
master
[root@minglinux-01 /data/gitroot] ls
1.txt
[root@minglinux-01 /data/gitroot] vim 2.txt
[root@minglinux-01 /data/gitroot] git add .
[root@minglinux-01 /data/gitroot] git commit -m "add 2.txt"
[lucci 67df931] add 2.txt
1 file changed, 1 insertion(+)
create mode 100644 2.txt
[root@minglinux-01 /data/gitroot] ls
1.txt 2.txt
[root@minglinux-01 /data/gitroot] git checkout master
切換到分支 'master'
[root@minglinux-01 /data/gitroot] ls
1.txt
#說明分支間是隔離開的
- 分支的合并
git checkout master //合并分支之前宽堆,先切換到目標(biāo)分支
git merge aming //把a(bǔ)ming分支合并到了master
如果master分支和aming分支都對2.txt進(jìn)行了編輯腌紧,當(dāng)合并時會提示沖突,需要先解決沖突才可以繼續(xù)合并畜隶。
解決沖突的方法是在master分支下壁肋,編輯2.txt,改為aming分支里面2.txt的內(nèi)容籽慢。 然后提交2.txt浸遗,再合并aming分支。
但是這樣有一個問題箱亿,萬一master分支更改的內(nèi)容是我們想要的呢跛锌? 可以編輯2.txt內(nèi)容,改為想要的届惋,然后提交髓帽。切換到aming分支,然后合并master分支到aming分支即可(倒著合并)脑豹。合并分支有一個原則郑藏,那就是要把最新的分支合并到舊的分支。也就是說merge后面跟的分支名字一定是最新的分支瘩欺。
git branch -d aming //刪除分支
如果分支沒有合并必盖,刪除之前會提示,那就不合并击碗,強(qiáng)制刪除
git branch -D aming //強(qiáng)制刪除
#分支的合并
[root@minglinux-01 /data/gitroot] git branch
lucci
* master
[root@minglinux-01 /data/gitroot] git merge lucci
更新 edf16ef..67df931
Fast-forward
2.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 2.txt
[root@minglinux-01 /data/gitroot] ls
1.txt 2.txt
#合并出現(xiàn)沖突
[root@minglinux-01 /data/gitroot] echo "123" >> 2.txt
[root@minglinux-01 /data/gitroot] git add 2.txt
[root@minglinux-01 /data/gitroot] git commit -m "ch 2.txt"
[master e00c4e6] ch 2.txt
1 file changed, 1 insertion(+)
[root@minglinux-01 /data/gitroot] git checkout lucci
切換到分支 'lucci'
[root@minglinux-01 /data/gitroot] echo "345" >> 2.txt
[root@minglinux-01 /data/gitroot] git add 2.txt
[root@minglinux-01 /data/gitroot] git commit -m "ch 2.txt"
[lucci 5d2aa0e] ch 2.txt
1 file changed, 1 insertion(+)
[root@minglinux-01 /data/gitroot] git checkout master
切換到分支 'master'
[root@minglinux-01 /data/gitroot] git merge lucci
自動合并 2.txt
沖突(內(nèi)容):合并沖突于 2.txt
自動合并失敗筑悴,修正沖突然后提交修正的結(jié)果。
#解決沖突稍途,編輯2.txt使其內(nèi)容在兩個分支上保持一致
[root@minglinux-01 /data/gitroot] vim 2.txt
[root@minglinux-01 /data/gitroot] cat 2.txt
asdfghjkl
345
[root@minglinux-01 /data/gitroot] git merge lucci
error: 'merge' is not possible because you have unmerged files.
提示:請先在工作區(qū)改正文件阁吝,然后酌情使用
提示:'git add/rm <file>' 標(biāo)記解決方案,
提示:或使用 'git commit -a'械拍。
fatal: Exiting because of an unresolved conflict.
[root@minglinux-01 /data/gitroot] git add 2.txt
[root@minglinux-01 /data/gitroot] git commit -m "ch 2.txt"
[master 637c664] ch 2.txt
[root@minglinux-01 /data/gitroot] git merge lucci
Already up-to-date.
[root@minglinux-01 /data/gitroot] git checkout lucci
切換到分支 'lucci'
[root@minglinux-01 /data/gitroot] cat 2.txt
asdfghjkl
345
#刪除分支
[root@minglinux-01 /data/gitroot] git branch -d lucci
error: 無法刪除您當(dāng)前所在的分支 'lucci'突勇。
[root@minglinux-01 /data/gitroot] git checkout master
切換到分支 'master'
[root@minglinux-01 /data/gitroot] git branch -d lucci
已刪除分支 lucci(曾為 5d2aa0e)。
[root@minglinux-01 /data/gitroot] git branch
* master
使用分支的原則
對于分支的應(yīng)用坷虑,建議大家以這樣的原則來:
master分支是非常重要的甲馋,線上發(fā)布代碼用這個分支,平時我們開發(fā)代碼不要在這個分支上迄损。
創(chuàng)建一個dev分支定躏,專門用作開發(fā),只有當(dāng)發(fā)布到線上之前,才會把dev分支合并到master
開發(fā)人員應(yīng)該在dev的基礎(chǔ)上再分支成個人分支痊远,個人分支(在自己pc上)里面開發(fā)代碼垮抗,然后合并到dev分支
dev分支合并bob分支的命令是:
git checkout dev //先切換到dev分支,然后
git merge bob
八碧聪、遠(yuǎn)程分支管理
本地新建的分支如果不推送到遠(yuǎn)程冒版,對其他人就是不可見的
查看遠(yuǎn)程分支 git ls-remote origin,可以看到所有分支
對于git push分支分兩種情況
當(dāng)本地分支和遠(yuǎn)程分支一致時
git push會把所有本地分支的變更一同推送到遠(yuǎn)程逞姿,如果想只推送一個分支辞嗡,使用git push origin branch-name
當(dāng)本地分支比遠(yuǎn)程分支多,默認(rèn)git push 只推送本地和遠(yuǎn)程一致的分支滞造,想要把多出來的本地分支推送到遠(yuǎn)程時续室,使用git push origin branch-name 如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交
git clone的時候默認(rèn)只把master分支克隆下來断部,如果想把所有分支都克隆下來猎贴,需要手動創(chuàng)建,在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支蝴光,使用git checkout -b branch-name origin/branch-name她渴,本地和遠(yuǎn)程分支的名稱要一致
-
遠(yuǎn)程倉庫
#克隆該遠(yuǎn)程倉庫到本地,但默認(rèn)只克隆master分支
[root@minglinux-01 /tmp] git clone git@github.com:Lucci9/linux.git
正克隆到 'linux'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0
接收對象中: 100% (9/9), done.
[root@minglinux-01 /tmp] cd linux/
[root@minglinux-01 /tmp/linux] git branch #僅克隆了master分支
* master
#查看遠(yuǎn)程所有分支
[root@minglinux-01 /tmp/linux] git ls-remote origin
d54369985d47230d637441413582b5b95dac05de HEAD
6114e4615a2b7baa7866c3cc11ad702eefd154b8 refs/heads/dev
d54369985d47230d637441413582b5b95dac05de refs/heads/master
#克隆所有分支
[root@minglinux-01 /tmp/linux] git checkout -b dev origin/dev
分支 dev 設(shè)置為跟蹤來自 origin 的遠(yuǎn)程分支 dev蔑祟。
切換到一個新分支 'dev'
[root@minglinux-01 /tmp/linux] git branch
* dev
master
#在dev分支下創(chuàng)建文件
[root@minglinux-01 /tmp/linux] ls
1.txt 2.txt README.md
[root@minglinux-01 /tmp/linux] vim 3.txt
[root@minglinux-01 /tmp/linux] git add 3.txt
[root@minglinux-01 /tmp/linux] git commit -m "add 3.txt"
[dev 9e28318] add 3.txt
1 file changed, 3 insertions(+)
create mode 100644 3.txt
[root@minglinux-01 /tmp/linux] git push #git push會把所有本地分支的變更一同推送到遠(yuǎn)程
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 334 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Lucci9/linux.git
6114e46..9e28318 dev -> dev
[root@minglinux-01 /tmp/linux] git push origin dev #只推送dev分支
Everything up-to-date
#本地分支比遠(yuǎn)程分支多時推送
[root@minglinux-01 /tmp/linux] git branch dev2
[root@minglinux-01 /tmp/linux] git branch
* dev
dev2
master
[root@minglinux-01 /tmp/linux] git checkout dev2
切換到分支 'dev2'
[root@minglinux-01 /tmp/linux] ls
1.txt 2.txt 3.txt README.md
[root@minglinux-01 /tmp/linux] vim 4.txt
[root@minglinux-01 /tmp/linux] git push
Everything up-to-date #未能推送更新到遠(yuǎn)程
[root@minglinux-01 /tmp/linux] git push origin dev2
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev2' on GitHub by visiting:
remote: https://github.com/Lucci9/linux/pull/new/dev2
remote:
To git@github.com:Lucci9/linux.git
* [new branch] dev2 -> dev2 #推送成功
[root@minglinux-01 /tmp/linux] git push origin dev2
Everything up-to-date
九趁耗、標(biāo)簽管理
標(biāo)簽類似于快照功能,可以給版本庫打一個標(biāo)簽疆虚,記錄某個時刻庫的狀態(tài)苛败。也可以隨時恢復(fù)到該狀態(tài)。
git checkout master 先切到master分支上
git tag v1.0 給master打一個標(biāo)簽v1.0
git show v1.0 查看標(biāo)簽信息
git tag 可以查看所有的標(biāo)簽
tag是針對commit來打標(biāo)簽的径簿,所以可以針對歷史的commit來打tag
git log --pretty=oneline --abbrev-commit //先查看歷史的commit
git tag v0.9 46d3c1a //針對歷史commit打標(biāo)簽
git tag -a v0.8 -m "tag just v1.1 and so on" 5aacaf4 //可以對標(biāo)簽進(jìn)行描述
git tag -d v0.8 //刪除標(biāo)簽
git push origin v1.0 //推送指定標(biāo)簽到遠(yuǎn)程
git push --tag origin //推送所有標(biāo)簽
如果本地刪除了一個標(biāo)簽罢屈,遠(yuǎn)程也想要刪除需要這樣操作:
git tag v1.0 -d //刪除本地標(biāo)簽
git push origin :refs/tags/v1.0 //刪除遠(yuǎn)程標(biāo)簽
[root@minglinux-01 /tmp/linux] git checkout master
切換到分支 'master'
[root@minglinux-01 /tmp/linux] git tag v1.0
[root@minglinux-01 /tmp/linux] git tag
v1.0
[root@minglinux-01 /tmp/linux] git show v1.0
commit d54369985d47230d637441413582b5b95dac05de
Author: lucci <admin@123.com>
Date: Mon Mar 4 22:33:12 2019 +0800
add 1.txt
diff --git a/1.txt b/1.txt
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/1.txt
@@ -0,0 +1 @@
+hello
#針對歷史的commit來打tag
[root@minglinux-01 /tmp/linux] git log --pretty=oneline
d54369985d47230d637441413582b5b95dac05de add 1.txt
8f2c9a481ac6fc0819e16ebcd5821bb4cbc6b91e first commit
[root@minglinux-01 /tmp/linux] git tag v0.8 d5436998
[root@minglinux-01 /tmp/linux] git tag
v0.8
v1.0
#查看歷史的commit
[root@minglinux-01 /tmp/linux] git log --pretty=oneline --abbrev-commit
d543699 add 1.txt
8f2c9a4 first commit
#對標(biāo)簽進(jìn)行描述
[root@minglinux-01 /tmp/linux] git tag -a v1.8 -m "first tag" 8f2c9a4 #
[root@minglinux-01 /tmp/linux] git tag
v0.8
v1.0
v1.8
#推送指定標(biāo)簽到遠(yuǎn)程
[root@minglinux-01 /tmp/linux] git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:Lucci9/linux.git
* [new tag] v1.0 -> v1.0
十、git別名
git commit 這個命令是不是有點長篇亭? 用別名可以提高我們的工作效率
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
查看git別名使用命令
git config --list |grep alias
查詢log小技巧:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
取消別名
git config --global --unset alias.br
[root@minglinux-01 /tmp/linux] git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
[root@minglinux-01 /tmp/linux] git lg
* d543699 - (HEAD, tag: v1.0, tag: v0.8, origin/master, origin/HEAD
* 8f2c9a4 - (tag: v1.8) first commit (24 小時之前) <lucci>
[root@minglinux-01 /tmp/linux] git config --global --unset alias.lg #取消別名
[root@minglinux-01 /tmp/linux] git lg
git:'lg' 不是一個 git 命令缠捌。參見 'git --help'。
您指的是這個么译蒂?
log
十一曼月、搭建git服務(wù)器
github畢竟是公開的,而私有倉庫又得花錢買柔昼。所以我們可以想辦法搭建一個私有的哑芹,只自己公司使用的。Gitlab是個不錯的選擇捕透。在介紹它之前聪姿,先講述一下命令行的git服務(wù)器
找一臺服務(wù)器碴萧,首先要安裝git,yum install git
添加git用戶咳燕,并且設(shè)置shell為/usr/bin/git-shell勿决,目的是為了不讓git用戶遠(yuǎn)程登陸
useradd -s /usr/bin/git-shell git
cd /home/git
創(chuàng)建authorized_keys文件,并更改屬主招盲、屬組和權(quán)限,用來存客戶端機(jī)器上的公鑰
mkdir .ssh
touch .ssh/authorized_keys
chown -R git.git .ssh
chmod 600 .ssh/authorized_keys
定好存儲git倉庫的目錄嘉冒,比如 /data/gitroot
mkdir /data/gitroot
cd /data/gitroot
git init --bare sample.git // 會創(chuàng)建一個裸倉庫曹货,裸倉庫沒有工作區(qū),因為服務(wù)器上的Git倉庫純粹是為了共享讳推,所以不讓用戶直接登錄到服務(wù)器上去改工作區(qū)顶籽,并且服務(wù)器上的Git倉庫通常都以.git結(jié)尾
chown -R git.git sample.git
以上操作是在git服務(wù)器上做的,平時git服務(wù)器是不需要開發(fā)人員登錄修改代碼的银觅,它僅僅是充當(dāng)著一個服務(wù)器的角色礼饱,就像github一樣,平時操作都是在我們自己的pc上做的
首先要把客戶端上的公鑰放到git服務(wù)器上/home/git/.ssh/authorized_keys文件里
在客戶端上(自己pc)克隆遠(yuǎn)程倉庫
git clone git@ip:/data/gitroot/sample.git
此時就可以在當(dāng)前目錄下生成一個sample的目錄究驴,這個就是我們克隆的遠(yuǎn)程倉庫了镊绪。進(jìn)入到這里面,可以開發(fā)一些代碼洒忧,然后push到遠(yuǎn)程蝴韭。
#在minglinux-02上搭建git服務(wù)器
[root@minglinux-02 ~] yum install -y git
[root@minglinux-02 ~] useradd -s /usr/bin/git-shell git #為了不讓git用戶遠(yuǎn)程登陸
[root@minglinux-02 ~] cd /home/git/
[root@minglinux-02 /home/git] ls
[root@minglinux-02 /home/git] mkdir .ssh
[root@minglinux-02 /home/git] touch .ssh/authorized_keys
[root@minglinux-02 /home/git] chmod 600 .ssh/authorized_keys
[root@minglinux-02 /home/git] chown -R git:git .ssh
#
[root@minglinux-01 ~] cat .ssh/id_rsa.pub #將客戶端的公鑰粘貼到服務(wù)端的authorized_keys文件中
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLqBZ25bFoIDOLbZxWH54H2VWnkTXKf7lDC9vdCBN9C7ryA4Rb+iTp9Lzk1AJxy++Zu97nndhACxdLPLs0A4j90yoXBkZ07QNZl2PGqWFZB0mMMvwG24MUsYk+3POG1n+nY4l6J7U//XVJWHfic+WD/1+Y2mLo+zWALTHA2pV/ebcuRxE5AIWAbzTas3vSDbkHgcDEQxMJRa+nltVOald+wt4O/H1Ic8nbbwPbAvJlotxm3x59D8ul8HnmOiT4FqzngIOoijjUmyouUFJzCIQf+UZKgA1GiXDZ1ap5wq1PMp8XFJpUuuF+nVs5M86TBJ54kxD4eq+bDAJ4jOUR2s57 root@minglinux-01
[root@minglinux-02 /home/git] cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLqBZ25bFoIDOLbZxWH54H2VWnkTXKf7lDC9vdCBN9C7ryA4Rb+iTp9Lzk1AJxy++Zu97nndhACxdLPLs0A4j90yoXBkZ07QNZl2PGqWFZB0mMMvwG24MUsYk+3POG1n+nY4l6J7U//XVJWHfic+WD/1+Y2mLo+zWALTHA2pV/ebcuRxE5AIWAbzTas3vSDbkHgcDEQxMJRa+nltVOald+wt4O/H1Ic8nbbwPbAvJlotxm3x59D8ul8HnmOiT4FqzngIOoijjUmyouUFJzCIQf+UZKgA1GiXDZ1ap5wq1PMp8XFJpUuuF+nVs5M86TBJ54kxD4eq+bDAJ4jOUR2s57 root@minglinux-01
#客戶端連接服務(wù)端
[root@minglinux-01 ~] ssh git@192.168.162.132
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 192.168.162.132 closed.
#出現(xiàn)以上提示代表成功
#服務(wù)端創(chuàng)建存儲git倉庫的目錄
[root@minglinux-02 ~] mkdir /data/gitroot
[root@minglinux-02 ~] cd !$
cd /data/gitroot
[root@minglinux-02 /data/gitroot] git init --bare sample.git #創(chuàng)建裸倉庫sample.git
初始化空的 Git 版本庫于 /data/gitroot/sample.git/
[root@minglinux-02 /data/gitroot] ls
sample.git
[root@minglinux-02 /data/gitroot] chown -R git.git sample.git
#客戶端克隆服務(wù)端遠(yuǎn)程倉庫
[root@minglinux-01 ~] git clone git@192.168.162.132:/data/gitroot/sample.git
正克隆到 'sample'...
warning: 您似乎克隆了一個空版本庫。
[root@minglinux-01 ~] ls
123.txt cron.log my.cnf sample
123.tzr data.txt qq.txt sim.pid
1.txt dir2 RNG.sh temp
2.txt log root.txt test.sh
3.txt logs rpmbuild zabbix-release-3.2-1.el7.noarch.rpm
b.txt log.txt rsync
[root@minglinux-01 ~] cd sample/
[root@minglinux-01 ~/sample] ls -la
總用量 8
drwxr-xr-x 3 root root 18 3月 5 23:21 .
dr-xr-x---. 16 root root 4096 3月 5 23:21 ..
drwxr-xr-x 7 root root 119 3月 5 23:21 .git
#本地倉庫文件推送到遠(yuǎn)程倉庫
[root@minglinux-01 ~/sample] echo "good" > a.txt
[root@minglinux-01 ~/sample] git add .
[root@minglinux-01 ~/sample] git commit -m "add a.txt"
[master(根提交) e9ec954] add a.txt
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@minglinux-01 ~/sample] git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 204 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.162.132:/data/gitroot/sample.git
* [new branch] master -> master
#模擬多客戶端協(xié)同操作
#切換到/tmp/目錄克隆遠(yuǎn)程倉庫熙侍,然后修改文件并提交
[root@minglinux-01 ~/sample] cd /tmp/
[root@minglinux-01 /tmp] git clone git@192.168.162.132:/data/gitroot/sample.git
正克隆到 'sample'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收對象中: 100% (3/3), done.
[root@minglinux-01 /tmp] cd sample/
[root@minglinux-01 /tmp/sample] ls
a.txt
[root@minglinux-01 /tmp/sample] echo "123" >> a.txt
[root@minglinux-01 /tmp/sample] git add a.txt
[root@minglinux-01 /tmp/sample] git commit -m "ch a.txt"
[master 0f64152] ch a.txt
1 file changed, 1 insertion(+)
[root@minglinux-01 /tmp/sample] git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 237 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.162.132:/data/gitroot/sample.git
e9ec954..0f64152 master -> master
#回到/root/sample用git pull抓取遠(yuǎn)程的新提交實現(xiàn)協(xié)同操作
[root@minglinux-01 /tmp/sample] cd /root/sample/
[root@minglinux-01 ~/sample] ls
a.txt
[root@minglinux-01 ~/sample] git pull
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
來自 192.168.162.132:/data/gitroot/sample
e9ec954..0f64152 master -> origin/master
更新 e9ec954..0f64152
Fast-forward
a.txt | 1 +
1 file changed, 1 insertion(+)
[root@minglinux-01 ~/sample] cat a.txt
good
123
十二榄鉴、安裝gitlab
gitlab官網(wǎng) https://about.gitlab.com/gitlab-com/
官方安裝文檔 https://about.gitlab.com/installation/?version=ce#centos-7 (ce/ee)
要求服務(wù)器內(nèi)存不少于2g
gitlab出問題不太好處理,服務(wù)器最好僅用來搭建gitlab蛉抓,不安裝其他應(yīng)用
vim /etc/yum.repos.d/gitlab.repo//加入如下內(nèi)容
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
yum install -y gitlab-ce
gitlab-ctl reconfigure
[root@minglinux-01 ~] vim /etc/yum.repos.d/gitlab.repo
#j加入以下內(nèi)容
1 [gitlab-ce]
2 name=Gitlab CE Repository
3 baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
4 gpgcheck=0
5 enabled=1
#安裝gitlab-ce
[root@minglinux-01 ~] yum install -y gitlab-ce
#[root@minglinux-01 ~] gitlab-ctl reconfigure #自動配置gitlab
···
···
Chef Client finished, 472/1265 resources updated in 03 minutes 45 seconds
gitlab Reconfigured!
#因為gitlab系統(tǒng)里也有nginx庆尘,所以建議先將系統(tǒng)原來的停掉
[root@minglinux-01 ~] systemctl stop nginx
[root@minglinux-01 ~] chkconfig nginx off
十三、使用gitlab
netstat -lnpt //查看監(jiān)聽端口
gitlab-ctl stop/restart/start/status
瀏覽器訪問gitlab巷送,輸入ip即可
默認(rèn)管理員root驶忌,無密碼,它會讓我們?nèi)ザx一個密碼
gitlab常用命令 https://www.cnyunwei.cc/archives/1204
如果搭建gitlab的服務(wù)器在內(nèi)網(wǎng)無公網(wǎng)ip惩系,可以在帶公網(wǎng)ip的服務(wù)器做nginx代理來實現(xiàn)公網(wǎng)訪問gitlab
可以修改本地host文件位岔,將gitlab.example.com設(shè)置為服務(wù)器Ip
瀏覽器訪問gitlab.example.com即可
[root@minglinux-01 ~] netstat -lnpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 8252/nginx: master
tcp 0 0 0.0.0.0:43935 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:35135 0.0.0.0:* LISTEN 4029/rpc.statd
tcp 0 0 127.0.0.1:9121 0.0.0.0:* LISTEN 7753/redis_exporter
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN 7765/prometheus
tcp 0 0 127.0.0.1:9187 0.0.0.0:* LISTEN 7891/postgres_expor
tcp 0 0 127.0.0.1:9093 0.0.0.0:* LISTEN 7799/alertmanager
tcp 0 0 192.168.162.130:27017 0.0.0.0:* LISTEN 4286/mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 4286/mongod
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 7720/node_exporter
tcp 0 0 127.0.0.1:9229 0.0.0.0:* LISTEN 7705/gitlab-workhor
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8252/nginx: master
tcp 0 0 127.0.0.1:9168 0.0.0.0:* LISTEN 7742/puma 3.12.0 (t
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 7113/unicorn master
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 4070/rpc.mountd
tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 7150/sidekiq 5.2.5
tcp 0 0 127.0.0.1:9236 0.0.0.0:* LISTEN 7688/gitaly
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4019/sshd
tcp6 0 0 :::39037 :::* LISTEN -
tcp6 0 0 :::2049 :::* LISTEN -
tcp6 0 0 :::9094 :::* LISTEN 7799/alertmanager
tcp6 0 0 :::59782 :::* LISTEN 4029/rpc.statd
tcp6 0 0 :::3306 :::* LISTEN 4762/mysqld
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 ::1:9168 :::* LISTEN 7742/puma 3.12.0 (t
tcp6 0 0 :::20048 :::* LISTEN 4070/rpc.mountd
tcp6 0 0 :::22 :::* LISTEN 4019/sshd
#停止gitlab相關(guān)服務(wù)
[root@minglinux-01 ~] gitlab-ctl stop
ok: down: alertmanager: 0s, normally up
ok: down: gitaly: 1s, normally up
ok: down: gitlab-monitor: 0s, normally up
ok: down: gitlab-workhorse: 1s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: postgresql: 1s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 1s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up
#開啟服務(wù)
[root@minglinux-01 ~] gitlab-ctl start
ok: run: alertmanager: (pid 8704) 0s
ok: run: gitaly: (pid 8714) 1s
ok: run: gitlab-monitor: (pid 8726) 0s
ok: run: gitlab-workhorse: (pid 8729) 0s
ok: run: logrotate: (pid 8747) 0s
ok: run: nginx: (pid 8757) 0s
ok: run: node-exporter: (pid 8765) 1s
ok: run: postgres-exporter: (pid 8770) 0s
ok: run: postgresql: (pid 8776) 1s
ok: run: prometheus: (pid 8779) 0s
ok: run: redis: (pid 8797) 1s
ok: run: redis-exporter: (pid 8877) 0s
ok: run: sidekiq: (pid 8883) 0s
ok: run: unicorn: (pid 8890) 1s
-
瀏覽器訪問gitlab
-
改密碼后用root用戶名登錄
創(chuàng)建項目
創(chuàng)建一個組 可以定義權(quán)限
在組里添加用戶 在組里創(chuàng)建項目
點頭像settings添加SSH key
在Admin Area創(chuàng)建新用戶,創(chuàng)建完了編輯用戶設(shè)定其密碼
-
添加SSH key
-
創(chuàng)建用戶
-
編輯lisi用戶設(shè)定初始密碼
-
lisi用戶登錄 密碼1234567890
-
lisi用戶創(chuàng)建項目
-
lisi用戶的項目詳情頁面
無公網(wǎng)ip實現(xiàn)公網(wǎng)使用域名訪問gitlab
#nginx相關(guān)配置文件
[root@minglinux-01 ~] ls /var/opt/gitlab/nginx/conf/
gitlab-http.conf nginx.conf nginx-status.conf
#nginx.conf是nginx主配置文件
#gitlab-http.conf是nginx跟gitlab相關(guān)的配置文件堡牡,想綁定域名或者修改監(jiān)聽端口就修改此文件
[root@minglinux-01 ~] vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
···
34 server {
35 listen *:80;
36
37
38 server_name gitlab.example.com;
···
十四抒抬、gitlab備份與恢復(fù)
gitlab備份 gitlab-rake gitlab:backup:create
備份目錄在/var/opt/gitlab/backups
gitlab恢復(fù) 先停兩個服務(wù) gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq
gitlab-rake gitlab:backup:restore BACKUP=xxxxx (這里是一個編號,即備份文件的前綴)
再啟動服務(wù) gitlab-ctl start
#gitlab備份晤柄,在線備份
[root@minglinux-01 ~] gitlab-rake gitlab:backup:create
2019-03-19 00:32:16 +0800 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2019-03-19 00:32:17 +0800 -- done
2019-03-19 00:32:17 +0800 -- Dumping repositories ...
* minglinux/test1 ... [SKIPPED]
[SKIPPED] Wiki
* lisi/studyz ... [SKIPPED]
[SKIPPED] Wiki
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping uploads ...
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping builds ...
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping artifacts ...
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping pages ...
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping lfs objects ...
2019-03-19 00:32:18 +0800 -- done
2019-03-19 00:32:18 +0800 -- Dumping container registry images ...
2019-03-19 00:32:18 +0800 -- [DISABLED]
Creating backup archive: 1552926738_2019_03_19_11.8.2_gitlab_backup.tar ... done
Uploading backup archive to remote storage ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... skipping
#備份文件所在目錄
[root@minglinux-01 ~] ls /var/opt/gitlab/backups
1552926738_2019_03_19_11.8.2_gitlab_backup.tar #時間戳+日期+版本
[root@minglinux-01 ~] ll /var/opt/gitlab/backups
總用量 92
-rw------- 1 git git 92160 3月 19 00:32 1552926738_2019_03_19_11.8.2_gitlab_backup.tar
[root@minglinux-01 ~] du -sh /var/opt/gitlab/backups
92K /var/opt/gitlab/backups
#關(guān)于版本注意一點擦剑,如果要把9版本的gitlab備份文件恢復(fù)到10版本的gitlab是會出問題的
#那就先找9版本的gitlab進(jìn)行恢復(fù),然后升級gitlab版本再備份,再恢復(fù)這樣子
#恢復(fù)
[root@minglinux-01 ~] gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq
[root@minglinux-01 ~] gitlab-rake gitlab:backup:restore BACKUP=1552926738_2019_03_19_11.8.2
···
···
Deleting tmp directories ... done
done
done
done
done
done
done
done
[root@minglinux-01 ~] gitlab-ctl start