目录
一、代码管理平台介绍
二、客户端上使用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
填入服务端地址,然后点OK
输入用户名密码,点OK
完成checkout
在windows的myproject文件夹下创建文本文档并写入一些内容
右键文档,选择TortoiseSVN→Add
右键点击SVN Commit
在新出现的页面写下此次提交的说明,然后点OK
在另一台Linux客户端上查看和修改
[root@minglinux-02 /home/myproject] svn up
正在升级 '.':
A lucci.txt.txt
更新到版本 4。
[root@minglinux-02 /home/myproject] cat lucci.txt.txt
abc
123
[root@minglinux-02 /home/myproject] echo update > lucci.txt.txt
[root@minglinux-02 /home/myproject] svn add lucci.txt.txt
svn: 警告: W150002: “/home/myproject/lucci.txt.txt”已纳入版本控制
svn: E200009: 因为一些目标已经版本化,所以不能增加全部目标
svn: E200009: 此请求操作的目标非法
[root@minglinux-02 /home/myproject] svn commit -m "add lucci.txt.txt"
正在发送 lucci.txt.txt
传输文件数据.
提交后的版本为 5。
windows的文件夹上右键点击SVN Update,可以看到文件档内容已被修改
四、单机上使用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。
六、克隆远程仓库
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分支
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
-
改密码后用root用户名登录
创建项目
创建一个组 可以定义权限
在组里添加用户 在组里创建项目
点头像settings添加SSH key
在Admin Area创建新用户,创建完了编辑用户设定其密码
-
添加SSH key
-
创建用户
-
编辑lisi用户设定初始密码
-
lisi用户登录 密码1234567890
-
lisi用户创建项目
-
lisi用户的项目详情页面
无公网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