手把手教你用Git——詳解git merge

語言: CN / TW / HK

theme: nico

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 30 天,點選檢視活動詳情

前言

背景

由於本社新人並不常用Git,再加上國內的網路並不算好,在這樣一個背景下,為了簡化Git的使用,我在這裡簡單記錄了一個關於 Git的教程,希望對大家有所幫助。

關於本教程的編寫環境

本文基於Windows10系統Mac系統的小夥伴可以嘗試Homebrew。由於本人手裡並沒有搭載MacOS的電腦,因此Homebrew相關的使用請自行嘗試。

對於使用 Windows11系統 的小夥伴,本文的教程是通用的,不過一些細節可能略有不同,這點希望小夥伴們注意一下

關於Git

Git 是一個開源的分散式版本控制系統,可以有效、快速的進行專案版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。 ——來自 Git 簡介 | 程式設計師大彬 (topjavaer.cn)

簡單來說,Git 就是一個專案程式碼管理軟體

關於本教程的評論

這個教程基於我的個人實踐,很多東西基於我個人的理解,所以有望大家多多指教。如果你發現了這個教程的錯誤之處,歡迎你通過郵箱或者QQ聯絡我,我會及時的進行改進。如果教程中有表述不清楚的地方,也請指出,或提供建議。

關於本教程的轉載

任何個人或組織可以轉載我的這個教程系列,甚至可以對其進行一些修改。但前提是要保證實時更新,並且保留本教程的版權資訊,謝謝支援,我也會不定時的更新這個系列的教程。

正文

Git安裝與使用

具體安裝教程可以看看這個系列的第一期:手把手教你用Git——Git使用教程(一) - 掘金 (juejin.cn)

一個慘痛的事故

有兩個開發人員(其中一個絕對不是我,嗚嗚嗚)正在獨立開發同一個功能,分別在featureAfeatureB分支上進行開發。他們都修改了同一個檔案main.js的不同部分。為了將這兩個功能合併到master分支上,使用git merge命令進行合併操作。

首先,開發人員A將featureA分支合併到master分支上:

$ git checkout master $ git merge featureA

此時,Git會嘗試自動合併featureA分支的修改。但是,由於開發人員B同時也修改了main.js檔案,因此會產生合併衝突。Git會提示使用者手動解決衝突。假設解決衝突後,main.js檔案的內容如下:

``` jsCopy code function main() { <<<<<<< HEAD console.log("Feature A"); ======= console.log("Feature B");

featureA } ```

此時,featureA分支的修改已經成功合併到了master分支上。接下來,開發人員B也將featureB分支合併到master分支上:

rubyCopy code $ git checkout master $ git merge featureB

由於featureA分支的修改已經合併到了master分支上,因此這次合併操作不會產生衝突。Git會自動將featureB分支的修改合併到master分支上,並建立一個新的合併提交。最終,master分支的提交歷史記錄如下:

* Merge branch 'featureB' |\ | * Commit B2 | * Commit B1 * | Merge branch 'featureA' |\ \ | * | Commit A2 | * | Commit A1 | |/ * | Commit M2 |/ * Commit M1

在這個例子中,如果開發人員A和B沒有進行充分的溝通和協作,他們的修改可能會相互衝突,導致程式碼錯誤或功能失效。

Git merge介紹

Git merge是Git版本控制系統中一種將兩個或多個不同的分支合併為一個新分支的操作。在軟體開發中,團隊成員通常會建立不同的分支,以便在不同的任務和特性上進行工作,這些分支在某些時候需要合併到主分支或其他分支上,以確保程式碼的整體穩定性和一致性。

Git merge操作是將兩個分支的歷史記錄合併到一個新的提交中。當你執行merge操作時,Git會自動找到兩個分支的最近共同祖先節點,然後比較這些節點之間的差異,將這些差異合併到一個新的提交中。這個新提交會包含兩個分支的所有變更內容,併成為這兩個分支的最新公共祖先。

Git merge有兩種主要的合併策略:fast-forward和recursive。在fast-forward合併策略中,如果一個分支的提交歷史是另一個分支的子集,那麼Git會簡單地將當前分支指向另一個分支的最新提交,這樣就完成了合併操作。在recursive合併策略中,Git會建立一個新的提交來表示合併結果,這個提交會包含兩個分支的所有變更內容。

在執行merge操作之前,通常需要先切換到目標分支,使用git checkout命令。然後,使用git merge命令將源分支合併到目標分支上。如果合併出現衝突,Git會提示你手動解決衝突。最後,使用git push命令將合併結果推送到遠端倉庫上,以便讓其他團隊成員看到最新的程式碼。

使用

當你需要將一個分支合併到當前分支時,可以使用git merge命令。該命令的基本用法如下:

git merge <source-branch>

其中,<source-branch>指定了要合併的源分支的名稱。

例如,如果你當前在master分支,並想將dev分支合併到master分支上,可以執行以下命令:

git checkout master git merge dev

在執行這個命令之前,你需要先切換到master分支上,使用git checkout命令。然後,執行git merge dev命令,將dev分支合併到master分支上。

如果合併成功,Git會建立一個新的提交來表示合併結果,並將該提交新增到當前分支的提交歷史中。如果合併出現衝突,Git會提示你手動解決衝突。

另外,git merge命令還支援一些選項,用於控制合併的行為。其中一些常用的選項包括:

  • --no-ff:禁用fast-forward合併策略,強制Git建立一個新的合併提交。
  • --squash:將合併結果壓縮為一個提交,並且不會保留源分支的提交歷史。
  • -m <message>:指定新的合併提交的提交資訊。

例如,如果你想要禁用fast-forward合併策略並建立一個新的合併提交,可以執行以下命令:

git merge --no-ff dev

如果你想要將合併結果壓縮為一個提交,並指定合併提交的提交資訊,可以執行以下命令:

git merge --squash dev git commit -m "Merge dev branch"

注意,當你使用--squash選項時,需要使用git commit命令手動提交合並結果。因為該選項會禁止Git自動建立合併提交。

如何儘量避免程式碼合併事故?

  1. 保持程式碼庫乾淨和整潔,避免建立不必要的分支。應該儘可能減少併合並分支,避免出現太多的衝突。
  2. 在執行合併操作之前,確保程式碼庫和分支都已經進行了充分的測試和審查。程式碼合併之前需要進行全面的測試,並且應該遵循程式碼審查的最佳實踐,確保程式碼的正確性和可靠性。
  3. 使用工具和技術來幫助管理和減輕合併衝突的風險,例如使用分支策略、程式碼稽核和自動化測試等。使用Git等版本控制系統可以減少合併程式碼時的人為錯誤,通過分支策略可以將風險最小化,並使用自動化測試來檢測潛在的錯誤。
  4. 讓團隊成員保持溝通和協作,確保他們都瞭解合併的風險和最佳實踐。開發團隊應該建立有效的溝通機制,確保團隊成員能夠相互交流,及時發現和解決問題。在專案開始之前,應該制定好合並程式碼的規範和流程,確保團隊成員都瞭解和遵循最佳實踐。