Skip to main content

Git Rebase Update-Ref 繁體中文唯一教學

Git 教學現在有獨立的網站了!請移駕 Git 零到一百

本文是繁體中文唯一一篇 git rebase --update-ref 教學,內容來自於 Working with stacked branches in Git is easier with --update-refs

用途

文檔是這樣寫

Automatically force-update any branches that point to commits that are being rebased.

有看沒有懂,有說明但不多,這裡幫他翻譯:自動將 rebase 路徑中的其他分支也一起 rebase,這樣的說明簡潔又精確。

範例

請使用 rebase-onto-playground 測試範例。

1. 主分支(dev)有新提交,需要更新整個堆疊

請注意所有範例都基於「開發者喜歡把 PR 分成多個子 PR 方便審核」為前提,所以才會有這麼多分支。

比如說我們在子分支開發時,遇到主分支更新了,這時候我們就必須 rebase 把 D 接到最新的 I,還沒修改前的提交歷史如下:

A --- B --- C --- I  (dev)
\
D --- E (andrew/feature-xyz/part-1)
\
F --- G (andrew/feature-xyz/part-2)
\
H (andrew/feature-xyz/part-3)

不使用 --update-refs 重定基礎(第一步結果)

A --- B --- C --- I  (dev)
\
D' --- E' (andrew/feature-xyz/part-1)

但是這樣只完成了一個分支,而part-2 和 part-3 仍舊指向舊位置

        D --- E  
\
F --- G (andrew/feature-xyz/part-2)
\
H (andrew/feature-xyz/part-3)

使用 --update-refs 則可以自動 rebase 路徑上的其他分支,一步完成所有分支的操作

# git checkout andrew/feature-xyz/part-3
# git rebase dev --update-refs

A --- B --- C --- I (dev)
\
D' --- E' (andrew/feature-xyz/part-1)
\
F' --- G' (andrew/feature-xyz/part-2)
\
H' (andrew/feature-xyz/part-3)

2. PR審核後,part-1分支有新變更,需要更新後續分支

請注意所有範例都基於「開發者喜歡把 PR 分成多個子 PR 方便審核」為前提,所以才會有這麼多分支。

這個情境是 part-1 在 PR 審核後需要修改,所以 part-2 part3 都需要對應更新

A --- B --- C  (dev)
\
D --- E --- J (andrew/feature-xyz/part-1) # J是新的PR反饋提交
\
F --- G (andrew/feature-xyz/part-2)
\
H (andrew/feature-xyz/part-3)

不使用 --update-refs

A --- B --- C  (dev)
\
D --- E --- J (andrew/feature-xyz/part-1)
\
F' --- G' (andrew/feature-xyz/part-2)

而 part-3 仍指向舊位置

              \
F --- G
\
H (andrew/feature-xyz/part-3)

使用 --update-refs 可以一步完成

# git checkout andrew/feature-xyz/part-3
# git rebase andrew/feature-xyz/part-1 --update-refs

A --- B --- C (dev)
\
D --- E --- J (andrew/feature-xyz/part-1)
\
F' --- G' (andrew/feature-xyz/part-2)
\
H' (andrew/feature-xyz/part-3)

總結

簡單來說就是自動修改所有路徑中分支,在原文是寫堆疊 (stack)。