代码管理平台

目录

一、代码管理平台介绍
二、客户端上使用svn(linux)
三、客户端上使用svn(windows)
四、单机上使用git
五、建立远程仓库
六、克隆远程仓库
七、分支管理
八、远程分支管理
九、标签管理
十、git别名
十一、搭建git服务器
十二、安装gitlab
十三、使用gitlab
十四、gitlab备份与恢复

一、代码管理平台介绍

  • 需要了解的常识

 版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况
 版本管理工具发展简史,cvs → svn → git 参考http://luckypoem14.github.io/test/2012/04/24/scm-history/
 svn全称subversion,是一个开源版本控制系统,始于2000年
 git是linux创始人linus发起的,2005年发布,最初目的是更好管理linux内核代码
 git和svn不同在于git不需要依赖服务端就可以工作,即git是分布式的
 关于git和svn的比较大家参考http://blog.lishiming.net/?p=305
 github是基于git的在线web页面代码托管平台,可以选择付费服务
 gitlab可以认为是一个开源的github,两者没有直接关系

  • 安装svn
[root@minglinux-01 ~] yum install -y subversion
  • 创建版本库
[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为权限配置文件,passwd为密码文件,svnserve.conf是仓库的配置文件


[root@minglinux-01 /data/svnroot/myproject/conf] vim authz
#配置文件改为如下
···
[groups]
admins = lucci,user1   #admins组下有两个用户
[/]                    #指定目录形式,根目录就是/data/svnroot/myproject/
@admins = rw           #admins组读写权限
*= r                   #除admins组外只读权限
[myproject:/]     #指定项目形式,用于/data/svnroot目录下有多个项目时指定myproject的权限
user1 = rw

[root@minglinux-01 /data/svnroot/myproject/conf] vim passwd
···
#加入以下内容
[users]
lucci = lucci_!(*$123
user1 = user1_^^^123
user2 = user2-***123

[root@minglinux-01 /data/svnroot/myproject/conf] vim svnserve.conf
#更改或增加如下内容
···
anon-access = none   #匿名用户无权限
auth-access = write   #被授权用户可写
password-db = passwd   #密码文件
authz-db = authz     #权限配置文件
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  
###注意检查关闭防火墙

二、客户端上使用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” //把文件上传到服务器
svn delete filename //在本地删除
svn commit -m “delete filename” //在服务器上删除
svn update //把当前目录下的文件都更新到最新版
svn log //查看变更日志

#这里在服务端测试,无需再安装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
认证领域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“lucci”的密码:        #输入配置文件中自定义的密码

-----------------------------------------------------------------------
注意!  你的密码,对于认证域:

   <svn://192.168.162.130:3690> /data/svnroot/myproject

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(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

  • 测试
#使用另一台虚拟机当客户端测试
[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
认证领域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“user1”的密码: 

-----------------------------------------------------------------------
注意!  你的密码,对于认证域:

   <svn://192.168.162.130:3690> /data/svnroot/myproject

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(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"  #把文件上传到服务器
正在增加       fstab
传输文件数据.
提交后的版本为 1。

#查看服务端
[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把当前目录下的文件都更新到最新版
正在升级 '.':
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   

#在客户端上进行一些修改
[root@minglinux-02 /home/myproject] vim fstab 
[root@minglinux-02 /home/myproject] svn add ./fstab 
svn:  警告: W150002: “/home/myproject/fstab”已纳入版本控制
svn: E200009: 因为一些目标已经版本化,所以不能增加全部目标
svn: E200009: 此请求操作的目标非法
[root@minglinux-02 /home/myproject] svn commit -m "ch fstab"
正在发送       fstab
传输文件数据.
提交后的版本为 2。

#返回服务端可以看到fstab增加的最后一行
[root@minglinux-01 /home/svntest/myproject] svn up
正在升级 '.':
认证领域: <svn://192.168.162.130:3690> /data/svnroot/myproject
“root”的密码: 
认证领域: <svn://192.168.162.130:3690> /data/svnroot/myproject
用户名: lucci
“lucci”的密码: 

-----------------------------------------------------------------------
注意!  你的密码,对于认证域:

   <svn://192.168.162.130:3690> /data/svnroot/myproject

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(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


#服务端删除文件
[root@minglinux-01 /home/svntest/myproject] svn delete fstab 
D         fstab
[root@minglinux-01 /home/svntest/myproject] svn commit -m "delete fstab"  #彻底删除
正在删除       fstab

提交后的版本为 3。

#在客户端查看文件也已经被删除
[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)

官网 https://tortoisesvn.net/index.zh.html
下载TortoiseSVN 并安装
简明教程 http://www.jianshu.com/p/6b3b7b915332

  • TortoiseSVN使用
    文件夹没有绿色状态符号重启一次电脑即可
    磁盘新建myproject文件夹,右键选择SVN Checkout


    image.png

填入服务端地址,然后点OK


image.png

输入用户名密码,点OK


image.png

完成checkout


image.png

在windows的myproject文件夹下创建文本文档并写入一些内容


image.png

右键文档,选择TortoiseSVN→Add


image.png

右键点击SVN Commit


在新出现的页面写下此次提交的说明,然后点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: 因为一些目标已经版本化,所以不能增加全部目标
svn: E200009: 此请求操作的目标非法
[root@minglinux-02 /home/myproject] svn commit -m "add lucci.txt.txt"
正在发送       lucci.txt.txt
传输文件数据.
提交后的版本为 5。

windows的文件夹上右键点击SVN Update,可以看到文件档内容已被修改



image.png

image.png

四、单机上使用git

yum install -y git
mkdir /data/gitroot
cd /data/gitroot
git init //初始化仓库
echo -e “123\naaa\n456\nbbb” > 1.txt //创建一个新文件
git add 1.txt//把1.txt添加到仓库
git commit -m “add new file 1.txt” //add完了必须要commit才算真正把文件提交到git仓库里
再次更改1.txt
git status //查看当前仓库中的状态,比如是否有改动的文件
git diff 1.txt //可以对比1.txt本次修改了什么内容,相比较仓库里面的版本
版本回退
多更改几次1.txt,然后add,commit
git log//查看所有提交记录
git log --pretty=oneline//一行显示
git reset --hard f7c8e9//回退版本,其中后面跟的字符串是简写
撤销修改
rm -f 1.txt//不小心删除了1.txt
git checkout -- 1.txt//恢复1.txt
如果1.txt文件修改,add后但没有commit,再想回退到上一次提交的状态,可以使用git reset HEAD 1.txt,再执行git 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  #创建一个文件
[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
#查看仓库状态
[root@minglinux-01 /data/gitroot] git status   #查看当前仓库中的状态,比如是否有改动的文件
# 位于分支 master
无文件要提交,干净的工作区
[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>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#   修改:      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   #经过add,commit后查看状态
# 位于分支 master
无文件要提交,干净的工作区
[root@minglinux-01 /data/gitroot] echo "asdf" >> 1.txt 
[root@minglinux-01 /data/gitroot] git diff 1.txt  #可以对比1.txt本次修改了什么内容,相比较仓库里面的版本
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 "解释说明"  ,工作中解释说明要尽可能详细
#版本回退
[root@minglinux-01 /data/gitroot] cat 1.txt 
qwer
[root@minglinux-01 /data/gitroot] git reset --hard f1d17e814d67cf8cca5441a69ce715ddc04f68a7
HEAD 现在位于 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 现在位于 edf16ef 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
#撤销修改
[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  #恢复1.txt,即将仓库中最新文件恢复回来
[root@minglinux-01 /data/gitroot] ls
1.txt
#如果1.txt文件修改,add后但没有commit,
#再想回退到上一次提交的状态,可以使用git reset HEAD 1.txt,再执行git 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
重置后撤出暂存区的变更:
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.
#将文件再恢复回来
[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 现在位于 edf16ef add 1.txt
[root@minglinux-01 /data/gitroot] ls
1.txt

五、建立远程仓库

 首先到 https://github.com 注册一个账号,创建自己的git,点repositories 再点new
 名字自定义,比如叫studygit 选择public 点 create repository
 添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys
 左侧点New SSH key,把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里
 把本地仓库推送到远程仓库 git remote add origin git@github.com:luccilinux/studygit.git //这一步是在远程创建一个新的仓库studygit,名字尽量和本地的一致
 git push -u origin master //然后把本地的studygit仓库推送到远程的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
#连接远程仓库
[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 设置为跟踪来自 origin 的远程分支 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 设置为跟踪来自 origin 的远程分支 master。

image.png

六、克隆远程仓库

cd /home
git clone git@github.com:aminglinux/lanmp.git
它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录,如下
Initialized empty Git repository in /home/lanmp/.
git/完成后,ls可以看到一个lanmp的目录
cd lanmp
vi lanmp.sh 编辑一下文件,然后提交
git add lanmp.sh
git commit -m "sdlfasdf"
然后再推送到远程服务端
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 //创建分支
    git checkout aming //切换到了aming分支下
    再用git branch查看,会看到有两个分支master和aming,当前使用的分支前面会有一个*在aming分支下 ,编辑2.txt,并提交到新分支
    echo "askdfjlksadjflk" > 2.txt
    git add 2.txt
    git commit -m "laksjdflksjdklfj"
    切换回master分支
    git checkout master //此时cat 2.txt发现并没有更改内容
#分支
[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 //合并分支之前,先切换到目标分支
    git merge aming //把aming分支合并到了master
    如果master分支和aming分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
    解决冲突的方法是在master分支下,编辑2.txt,改为aming分支里面2.txt的内容。 然后提交2.txt,再合并aming分支。
    但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到aming分支,然后合并master分支到aming分支即可(倒着合并)。合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
    git branch -d aming //删除分支
    如果分支没有合并,删除之前会提示,那就不合并,强制删除
    git branch -D aming //强制删除
#分支的合并
[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
#合并出现冲突
[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
冲突(内容):合并冲突于 2.txt
自动合并失败,修正冲突然后提交修正的结果。

#解决冲突,编辑2.txt使其内容在两个分支上保持一致
[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.
提示:请先在工作区改正文件,然后酌情使用
提示:'git add/rm <file>' 标记解决方案,
提示:或使用 '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: 无法删除您当前所在的分支 '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
  • 使用分支的原则
    对于分支的应用,建议大家以这样的原则来:
    master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
    创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
    开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支


    image.png

    dev分支合并bob分支的命令是:
    git checkout dev //先切换到dev分支,然后
    git merge bob

八、远程分支管理

本地新建的分支如果不推送到远程,对其他人就是不可见的
查看远程分支 git ls-remote origin,可以看到所有分支
对于git push分支分两种情况
当本地分支和远程分支一致时
git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用git push origin branch-name
当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin branch-name 如果推送失败,先用git pull抓取远程的新提交
git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致

  • 远程仓库


    新建分支
#克隆该远程仓库到本地,但默认只克隆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

#查看远程所有分支
[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 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
[root@minglinux-01 /tmp/linux] git branch 
* dev
  master

#在dev分支下创建文件
[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会把所有本地分支的变更一同推送到远程
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

#本地分支比远程分支多时推送
[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  #未能推送更新到远程
[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 

九、标签管理

标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。
git checkout master 先切到master分支上
git tag v1.0 给master打一个标签v1.0
git show v1.0 查看标签信息
git tag 可以查看所有的标签
tag是针对commit来打标签的,所以可以针对历史的commit来打tag
git log --pretty=oneline --abbrev-commit //先查看历史的commit
git tag v0.9 46d3c1a //针对历史commit打标签
git tag -a v0.8 -m "tag just v1.1 and so on" 5aacaf4 //可以对标签进行描述
git tag -d v0.8 //删除标签
git push origin v1.0 //推送指定标签到远程
git push --tag origin //推送所有标签
如果本地删除了一个标签,远程也想要删除需要这样操作:
git tag v1.0 -d //删除本地标签
git push origin :refs/tags/v1.0 //删除远程标签

[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
#对标签进行描述
[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

#推送指定标签到远程
[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服务器

github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器
找一台服务器,首先要安装git,yum install git
添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆
useradd -s /usr/bin/git-shell git
cd /home/git
创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥
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 // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾
chown -R git.git sample.git
以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的
首先要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里
在客户端上(自己pc)克隆远程仓库
git clone git@ip:/data/gitroot/sample.git
此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。

#在minglinux-02上搭建git服务器
[root@minglinux-02 ~] yum install -y git
[root@minglinux-02 ~] useradd -s /usr/bin/git-shell git  #为了不让git用户远程登陆
[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  #将客户端的公钥粘贴到服务端的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

#客户端连接服务端
[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.
#出现以上提示代表成功
#服务端创建存储git仓库的目录
[root@minglinux-02 ~] mkdir /data/gitroot
[root@minglinux-02 ~] cd !$
cd /data/gitroot
[root@minglinux-02 /data/gitroot] git init --bare sample.git  #创建裸仓库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
#客户端克隆服务端远程仓库
[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
#本地仓库文件推送到远程仓库
[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
#模拟多客户端协同操作
#切换到/tmp/目录克隆远程仓库,然后修改文件并提交
[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抓取远程的新提交实现协同操作
[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官网 https://about.gitlab.com/gitlab-com/
官方安装文档 https://about.gitlab.com/installation/?version=ce#centos-7 (ce/ee)
要求服务器内存不少于2g
gitlab出问题不太好处理,服务器最好仅用来搭建gitlab,不安装其他应用
vim /etc/yum.repos.d/gitlab.repo//加入如下内容
[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加入以下内容
  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系统里也有nginx,所以建议先将系统原来的停掉
[root@minglinux-01 ~] systemctl stop nginx
[root@minglinux-01 ~] chkconfig nginx off

十三、使用gitlab

netstat -lnpt //查看监听端口
gitlab-ctl stop/restart/start/status
浏览器访问gitlab,输入ip即可
默认管理员root,无密码,它会让我们去定义一个密码
gitlab常用命令 https://www.cnyunwei.cc/archives/1204
如果搭建gitlab的服务器在内网无公网ip,可以在带公网ip的服务器做nginx代理来实现公网访问gitlab
可以修改本地host文件,将gitlab.example.com设置为服务器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相关服务
[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

#开启服务
[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
  • 创建项目

创建一个组 可以定义权限
在组里添加用户 在组里创建项目
点头像settings添加SSH key
在Admin Area创建新用户,创建完了编辑用户设定其密码

  • 添加SSH key


    image.png
  • 创建用户


    image.png
image.png
  • 编辑lisi用户设定初始密码


    image.png
  • lisi用户登录 密码1234567890


    image.png
  • lisi用户创建项目


    image.png
  • lisi用户的项目详情页面


    image.png
  • 无公网ip实现公网使用域名访问gitlab

#nginx相关配置文件
[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相关的配置文件,想绑定域名或者修改监听端口就修改此文件
[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备份与恢复

gitlab备份 gitlab-rake gitlab:backup:create
备份目录在/var/opt/gitlab/backups
gitlab恢复 先停两个服务 gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq
gitlab-rake gitlab:backup:restore BACKUP=xxxxx (这里是一个编号,即备份文件的前缀)
再启动服务 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

#关于版本注意一点,如果要把9版本的gitlab备份文件恢复到10版本的gitlab是会出问题的
#那就先找9版本的gitlab进行恢复,然后升级gitlab版本再备份,再恢复这样子

#恢复
[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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容