Git 作為分散式版本控制系統,在現代軟體開發中扮演著至關重要的角色。理解其核心概念,如版本回溯、分支策略和遠端協作,能有效提升團隊開發效率。本文將深入這些導向,並探討 GitLab 的本地佈署及相關設定,包含自簽憑證的處理和使用者帳戶管理,提供讀者一個全面的 Git 使用。尤其在企業內部佈署 GitLab 時,安全性和便捷性是首要考量,因此本文也著重於 SSH 金鑰設定和程式碼推播流程的最佳實務。
Git 版本控制與協作流程詳解
Git 的基本操作與版本回溯
Git 是一種強大的版本控制工具,能夠幫助開發者追蹤和管理程式碼變更。在前面的章節中,我們已經瞭解瞭如何建立一個 Git 倉函式庫並進行初步的提交。在本章節中,我們將探討 Git 的更多功能,包括如何回溯版本、使用分支以及與遠端倉函式庫進行互動。
版本回溯:git reset
假設我們已經進行了多次提交,並且希望回溯到之前的某個版本。Git 提供了 git reset 命令來實作這一功能。根據需求的不同,我們可以使用 --soft 或 --hard 選項。
軟重置(Soft Reset):使用
git reset --soft HEAD~1可以復原最近的一次提交,但保留檔案的變更。這意味著我們可以重新編輯檔案並再次提交。硬重置(Hard Reset):使用
git reset --hard HEAD~1則會徹底復原最近的一次提交,並將檔案還原到前一次提交的狀態。這是一個不可逆的操作,因此需要謹慎使用。
# 軟重置
$ git reset --soft HEAD~1
# 硬重置
$ git reset --hard HEAD~1
內容解密:
git reset --soft HEAD~1:此命令用於復原最近的一次提交,並將變更保留在暫存區中,方便重新提交。git reset --hard HEAD~1:此命令用於徹底復原最近的一次提交,並將工作目錄和暫存區還原到前一次提交的狀態。請注意,這是一個不可逆的操作。
使用分支進行平行開發
分支是 Git 中一個非常重要的概念,它允許我們在不影響主分支(通常是 master 或 main 分支)的情況下進行平行開發。
建立和切換分支
我們可以使用 git checkout -b <branch-name> 命令建立一個新的分支並切換到該分支。
# 建立並切換到新分支
$ git checkout -b newbranch
內容解密:
git checkout -b newbranch:此命令建立一個名為newbranch的新分支,並將當前工作目錄切換到該分支。在新分支上的變更不會影響主分支。
在分支上進行變更和提交
在新分支上,我們可以對檔案進行修改、新增或刪除操作,然後使用 git add 和 git commit 命令將變更提交到該分支。
# 修改檔案後新增並提交變更
$ git add .
$ git commit -m "My changes."
內容解密:
git add .:此命令將當前目錄下的所有變更新增到暫存區。git commit -m "My changes.":此命令將暫存區中的變更提交到當前分支,並附帶提交資訊 “My changes."。
與遠端倉函式庫互動
為了與團隊成員分享我們的程式碼,我們需要將本地倉函式庫與遠端倉函式庫(如 GitHub)進行連線。
新增遠端倉函式庫
首先,我們需要使用 git remote add 命令新增遠端倉函式庫的 URL。
# 新增遠端倉函式庫
$ git remote add origin git@github.com:your-user-name/my-test-repo.git
內容解密:
git remote add origin git@github.com:your-user-name/my-test-repo.git:此命令將遠端倉函式庫的 URL 新增到本地倉函式庫,並命名為origin。
推播變更到遠端倉函式庫
新增遠端倉函式庫後,我們可以使用 git push 命令將本地的變更推播到遠端倉函式庫。
# 推播變更到遠端倉函式庫的 master 分支
$ git push origin master
# 推播變更到遠端倉函式庫的 newbranch 分支
$ git push origin newbranch
內容解密:
git push origin master:此命令將本地master分支的變更推播到遠端倉函式庫的master分支。git push origin newbranch:此命令將本地newbranch分支的變更推播到遠端倉函式庫的newbranch分支。
使用 Git 管理版本控制
在軟體開發過程中,版本控制是不可或缺的一部分。Git 是目前最流行的版本控制系統,它允許開發者追蹤程式碼的變更、合作開發以及管理不同的程式碼分支。在本章中,我們將介紹如何使用 Git 來管理版本控制,並佈署 GitLab 作為本地版本控制系統。
Git 的基本操作
首先,我們來介紹 Git 的基本操作。假設你已經在本地建立了一個名為 my-test-repo 的 Git 倉函式庫,並在其中建立了一個名為 example.txt 的檔案。
建立新分支
當你需要對程式碼進行修改時,通常會建立一個新的分支。這樣可以讓你在不影響主分支(通常是 master 或 main 分支)的情況下進行開發。
$ git branch newbranch
$ git checkout newbranch
Switched to branch 'newbranch'
在新分支上進行修改
在 newbranch 分支上,你可以對 example.txt 檔案進行修改。例如,新增兩行文字:
$ echo "New line 1" >> example.txt
$ echo "New line 2" >> example.txt
提交變更
修改完成後,將變更提交到本地倉函式庫:
$ git add example.txt
$ git commit -m "Update example.txt"
[newbranch cf772ca] Update example.txt
1 file changed, 2 insertions(+)
#### 內容解密:
git add example.txt:將example.txt檔案的變更新增到暫存區。git commit -m "Update example.txt":將暫存區的變更提交到本地倉函式庫,並附上提交訊息 “Update example.txt”。
切換分支與合併
當你在 newbranch 分支上完成開發後,可以切換回 master 分支,並將 newbranch 分支的變更合併到 master 分支。
$ git checkout master
Switched to branch 'master'
$ git merge newbranch
Updating 72ed737..cf772ca
Fast-forward
example.txt | 2 ++
1 file changed, 2 insertions(+)
#### 內容解密:
git checkout master:切換到master分支。git merge newbranch:將newbranch分支的變更合併到master分支。
佈署 GitLab
許多公司出於安全考慮,不願意使用公有的版本控制服務,因此需要在本地佈署版本控制系統。GitLab 是個不錯的選擇,它提供了豐富的功能和特性。
安裝 GitLab
首先,建立一個新的虛擬機器或 LXC 容器,並安裝 Ubuntu 20.04 或更新版本的作業系統。然後,按照以下步驟安裝 GitLab:
- 更新系統並安裝必要的套件:
apt update && apt upgrade
apt install -y curl openssh-server ca-certificates tzdata perl
2. 新增 GitLab 的套件倉函式庫:
```bash
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | bash
- 安裝 GitLab:
EXTERNAL_URL=“https://gitlab.devops.lab” apt install gitlab-ee
#### #### 內容解密:
- `apt update && apt upgrade`:更新系統並升級已安裝的套件。
- `apt install -y curl openssh-server ca-certificates tzdata perl`:安裝必要的套件,包括 `curl`、`openssh-server` 等。
- `curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | bash`:新增 GitLab 的套件倉函式庫。
- `EXTERNAL_URL="https://gitlab.devops.lab" apt install gitlab-ee`:安裝 GitLab,並設定外部存取 URL。
### 組態 GitLab 使用自簽 SSL 證書
由於 GitLab Runner 在使用自簽 SSL 證書時可能會出現問題,因此需要編輯 `/etc/ssl/openssl.cnf` 檔案,新增特定的組態內容。
```ini
[ v3_ca ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = gitlab.devops.lab
#### 內容解密:
[ v3_ca ]:定義了 v3_ca 擴充套件組態段。subjectAltName = @alt_names:指定了 subjectAltName 擴充套件欄位,該欄位包含了主機名的別名。[ alt_names ]:定義了 alt_names 組態段,列出了允許存取 GitLab 的主機名。
在 GitLab 中啟用自我簽署憑證並建立新使用者帳戶
為了使 GitLab 伺服器能夠正確使用自我簽署的 SSL/TLS 憑證,需要對 /etc/ssl/openssl.cnf 檔案進行修改。具體步驟包括在 [ v3_ca ] 段落中新增 subjectAltName 欄位,並指定相關的 DNS 名稱。
設定 OpenSSL 以支援自我簽署憑證
首先,編輯 /etc/ssl/openssl.cnf 檔案並加入以下內容:
[ v3_ca ]
basicConstraints = CA:false
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = gitlab.devops.lab
儲存變更後,使用 OpenSSL 工具生成新的憑證:
openssl req -newkey rsa:4096 -x509 -sha512 -days 3650 -nodes \
-out /etc/gitlab/ssl/gitlab.devops.lab.crt \
-keyout /etc/gitlab/ssl/gitlab.devops.lab.key \
-subj "/C=US/ST=New_York/L=Syracuse/O=devops-lab/CN=gitlab.devops.lab/" \
-addext "subjectAltName = DNS:gitlab.devops.lab"
內容解密:
- openssl req: 用於生成憑證請求的 OpenSSL 命令。
- -newkey rsa:4096: 生成新的 RSA 金鑰,長度為 4096 位元。
- -x509: 表示輸出為自我簽署的 X.509 憑證。
- -sha512: 使用 SHA-512 演算法進行簽署,提供更高的安全性。
- -days 3650: 設定憑證的有效期為 10 年。
- -nodes: 表示不對私鑰進行加密,避免每次使用時輸入密碼。
- -out 和 -keyout: 分別指定輸出憑證檔案和私鑰檔案的路徑。
- -subj: 指定憑證的主體資訊,包括國家、州、城市、組織和通用名稱(CN)。
- -addext: 新增擴充套件欄位,此處為
subjectAltName,用於指定憑證適用的 DNS 名稱。
接著,生成 Diffie-Hellman (DH) 引數檔案,用於增強金鑰交換的安全性:
openssl dhparam -out /etc/gitlab/ssl/gitlab.devops.lab.pem 2048
內容解密:
- openssl dhparam: 用於生成 DH 引數的 OpenSSL 命令。
- -out: 指定輸出的檔案路徑。
2048: 指定 DH 金鑰的長度,單位為位元。
完成上述步驟後,執行 gitlab-ctl reconfigure 以套用變更。然後,透過瀏覽器存取 https://gitlab.devops.lab,並處理憑證警告以進入 GitLab 登入頁面。
建立新使用者帳戶並上傳 SSH 金鑰
登入 GitLab 後,建議立即變更 root 使用者的密碼,並建立一個新的非 root 使用者帳戶。建立新使用者的步驟如下:
- 以 root 使用者登入 GitLab。
- 前往頂部選單,選擇「Admin」。
- 在「Overview」下,選擇「Users」並建立新使用者。
或者,也可以透過註冊功能建立新使用者,但需以 root 身份核准該帳戶。
建立新使用者後,登入該帳戶並建立一個新的 GitLab 專案(repository)。在專案建立過程中,可以選擇初始化一個 README 檔案。
設定 SSH 金鑰並推播程式碼至 GitLab
為了將本機的 Git 儲存函式庫推播至 GitLab,需要新增 SSH 金鑰。步驟如下:
- 前往使用者設定中的 SSH 金鑰管理頁面。
- 新增 SSH 金鑰,可以重複使用之前在 GitHub 上使用的公鑰。
然後,在本機的 Linux 終端機中,切換到 my-test-repo 目錄,並執行以下命令以重新命名原有的 GitHub remote 並新增指向 GitLab 的 remote:
cd ~/my-test-repo
git remote rename origin github_origin
git remote add origin git@gitlab.devops.lab:username/my-test-repo.git
修改 example.txt 檔案後,將變更推播至 GitLab:
echo "some more text" >> example.txt
git add .
git commit -m "First push to GitLab."
git push -u origin master
內容解密:
git remote rename: 將原有的 remote 名稱由origin改為github_origin。git remote add: 新增一個名為origin的 remote,指向 GitLab 上的儲存函式庫。git push -u origin master: 將本機的master分支推播至 GitLab,並設定 upstream 追蹤資訊。
推播成功後,可以在 GitLab 的網頁介面中檢視相關的提交紀錄和檔案內容。