Git 變基



在 Git 中,將一個分支的更改合併到另一個分支主要有兩種方法:**合併** 和 **變基**。

合併是透過生成一個**合併**提交來完成的,這個提交包含兩個分支的最新快照(如下圖所示的 C3 和 C4)以及它們的共同祖先(C2)。

這種方法會新增一個合併提交,但會保持分支歷史的完整性。

git merge 1

或者,透過在另一個分支 (C3) 上重放修改,變基允許我們將提交 (C4) 中引入的補丁應用。

**變基**是將一個分支的提交應用到另一個分支頂部的過程,通常不會生成合並提交,從而建立一個線性歷史。

如下圖所示,假設我們有一個從 **main** 分支分出的功能分支 (**feature**)。當您在 **feature** 上工作時,其他團隊成員對 **main** 分支進行了更改。您可以將分支變基到 **main** 的頂部,而不是將 **main** 合併到您的 **feature** 中並建立合併提交。此過程會重新應用您的提交,就好像它們是在 **main** 的最新更改之後進行的一樣,從而保持歷史記錄的簡潔和線性。

git merge 2
$ git checkout feature
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

變基的工作原理

執行 **git rebase** 命令時,Git 執行以下步驟:

  • **識別基底:** Git 查詢當前分支與我們正在變基到的分支之間的共同祖先。

  • **臨時儲存您的提交:** Git 儲存更改並臨時從當前分支中刪除提交。

  • **應用目標分支的更改:** Git 更新分支以匹配我們正在變基到的分支的狀態。

  • **重新應用您的提交:** Git 將提交一個接一個地應用到新的基底(即目標分支)之上。

  • **更新分支指標:** Git 將分支的指標更新為具有變基提交的新狀態。

讓我們看下面的例子,假設 **feature** 分支有提交 `C4`,**main** 分支有提交 `C3`。當我們將 **feature** 變基到 **main** 時,Git 將重寫歷史記錄,以便我們的分支現在看起來像是 `C4` 建立在 `C3` 之上。

git merge 3

對於此示例,我們將切換到 feature 分支,然後將其變基到 master 分支,如下所示:

$ git checkout feature
$ git rebase main

使用變基的優勢

以下是變基的一些優勢:

  • **更清晰的歷史記錄:** 變基建立一個乾淨的線性歷史記錄,使跟蹤更改流程更容易。您只需要看到一條直線提交,而不是可能會使歷史記錄混亂的合併提交。

  • **易於閱讀:** 在與大型團隊合作時,具有多個分支和合並提交的歷史記錄可能難以理解。變基透過消除不必要的合併提交來簡化此過程。

  • **更好的上下文:** 變基允許您將更改置於主分支上最新程式碼的上下文中,這可以使您更容易儘早發現整合問題。

Git 中變基的風險

在 Git 中,變基可以是一個非常有用的工具,用於維護整潔有序的提交歷史記錄。

  • **不要變基公共歷史記錄:** 使用 Git 變基時最重要的規則之一是**永遠不要變基已與他人共享的提交**。將提交推送到遠端儲存庫(如 GitHub)後,變基它們可能會導致與同一分支上工作的其他人出現問題。相反,將變基用於您的本地分支和尚未共享的功能分支。

  • **衝突解決:** 當 Git 嘗試將更改應用到新的基底提交之上時,變基經常會導致衝突。發生衝突時,Git 將暫停變基過程並允許使用者手動解決衝突。解決衝突後,使用者可以使用…

    git rebase --continue
    

    如果使用者想要中止變基過程並將分支恢復到其原始狀態,可以使用…

    git rebase --abort
    

變基最佳實踐

  • **將變基用於本地清理:** 變基是清理本地提交併在將其推送到共享儲存庫之前的好工具。這確保了提交歷史記錄保持整潔。

  • **互動式變基用於提交潤色:** 使用互動式變基來組合、重新排序或編輯提交。這允許使用者在為共享分支做貢獻時呈現乾淨且邏輯的提交歷史記錄。

  • **避免變基共享分支:** 不要變基已推送到共享分支的提交,因為這可能會導致其他開發人員感到困惑和衝突。

  • **將變基用於功能分支:** 在處理功能分支時,請使用變基使更改與主分支保持最新,尤其是在將其合併到主分支之前。

  • **在測試分支上練習:** 在執行復雜的變基操作之前,請在測試分支上練習或使用 Git 的 reflog 在出錯時恢復。

廣告