企业级------持续集成与持续交付------(一)-----git工具使用

企业级------持续集成与持续交付------(一)-----git工具使用

1.git简介

Git特点:

  1. 速度
  2. 简单的设计
  3. 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
  4. 完全分布式
  5. 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。

  1. 已修改表示修改了文件,但还没保存到数据库中。
  2. 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  3. 已提交表示数据已经安全地保存在本地数据库中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
企业级------持续集成与持续交付------(一)-----git工具使用_第1张图片
版本控制系统:它是一种追踪记录并且可以对工程文件进行历史修改的技术。

  1. 本地版本控制系统
    企业级------持续集成与持续交付------(一)-----git工具使用_第2张图片
    这种方式使用的是传统的复制,更新的方式,他是在本地进行维护的,这样的话会出现很多的目录和文件,不便于维护。

  2. 集中化的版本控制系统
    企业级------持续集成与持续交付------(一)-----git工具使用_第3张图片
    集中化和本地不一样,它有一个server端,当server端挂掉以后,客户端就无法进行开发了,这是集中化的缺点。

  3. 分布式版本控制系统
    企业级------持续集成与持续交付------(一)-----git工具使用_第4张图片
    分布式是对集中化做了一个去中心化,当我们的server端挂点以后,我们的客户端还可以正常进行开发,当server端恢复之后,这时候就会去同步server端,但是这种方式最终提交合并到server端的。
    Git必看秘籍:https://git-scm.com/book/zh/v2

2.git安装

  1. 由于git 工具是Linux系统自带的,所以我们直接yum install去安装它。
  2. 接下来对git进行初始化
    首先我们需要创建一个目录,然后在目录中运行git,执行git命令,进行初始化,就完成了git 仓库的初始化。
这里我们用 server1 来进行操作:

[root@server1 ~]# yum install git -y
[root@server1 ~]# mkdir demo
[root@server1 ~]# cd demo/
[root@server1 demo]# git init        #初始化版本库
Initialized empty Git repository in /root/demo/.git/
[root@server1 demo]# ls -a
.  ..  .git

注意:git的全部信息都隐藏在.git这个目录中
我们所要运行的指令都必须在这个目录下完成。所以切记不要跳出此目录。

获取 Git 仓库通常有两种方式:

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库。
  2. 从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone

3.git使用

[root@server1 demo]# touch README
[root@server1 demo]# git status     #检查当前文件状态
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)  #提示信息
#
#	README
nothing added to commit but untracked files present (use "git add" to track)


[root@server1 demo]# git status -s    #简化查询
?? README

注意:这里的两个问号,代表一种状态,表示刚创建到这个目录中的文件,git还没有进行跟踪

[root@server1 demo]# git add README     #添加
[root@server1 demo]# git status -s      #再次查看状态
A  README                  # A代表到达了暂存区,但还没有到达版本库


						######提交######
[root@server1 demo]# git commit -m "add README"

*** Please tell me who you are.          #让我们输入自己的信息,防止出错时找到责任人

Run

  git config --global user.email "[email protected]"
  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@server1.(none)')
[root@server1 demo]# git config --global user.email "[email protected]"   #设定信息
[root@server1 demo]# git config --global user.name "xrt"                #设定信息
[root@server1 demo]# git commit -m "add README"         #再次提交
[master (root-commit) ba04423] add README
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
[root@server1 demo]# git status -s    
[root@server1 demo]# 
#这时候我们查看状态时不显示状态,是因为我们已经放到了git仓库,当我们再一次改动时才能看见状态#

[root@server1 demo]# echo hello world > README    #添加内容
[root@server1 demo]# git status -s
 M README       #M表示已经发生修改,注意M左右两边的位置,这里的这个M在右边

当我们接下来不知道干什么的时候,可以 git status 一下
[root@server1 demo]# git status       #查看提示
# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)  #让我们使用add 把它放到暂存区
#   (use "git checkout -- ..." to discard changes in working directory)#撤销更改
#
#	modified:   README
#
no changes added to commit (use "git add" and/or "git commit -a")


[root@server1 demo]# git checkout -- README     #撤销
[root@server1 demo]# cat README         #发现文字不见了
[root@server1 demo]# git status -s
[root@server1 demo]# git status 
# On branch master
nothing to commit, working directory clean       #没有任何东西了


[root@server1 demo]# echo nihaoya > README     #再次输入内容
[root@server1 demo]# cat README 
nihaoya
[root@server1 demo]# git status -s          #查看状态
 M README                  # M在右边的状态
[root@server1 demo]# git add README 
[root@server1 demo]# git status -s
M  README
变成了左边的M,表示修改已经到暂存区了,因为这个文件已经在版本库了,这次只是修改,所以不是A

[root@server1 demo]# echo redhat > file
[root@server1 demo]# git status -s
M  README
?? file
[root@server1 demo]# git add .       # . 代表把当前目录所有的文件放到暂存目录
[root@server1 demo]# git status -s
M  README
A  file
[root@server1 demo]# git commit -m "v1"     # 提交
[master 8334027] v1
 2 files changed, 2 insertions(+)
 create mode 100644 file
[root@server1 demo]# git status -s
[root@server1 demo]# 

注意:还会出现MM的状态,请往下看

[root@server1 demo]# echo haha > file 
[root@server1 demo]# git status -s
 M file
[root@server1 demo]# git add .
[root@server1 demo]# git status -s
M  file
[root@server1 demo]# echo hahaha > file    
[root@server1 demo]# git status -s
MM file      # 之前的修改已经到暂存区了,我们有修改了一次

这时侯我们需要add才可以全部提交,否则我们只是到了暂存区
[root@server1 demo]# git add file    
[root@server1 demo]# git status -s
M  file
[root@server1 demo]# git commit -m "v2"
[master 0001d97] v2
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@server1 demo]# git status -s
[root@server1 demo]# 

以上就是一个小的demo来说明git工具的工作状态!!!!!!!

在工作环境中,会产生一些不需要提交到仓库的文件,这些文件是没有意义的,但是git依然会识别这些文件,我们创建 .gitignore 文件来忽略一定格式的文件

[root@server1 demo]# touch .a
[root@server1 demo]# touch .b
[root@server1 demo]# mkdir env
[root@server1 demo]# cd env/
[root@server1 env]# touch values
[root@server1 env]# cd ..
[root@server1 demo]# git status -s      
?? .a                       # 可以识别这些文件
?? .b 
?? env/
[root@server1 demo]# vim .gitignore
[root@server1 demo]# cat .gitignore 
.*                            # 忽略隐藏文件和env 目录下的文件
env/
[root@server1 demo]# git status -s
[root@server1 demo]#                     #现在就看不到了


[root@server1 demo]# echo westos > file
[root@server1 demo]# git diff         # 对比已经暂存和未暂存文件内容
diff --git a/file b/file
index 445a69c..00f9aaf 100644
--- a/file
+++ b/file
@@ -1 +1 @@
-hahaha
+westos             #差别
[root@server1 demo]# git status -s
 M file                      #当前我们还没有用add添加文件到暂存区
[root@server1 demo]# git commit -a -m "v3"      #-a表示add
[master be5e8b3] v3
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@server1 demo]# git status -s   # 这样添加到暂存区这一步,直接 -a一步到位
[root@server1 demo]# 

删除文件

[root@server1 demo]# rm -fr file
[root@server1 demo]# git status -s
 D file                          # 表示文件在工作区被删除
[root@server1 demo]# git rm file     # 删除文件
rm 'file'
[root@server1 demo]# git status -s    # 到暂存区
D  file
[root@server1 demo]# git commit -m "v4"         #提交,也可以直接git rm ,不用 rm
[master 81c60e7] v4 
 1 file changed, 1 deletion(-)
 delete mode 100644 file
[root@server1 demo]# git status -s
[root@server1 demo]# ls
env  README             # file 文件就删除了

重命名

[root@server1 demo]# git mv README redhat
[root@server1 demo]# git status -s
R  README -> redhat
[root@server1 demo]# git commit -m "v5"
[master 06ec34f] v5
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename README => redhat (100%)
[root@server1 demo]# git status -s
[root@server1 demo]# 

查看提交历史

[root@server1 demo]# git log   #按时间先后顺序列出所有的提交,最近的更新排在最上面
commit 06ec34f0bb08b02bf28dd2bc569a5b7440bc7667
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:26:49 2020 +0800

    v5

commit 81c60e7c00d4ed30adab1af549355aef1f371b32
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:24:03 2020 +0800

    v4

commit be5e8b36e71677be8425cd60db1b795e2180ee73
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:19:34 2020 +0800

    v3

commit 0001d977eb3ebc366d5b07a1d0094b6ef9ec4531
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 01:51:22 2020 +0800

    v2
[root@server1 demo]# git log -p -2    # -p 或 --patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出)-2 选项来只显示最近的两次提交
commit 06ec34f0bb08b02bf28dd2bc569a5b7440bc7667
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:26:49 2020 +0800

    v5

diff --git a/README b/README
deleted file mode 100644
index 1fe778d..0000000
--- a/README
+++ /dev/null
@@ -1 +0,0 @@
-nihaoya
diff --git a/redhat b/redhat
new file mode 100644
index 0000000..1fe778d
--- /dev/null
+++ b/redhat
@@ -0,0 +1 @@
+nihaoya

commit 81c60e7c00d4ed30adab1af549355aef1f371b32
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:24:03 2020 +0800

    v4

diff --git a/file b/file
deleted file mode 100644
[root@server1 demo]# git log --stat     #每次提交的简略统计信息
commit 06ec34f0bb08b02bf28dd2bc569a5b7440bc7667
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:26:49 2020 +0800

    v5

 README | 1 -
 redhat | 1 +
2 files changed, 1 insertion(+), 1 deletion(-)

commit 81c60e7c00d4ed30adab1af549355aef1f371b32
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:24:03 2020 +0800

    v4

 file | 1 -
 1 file changed, 1 deletion(-)

commit be5e8b36e71677be8425cd60db1b795e2180ee73
Author: xrt <xrt@example.com>
Date:   Wed Jun 17 04:19:34 2020 +0800

[root@server1 demo]# git log --pretty=oneline     #每个提交放在一行显示,在浏览大量的提交时非常有用
06ec34f0bb08b02bf28dd2bc569a5b7440bc7667 v5
81c60e7c00d4ed30adab1af549355aef1f371b32 v4
be5e8b36e71677be8425cd60db1b795e2180ee73 v3
0001d977eb3ebc366d5b07a1d0094b6ef9ec4531 v2
833402766e72dab286b7712301838c72c20d8657 v1
ba04423cdfe9189cb2f53851e0a6407e23056334 add README
[root@server1 demo]# git reflog    #更简洁的一种方式,用于版本回退
06ec34f HEAD@{0}: commit: v5
81c60e7 HEAD@{1}: commit: v4
be5e8b3 HEAD@{2}: commit: v3
0001d97 HEAD@{3}: commit: v2
8334027 HEAD@{4}: commit: v1
ba04423 HEAD@{5}: commit (initial): add README

取消暂存的文件

企业级------持续集成与持续交付------(一)-----git工具使用_第5张图片

[root@server1 demo]# touch 123
[root@server1 demo]# git add 123
[root@server1 demo]# git status -s
A  123
[root@server1 demo]# git reset HEAD 123
[root@server1 demo]# git status -s
?? 123

撤消对文件的修改

[root@server1 demo]# echo woaini >> redhat 
[root@server1 demo]# git status -s
 M redhat
[root@server1 demo]# git checkout -- redhat 
[root@server1 demo]# git status -s
[root@server1 demo]# 

版本回退

[root@server1 demo]# git reflog    #当前我们有五个版本
06ec34f HEAD@{0}: commit: v5
81c60e7 HEAD@{1}: commit: v4
be5e8b3 HEAD@{2}: commit: v3
0001d97 HEAD@{3}: commit: v2
8334027 HEAD@{4}: commit: v1
ba04423 HEAD@{5}: commit (initial): add README
[root@server1 demo]# git reset --hard 81c60e7    # 回退到v4版本
HEAD is now at 81c60e7 v4
[root@server1 demo]# ls    
env  README           # 名字又改回来了
[root@server1 demo]# git reset --hard be5e8b3
HEAD is now at be5e8b3 v3
[root@server1 demo]# ls     # 删除的文件也回来了
env  file  README

同步仓库到github

登陆github 点击创建仓库—起个名字

企业级------持续集成与持续交付------(一)-----git工具使用_第6张图片
企业级------持续集成与持续交付------(一)-----git工具使用_第7张图片
这里有ssh和https两种方式,我们选用ssh的方式进行通信连接,我们需要去做免密。

[root@server1 ~]# ssh-keygen 
...
[root@server1 ~]# cd .ssh/
[root@server1 .ssh]# ls
id_rsa  id_rsa.pub
[root@server1 .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLPZxOQE+Dvb80Q6JCeA7eC85P1iZ7kSV3Rg4OnA05ltLZ+ShgDfByYhYReITPDEbmPMuRItsMXSAsNInVhdLski4+a/9CgNvtdvotfrriHL0UGmrZCvjsQh8PqPDedN6XQw26iJzxiudFWwvU/kK88MFaOMGV0LTScLkmOPvhJagSvXV425RVzVEsYfHeUFEjmo8QHL2+9OJuEr7zPzVI5kZB8hd7VjAYKis/0L4rrhTDauyQnA8Qvk2BAotA4TYxTN2tjwkT+TFRWT1FZgpoHpp96nSzCQ4zPpcZjj6CFg+t4HZLTmbyUAajchO1zEhLMZ1KGMECjdh87Yx7OFe5 root@server1

我们把这个公钥复制,然后进入github
点击settings

企业级------持续集成与持续交付------(一)-----git工具使用_第8张图片
企业级------持续集成与持续交付------(一)-----git工具使用_第9张图片
复制进去,点击add ssh key ,这时我们的server1主机就和github 免密了

企业级------持续集成与持续交付------(一)-----git工具使用_第10张图片
接下来我们添加远程的 url 链接地址:

[root@server1 demo]# git remote -v     # 查看远程地址
[root@server1 demo]# git remote add origin git@github.com:xrt021129junjun/demo.git
[root@server1 demo]# git remote -v
origin	git@github.com:xrt021129junjun/demo.git (fetch)
origin	git@github.com:xrt021129junjun/demo.git (push)
            #########然后推送到远程仓库###########
[root@server1 demo]# git push -u origin master    # 一次推送需要加 -u参数
The authenticity of host 'github.com (52.74.223.119)' 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,52.74.223.119' (RSA) to the list of known hosts.
Counting objects: 13, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (13/13), 905 bytes | 0 bytes/s, done.
Total 13 (delta 0), reused 0 (delta 0)
To git@github.com:xrt021129junjun/demo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

企业级------持续集成与持续交付------(一)-----git工具使用_第11张图片
这时候,我们的数据就上传上去了,就算我们把本地的仓库删除了也能从github上复制过来了,完全不影响。

[root@server1 ~]# ls
anaconda-ks.cfg  demo
[root@server1 ~]# rm -fr demo/      #删除
[root@server1 ~]# ls
anaconda-ks.cfg
[root@server1 ~]# git clone git@github.com:xrt021129junjun/demo.git   #从远程克隆
Cloning into 'demo'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 13 (delta 0), reused 13 (delta 0), pack-reused 0
Receiving objects: 100% (13/13), done.
[root@server1 ~]# ls
anaconda-ks.cfg  demo
[root@server1 ~]# cd demo/
[root@server1 demo]# ls
file  README           #又回来了

如果大家在访问github的时候很慢的话,我们还可以去国内的码云上进行使用,它就相当与国内版的github,速度是比较快的。可以在里面导入github的仓库进去。

4.gitlab代码仓库

官网:https://about.gitlab.com/install/

软件下载(官方下载慢,推荐使用国内镜像站点)
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

在企业中,一般都有自己的私有仓库,不让外面的人访问。

我们现在去安装它:官方推荐要4G的内存

[root@server1 ~]# yum install -y curl policycoreutils-python openssh-server   #依赖性
[root@server1 ~]# yum install gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm -y
[root@server1 ~]# vim /etc/gitlab/gitlab.rb 
val.html
external_url 'http://192.168.43.71'    #访问gitlab的地址


## Roles for multi-instance GitLab

[root@server1 ~]# gitlab-ctl reconfigure	#重载服务,每次更改配置文件执行一次,
它会自动帮我们部署一些服务,nginx,mysql等
[root@server1 ~]# gitlab-ctl status		# 查看状态
run: alertmanager: (pid 29389) 44s; run: log: (pid 28982) 195s
run: gitaly: (pid 29375) 47s; run: log: (pid 28497) 312s
run: gitlab-exporter: (pid 29343) 49s; run: log: (pid 28923) 211s
run: gitlab-workhorse: (pid 29282) 50s; run: log: (pid 28835) 237s
run: grafana: (pid 29405) 43s; run: log: (pid 29232) 72s
run: logrotate: (pid 28860) 226s; run: log: (pid 28869) 225s
run: nginx: (pid 28846) 232s; run: log: (pid 28854) 231s
run: node-exporter: (pid 29303) 49s; run: log: (pid 28903) 217s
run: postgres-exporter: (pid 29399) 44s; run: log: (pid 29004) 189s
run: postgresql: (pid 28615) 302s; run: log: (pid 28666) 299s
run: prometheus: (pid 29351) 48s; run: log: (pid 28963) 201s
run: redis: (pid 28460) 319s; run: log: (pid 28475) 318s
run: redis-exporter: (pid 29345) 48s; run: log: (pid 28945) 205s
run: sidekiq: (pid 28809) 244s; run: log: (pid 28818) 243s
run: unicorn: (pid 28778) 251s; run: log: (pid 28799) 247s

常用命令:

gitlab-ctl start    		# 启动所有 gitlab 组件

gitlab-ctl stop        		# 停止所有 gitlab 组件

gitlab-ctl restart       	 	# 重启所有 gitlab 组件

gitlab-ctl status        		# 查看服务状态

gitlab-ctl reconfigure     	# 重载服务

gitlab-ctl tail        		# 查看日志

然后我们去浏览器访问,它的用户是:root 第一次登录需要强制修改密码:

企业级------持续集成与持续交付------(一)-----git工具使用_第12张图片
登录
企业级------持续集成与持续交付------(一)-----git工具使用_第13张图片
点击创建仓库:勾上点击initialize初始化

企业级------持续集成与持续交付------(一)-----git工具使用_第14张图片
然后它让我们添加ssh的key。我们把pub公钥添加进去
企业级------持续集成与持续交付------(一)-----git工具使用_第15张图片
我们还可以在里面设置中文:

我们也可以从这里克隆仓库到主机上:
企业级------持续集成与持续交付------(一)-----git工具使用_第16张图片

[root@server1 ~]# ls
anaconda-ks.cfg  demo  gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm
[root@server1 ~]# rm -fr demo/      # 删除
[root@server1 ~]# ls
anaconda-ks.cfg  gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm
[root@server1 ~]# git clone git@192.168.43.71:root/demo.git     # 克隆
Cloning into 'demo'...
The authenticity of host '192.168.43.71 (192.168.43.71)' can't be established.
ECDSA key fingerprint is SHA256:d55msNshwu+Yob5XPKbW/6e6tESSgrcRr3lXF3KMn0o.
ECDSA key fingerprint is MD5:47:42:46:4f:a6:e0:8d:89:d8:db:4d:04:1a:e7:66:7b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.43.71' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[root@server1 ~]# ls
anaconda-ks.cfg  demo  gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm
[root@server1 ~]# cd demo/
[root@server1 demo]# git remote -v
origin	git@192.168.43.71:root/demo.git (fetch)
origin	git@192.168.43.71:root/demo.git (push)      # 这时把我们的服务器信息指向了我们的私有仓库。

[root@server1 demo]# vim index.html      # 新建一个文件
[root@server1 demo]# cat index.html 
hello world
[root@server1 demo]# git add index.html 
[root@server1 demo]# git commit  -m "add index.html"
[master 83a0a85] add index.html
 1 file changed, 1 insertion(+)
 create mode 100644 index.html
[root@server1 demo]# git push -u origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.43.71:root/demo.git
   be256a1..83a0a85  master -> master
Branch master set up to track remote branch master from origin.

企业级------持续集成与持续交付------(一)-----git工具使用_第17张图片
企业级------持续集成与持续交付------(一)-----git工具使用_第18张图片
可以看到就传到私有仓库上去了,我们就可以用来作为企业私有的代码库了。

你可能感兴趣的:(企业实战)