返回文章列表

Git 遠端倉函式庫同步與分支管理核心技術

本文探討 Git 遠端倉函式庫同步與分支管理技術,涵蓋組態遠端倉函式庫、同步本地與遠端變更、推播、提取、合併分支等核心操作,並提供實務應用中的策略與安全管理建議,以及圖表輔助說明完整同步工作流程。

版本控制 軟體開發

在團隊協作開發中,有效管理程式碼版本和變更是至關重要的。Git 作為分散式版本控制系統,提供強大的分支管理和遠端倉函式庫同步功能。透過 Git,開發者可以在本地建立分支進行功能開發或錯誤修復,並將變更推播到遠端倉函式庫與團隊成員分享。本文將詳細介紹如何組態遠端倉函式庫、同步本地與遠端變更、以及使用分支進行開發。首先,我們需要設定遠端倉函式庫,讓本地倉函式庫知道遠端副本的位置。可以使用 git remote add 命令新增遠端倉函式庫,並使用 git remote -v 檢視已設定的遠端倉函式庫。同步本地與遠端變更主要透過 git pushgit pull 命令完成。git push 將本地提交推播到遠端倉函式庫,而 git pull 則將遠端變更提取到本地並合併。分支管理是 Git 的核心功能之一。透過分支,開發者可以獨立開發不同功能,避免相互幹擾。可以使用 git branch 建立新分支,git checkout 切換分支,git merge 合併分支。在實際開發中,通常會建立一個主分支(例如 mainmaster)作為穩定版本,並建立開發分支(例如 develop)進行日常開發。功能開發則在獨立的功能分支上進行,完成後再合併到開發分支。

基礎 Git 指令練習

在 Git 開發流程中,金版倉函式庫(Golden Repository)是指存放在 GitLab 伺服器上的主要倉函式庫副本。如果你的團隊有 20 名開發者使用 GitLab,那麼就會至少有 21 個該專案的倉函式庫副本:每位開發者電腦上的一份以及 GitLab 伺服器上的金版副本。若某些原因使得主機無法使用,可以暫時將某位開發者電腦上的倉函式庫指定為團隊的金版倉函式庫。然而,一旦主機還原正常,應該盡快還原使用 GitLab 的金版副本。

當我們討論如何在不同的倉函式庫副本之間同步修改時,這個同步過程總是透過 GitLab 進行。舉例來說,如果我在本地電腦上對倉函式庫進行了提交並希望讓同事們也能看到這些變更,我不會直接將這些提交傳送到每位同事的電腦上。相反地,我會將提交推播到金版倉函式庫上,然後每位開發者可以從金版倉函式庫中取得這些提交。

以下圖示展示了一個工作流程,這個流程允許一位開發者透過推播和提取包含提交的分支到和從金版倉函式庫來與其他開發者分享提交:

組態遠端倉函式庫

在同步本地倉函式庫與金版倉函式庫之前,Git 需要知道金版倉函式庫的存在。任何不在本地電腦上的倉函式庫副本都被稱為「遠端」(Remote)。因此,組態遠端是同步提交的一個重要前置條件。

你可以使用以下命令來檢視 Git 已知的所有遠端名稱和 URL:

git remote --verbose

同步本地和遠端的倉函式庫副本

之前我們提到有兩種方式將倉函式庫複製到你的電腦上:git initgit clone。如果你是在使用 git init 建立的倉函式庫中,並要求 Git 提供遠端列表,它會顯示沒有任何輸出。因為你還沒有告訴它任何遠端的存在。但是如果你是使用 git clone 從其他地方複製了倉函式庫到你的電腦上,Git 已經知道有一個遠端:即你所克隆的那個遠端複製。

在進一步深入之前,讓我們討論一下如何克隆一個倉函式庫。如先前所述,這是將倉函式庫複製到電腦上最常見的方法之一。

你可以從網路連線可達的電腦上克隆一個倉函式庫,但讓我們專注於克隆一個儲存在 GitLab 上的倉函式庫。假設這個倉函式庫是由位於 www.gitlab.com 的 GitLab 例項所主機託管。如果你使用的是自託管版本而不是 SaaS 版本,克隆過程是相似的,只是你要克隆的倉函式庫地址會稍有不同。

要克隆一個由 GitLab 主機託管的儲存函式庫,你需要知道那個儲存函式庫的地址。這個地址可以有多種形式,但最常見的是使用 HTTPS 或 SSH 協定。儘管兩種協定都能工作,但一般來說使用 SSH 協定比較受歡迎。它需要你組態 SSH 金鑰才能開始使用,但之後每次與該遠端互動時都不需要輸入憑據:金鑰基礎架構會自動處理所有認證。

相反地,HTTPS 協定則需要每次使用與該遠端互動的 Git 命令時都需要輸入使用者名稱和密碼。

以下是透過 SSH 協定克隆由 GitLab 主機託管之儲存函式庫的範例。

首先,你需要透過 ssh-keygen 命令在終端機中生成公鑰和私鑰對並將公鑰上傳至 GitLab 例項。GitLab 提供了關於如何完成此步驟的優秀檔案(SSH 組態),因此我們建議您參考那些檔案而非在此重複說明。請注意只有第一次需要進行此過程;之後只要你使用相同的本地電腦與該 GitLab 例項進行互動時都會自動進行身份驗證。如果你更換為不同的 GitLab 例項或不同的本地電腦時則需要重複此過程。

現在你需要找到專案的 SSH 地址。登入到 GitLab 與瀏覽至專案首頁面如圖所示:

圖示:從GitLab克隆儲存函式庫

點選「Clone」按鈕並從下拉選單中複製標示為「Clone with SSH」旁邊的地址:

接下來當你已經設定好鑰匙對且已經將專案 SSH 地址複製至剪貼簿後導航至你希望包含該儲存函式庫之本地檔案系統目錄並透過 git clone 和儲存函式庫 SSH 地址來將遠端儲存函式庫克隆至您電腦:

$ cd ~/code
$ git clone [email protected]:cwcowell/hats-for-cats.git

此過程定義了一個遠端儲存函式庫給您:讓您本地的一份儲存函式庫知道有一份遠端副本存在於您所克隆之 URL 上。 您可以在 git remote --verbose 的輸出中看到此遠端副本列出:

$ git remote --verbose
origin [email protected]:cwcowell/hats-for-cats.git (fetch)
origin [email protected]:cwcowell/hats-for-cats.git (push)

次段落標題

內容解密:

$ git clone [email protected]:cwcowell/hats-for-cats.git

以上程式碼用來將遠端 Git 儲存函式庫複製到本地電腦中。

  • git clone 是用於複製一份現有儲存函式庫以建立新的工作目錄。
  • [email protected]:cwcowell/hats-for-cats.git 是指定要複製之遠端儲存函式庫位址。
  • 在執行完畢後會建立一個名稱為 hats-for-cats 的新目錄並將所有檔案堆疊入其中。
$ git remote --verbose

此命令用於列出所有已知遠端名稱及 URL。

  • --verbose 是一項旗標引數用來顯示詳細資料。
  • origin 是預設為遠端命名之預設名稱。
  • fetchpush 是指定傳送方向。

組態與管理遠端

除了基本組態外還可以增加和刪除其他的遠端資料來源:

# 新增另一個來源 (例如更新 url 和名稱)
$ git remote add newname https://github.com/user/repo.git

# 檢視目前已知資料來源清單
$ git remote -v

# 刪除不必要資料來源 (例如刪除 named)
$ git remote remove named

分支操作

當進入倉函式庫後可能會進行一些分支操作來管理程式碼變更. 下面是一些基本操作:

# 新增分支 (例如開發分支)
$ git branch dev

# 啟用分支 (例如切換到開發分支)
$ git checkout dev

# 新增並且切換分支(一個命令執行兩個操作)
$ git checkout -b newbranch

# 檢視所有分支
$ git branch

# 推播當前分支到遠端倉函式庫 (例如開發分支)
$ git push origin dev

# 提取遠端倉函式庫特定分支併合並(例如 master 分支)
$ git pull origin master

次段落標題

內容解密:

$ git branch dev

以上程式碼用於建立新分支。

  • dev 是新增分支名稱。
$ git checkout dev

以上程式碼用於切換至已存在之特定分支。

  • dev 是要切換之分支名稱。
$ git checkout -b newbranch

以上程式碼用於新增以及同時切換至特定分支。

  • -b 用來表示新增且切換至新分支。
  • newbranch 是新增及切換之分支名稱。
$ git push origin dev

以上程式碼用於推播特定分支資料至遠端倉函式庫。

  • origin 是指定遠端主機.
  • dev 是要推播之分支.
$ git pull origin master

以上程式碼用於提取遠端倉函式庫中的特定分支內容併合並.

  • origin 是指定遠端主機.
  • master 是要提取和合並之遠端倉函式庫中的特定分支.

推播和提取

推播和提取是基本操作,用於將工作結果與團隊成員分享或取得最新變更.

# 推播當前工作內容到遠端倉函式庫 (例如 master 分支)
$ git push origin master

# 提取遠端倉函式庫最新變更併合並 (例如 master 分支)
$ git pull origin master

# 提交變更 (例如提交工作目錄中的修改)
$ git commit -m "更新 README"

# 推播當前工作內容到遠端倉函式庫特定分支 (例如開發分支)
$ git push origin dev

# 提取遠端倉函式庫特定分支最新變更併合並 (例如開發分支)
$ git pull origin dev

# 提交變更並推播 (將修改直接推播到遠端倉函式庫)
$ git push -u origin master # 第一次推播時需要指定上游資訊

次段落標題:

內容解密:

 $ git push origin master

以上命令用於將當前工作內容推播到遠端倉函式庫名為 “origin” 的 “master” 分支中. 若沒有進行過push則可能會遇見錯誤並且要求設定上游資訊.

  • $ 提示符號.
  • -u 或 --set-upstream: 建立上游連線方便之後push不用再重複新增原點與目標.
  • -f 或 --force: 強制覆寫.
 $ git pull origin master`

以上命令用於將遠處master上的更新與當前工作內容進行合併(注意可能會產生衝突).

  • $: 提示符號.
  • -r 或 --rebase: 用於將更新適配為一種線性歷史模型,而不是進行簡單合併.
 $ git commit -m "更新 README"

以上命令用於將當前暫存區中的檔案進行提交以及新增註解資訊.

  • $: 提示符號.
  • -m 或 --message: 新增註解資訊,逗號隔開.

```shell $ git push -u origin dev

以上命令用於推播當前工作目錄中的修改並且首次新增upstream資訊.
- `-u 或 --set-upstream`: 設定上游,方便之後無需再手動指定.

```shell`
$ git pull origin dev`

以上命令用於取得遠處dev上的更新並且與當前工作內容進行合併.與merge不同的是rebase會把所有更新轉換為線性模型.(適合管理較長時間內產生大量修改). 此處只以merge為例.

  • $: 提示符號.
  • --rebase or -r: 均表示將多個commit合併為一個線性歷史,避免混亂.

Plantuml圖表解說:

此圖示展示了Git基礎操作流程:

本地與遠端同步策略與安全管理

在實務應用中,玄貓認為常見挑戰之一為如何平衡團隊間協作以及保證資料安全:

  1. 針對大型專案設定多重保險: 在主要開發完成後期應設計好多重備份策略,避免因為單點故障導致全盤皆輸.同時設定好許可權細節,避免重要資料被篡改或洩漏.

  2. **積極利用CI/CD: **若能結合CI/CD工具則可顯著減少人工錯誤以及強化佈署效率,再配合好自動化測試Pipeline,則能夠快速反應甚至自動修復問題.

  3. 針對小型專案強調簡單高效: 對於小型專案則需注重速度以及成本考量,強調簡單高效介面且保持低延遲優先順序.

同步本地與遠端儲存函式庫的技術內容

在 Git 的世界中,同步本地與遠端儲存函式庫是日常開發流程中的重要環節。本文將探討如何推播(push)、提取(fetch)及整合(pull)資料,確保你的本地與遠端儲存函式庫保持一致。

推播(Push)

推播是將本地儲存函式庫的變更上傳到遠端儲存函式庫的過程。這個過程在 Git 中被稱為「push」,相關的命令是 git push

假設你在本地儲存函式庫中建立了一個名為 login-feature 的分支,並且已經在這個分支上增加了一些提交。現在,你希望將這個分支推播到遠端儲存函式庫,讓團隊成員能夠看到你的變更。以下是推播這個分支到遠端的步驟:

  1. 切換到你想要推播的分支:

    $ git switch login-feature
    
  2. 執行推播命令並設定上游分支:

    $ git push --set-upstream origin login-feature
    

在這裡,origin 是遠端儲存函式庫的別名,表示你要將變更推播到的目標。這個命令告訴 Git 將本地分支 login-feature 推播到遠端分支 login-feature

內容解密:

  • git switch login-feature:這個命令用來切換到 login-feature 分支。
  • git push --set-upstream origin login-feature:這個命令將本地的 login-feature 分支推播到遠端儲存函式庫,並設定 origin 作為上游分支。之後,你只需要執行 git push 即可推播當前分支的變更。

提取(Fetch)

提取(fetch)是從遠端儲存函式庫取得最新資訊的過程。這個命令不會自動合併或修改你的本地檔案,而是隻會從遠端儲存函式庫取得最新的變更資訊。

$ git fetch

內容解密:

  • git fetch:這個命令從遠端儲存函式庫取得最新的分支和提交資訊,但不會修改你的本地檔案。這樣可以讓你瞭解遠端儲存函式庫的變更狀態,並決定是否需要更新本地檔案。

提取(Pull)

提取(pull)則是從遠端儲存函式庫取得最新變更並自動合併到本地分支的過程。它結合了 fetchmerge 的功能。

$ git switch login-feature
$ git pull

內容解密:

  • git switch login-feature:切換到你想要更新的分支。
  • git pull:從遠端儲存函式庫提取最新變更並自動合併到當前分支。如果有衝突,Git 會提示你解決衝突。

完整同步工作流程

以下是一個完整的同步工作流程範例:

  1. 切換分支:使用 git switch 切換到你想要工作的分支。
  2. 提取資訊:使用 git fetch 獲得遠端儲存函式庫中最新的變更資訊。
  3. 檢查狀態:使用 git status 檢查你的本地分支是否落後於遠端分支。
  4. 更新檔案:如果本地分支落後於遠端分支,使用 git pull 更新本地檔案。

工具補充

為了更直觀地理解以上流程,玄貓提供了一些圖表說明:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Git 遠端倉函式庫同步與分支管理核心技術

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

此圖示解說:

此圖示展示了完整同步工作流程:首先切換到所需分支,然後提取最新資訊、檢查狀態,最後根據需求更新檔案。