企業級------持續集成與持續交付------(一)-----git工具使用
1.git簡介
Git特點:
- 速度
- 簡單的設計
- 對非線性開發模式的強力支持(允許成千上萬個並行開發的分支)
- 完全分佈式
- 有能力高效管理類似 Linux 內核一樣的超大規模項目(速度和數據量)
自誕生於 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留着初期設定的目標。 它的速度飛快,極其適合管理大項目,有着令人難以置信的非線性分支管理系統。
Git 有三種狀態:已提交(committed)、已修改(modified) 和 已暫存(staged)。
- 已修改表示修改了文件,但還沒保存到數據庫中。
- 已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
- 已提交表示數據已經安全地保存在本地數據庫中。
這會讓我們的 Git 項目擁有三個階段:工作區、暫存區以及 Git 目錄。
版本控制系統:它是一種追蹤記錄並且可以對工程文件進行歷史修改的技術。
-
本地版本控制系統
這種方式使用的是傳統的複製,更新的方式,他是在本地進行維護的,這樣的話會出現很多的目錄和文件,不便於維護。 -
集中化的版本控制系統
集中化和本地不一樣,它有一個server端,當server端掛掉以後,客戶端就無法進行開發了,這是集中化的缺點。 -
分佈式版本控制系統
分佈式是對集中化做了一個去中心化,當我們的server端掛點以後,我們的客戶端還可以正常進行開發,當server端恢復之後,這時候就會去同步server端,但是這種方式最終提交合併到server端的。
Git必看祕籍:https://git-scm.com/book/zh/v2
2.git安裝
- 由於git 工具是Linux系統自帶的,所以我們直接yum install去安裝它。
- 接下來對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 倉庫通常有兩種方式:
- 將尚未進行版本控制的本地目錄轉換爲 Git 倉庫。
- 從其它服務器克隆 一個已存在的 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.
可以看到就傳到私有倉庫上去了,我們就可以用來作爲企業私有的代碼庫了。