企業級------持續集成與持續交付------(一)-----git工具使用

企業級------持續集成與持續交付------(一)-----git工具使用

1.git簡介

Git特點:

  1. 速度
  2. 簡單的設計
  3. 對非線性開發模式的強力支持(允許成千上萬個並行開發的分支)
  4. 完全分佈式
  5. 有能力高效管理類似 Linux 內核一樣的超大規模項目(速度和數據量)

自誕生於 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留着初期設定的目標。 它的速度飛快,極其適合管理大項目,有着令人難以置信的非線性分支管理系統。

Git 有三種狀態:已提交(committed)、已修改(modified) 和 已暫存(staged)。

  1. 已修改表示修改了文件,但還沒保存到數據庫中。
  2. 已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
  3. 已提交表示數據已經安全地保存在本地數據庫中。

這會讓我們的 Git 項目擁有三個階段:工作區、暫存區以及 Git 目錄。
在這裏插入圖片描述
版本控制系統:它是一種追蹤記錄並且可以對工程文件進行歷史修改的技術。

  1. 本地版本控制系統
    在這裏插入圖片描述
    這種方式使用的是傳統的複製,更新的方式,他是在本地進行維護的,這樣的話會出現很多的目錄和文件,不便於維護。

  2. 集中化的版本控制系統
    在這裏插入圖片描述
    集中化和本地不一樣,它有一個server端,當server端掛掉以後,客戶端就無法進行開發了,這是集中化的缺點。

  3. 分佈式版本控制系統
    在這裏插入圖片描述
    分佈式是對集中化做了一個去中心化,當我們的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 <file>..." 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 <file>..." to update what will be committed)  #讓我們使用add 把它放到暫存區
#   (use "git checkout -- <file>..." 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

取消暫存的文件

在這裏插入圖片描述

[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 點擊創建倉庫—起個名字

在這裏插入圖片描述
在這裏插入圖片描述
這裏有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

在這裏插入圖片描述
在這裏插入圖片描述
複製進去,點擊add ssh key ,這時我們的server1主機就和github 免密了

在這裏插入圖片描述
接下來我們添加遠程的 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.

在這裏插入圖片描述
這時候,我們的數據就上傳上去了,就算我們把本地的倉庫刪除了也能從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 第一次登錄需要強制修改密碼:

在這裏插入圖片描述
登錄
在這裏插入圖片描述
點擊創建倉庫:勾上點擊initialize初始化

在這裏插入圖片描述
然後它讓我們添加ssh的key。我們把pub公鑰添加進去
在這裏插入圖片描述
我們還可以在裏面設置中文:

我們也可以從這裏克隆倉庫到主機上:
在這裏插入圖片描述

[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.

在這裏插入圖片描述
在這裏插入圖片描述
可以看到就傳到私有倉庫上去了,我們就可以用來作爲企業私有的代碼庫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章