代碼管理平臺

目錄

一痹届、代碼管理平臺介紹
二、客戶端上使用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


    image.png

填入服務(wù)端地址槽地,然后點OK


image.png

輸入用戶名密碼迁沫,點OK


image.png

完成checkout


image.png

在windows的myproject文件夾下創(chuàng)建文本文檔并寫入一些內(nèi)容


image.png

右鍵文檔,選擇TortoiseSVN→Add


image.png

右鍵點擊SVN Commit


在新出現(xiàn)的頁面寫下此次提交的說明捌蚊,然后點OK


image.png
image.png

在另一臺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)容已被修改



image.png

image.png

四、單機(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筝野。

image.png

六晌姚、克隆遠(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分支


    image.png

    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


    image.png
  • 改密碼后用root用戶名登錄


    image.png
  • 創(chuàng)建項目

創(chuàng)建一個組 可以定義權(quán)限
在組里添加用戶 在組里創(chuàng)建項目
點頭像settings添加SSH key
在Admin Area創(chuàng)建新用戶,創(chuàng)建完了編輯用戶設(shè)定其密碼

  • 添加SSH key


    image.png
  • 創(chuàng)建用戶


    image.png
image.png
  • 編輯lisi用戶設(shè)定初始密碼


    image.png
  • lisi用戶登錄 密碼1234567890


    image.png
  • lisi用戶創(chuàng)建項目


    image.png
  • lisi用戶的項目詳情頁面


    image.png
  • 無公網(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惠勒,一起剝皮案震驚了整個濱河市赚抡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纠屋,老刑警劉巖涂臣,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異售担,居然都是意外死亡赁遗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門族铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩四,“玉大人,你說我怎么就攤上這事哥攘∑驶停” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵逝淹,是天一觀的道長耕姊。 經(jīng)常有香客問我,道長创橄,這世上最難降的妖魔是什么箩做? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮妥畏,結(jié)果婚禮上邦邦,老公的妹妹穿的比我還像新娘。我一直安慰自己醉蚁,他們只是感情好燃辖,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著网棍,像睡著了一般黔龟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滥玷,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天氏身,我揣著相機(jī)與錄音,去河邊找鬼惑畴。 笑死蛋欣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的如贷。 我是一名探鬼主播陷虎,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼到踏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尚猿?” 一聲冷哼從身側(cè)響起窝稿,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿掂,沒想到半個月后伴榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缠劝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年潮梯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惨恭。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耙旦,靈堂內(nèi)的尸體忽然破棺而出脱羡,到底是詐尸還是另有隱情,我是刑警寧澤免都,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布锉罐,位于F島的核電站,受9級特大地震影響绕娘,放射性物質(zhì)發(fā)生泄漏脓规。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一险领、第九天 我趴在偏房一處隱蔽的房頂上張望侨舆。 院中可真熱鬧,春花似錦绢陌、人聲如沸挨下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭笆。三九已至,卻和暖如春秤掌,著一層夾襖步出監(jiān)牢的瞬間愁铺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工闻鉴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留茵乱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓椒拗,卻偏偏與公主長得像似将,于是被迫代替她去往敵國和親获黔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容