使用重訂基底來套用變更
本文內容
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Visual Studio 2019 |Visual Studio 2022
Git 會自動藉由將每個新認可連結到其前置專案,在分支上 維護開發歷程記錄 。 當您 將一個分支合併 到另一個分支時,歷程記錄可能會變得不那麼簡單。 例如, 不快速向前合併 會藉由建立與多個前置專案的合併認可,來合併開發各行。 相反地,Git 重新基底 會結合不同的開發行,而不建立合併認可,這會導致較簡單的認可歷程記錄,但遺失合併的相關信息。 您所選擇的 合併類型 可能會受到您要保留合併記錄或簡化認可歷程記錄的影響。
本文討論何時使用 rebase 而非無快速向前合併,並提供下列工作的程式:
重新設定本機分支的基底
在重新基底之後強制推送本機分支
互動式重新基底來壓縮本機認可
如需 Git 工作流程的概觀,請參閱 Azure Repos Git 教學課程 。
重新設定本機分支的基底
Git 重新基底 會將來源分支的認可整合到您目前的本機分支(目標分支)。 來源分支保持不變。 如需比較,Git rebase 和其他合併類型會顯示在下圖中。
Git rebase 會重新設定目標分支的認可歷程記錄,使其包含所有來源分支認可,後面接著自上次一般認可之後的所有目標分支認可。 另一個檢視方法是,重新基底會在來源分支歷程記錄上方重新執行目標分支中的變更。 值得注意的是,Git 重新基底會變更現有目標分支認可的順序,這不是其他合併策略的情況。 在上圖中,commit K' 包含與 K 相同的變更,但有新的認可標識碼,因為它會連結回認可 E,而不是 C。
在重新基底期間,如果來源分支變更與目標分支變更衝突,Git 會提示您 解決合併衝突 。 您可以使用在合併期間解決合併衝突的相同方式,在重新基底期間解決合併衝突。
Rebase 與 no-fast-forward 合併
Git 重新處理會產生較簡單但較不精確的認可歷程記錄 ,而不是非快速向前 合併,否則稱為 三向 或 真實 合併。 當您想要在認可歷程記錄中記錄合併時,請使用無快速向前合併。
如果您是處理功能或 Bugfix 分支的唯一人員,請考慮使用 rebase 定期將最近的 main
分支工作整合到其中。 該策略有助於確保您隨時瞭解其他人最近的工作,並及時解決任何出現的合併衝突。 藉由重新設定,您會在最新的 main
分支工作之上實作新功能,以協助維護線性認可歷程記錄。
如需 Git Rebase 和使用時機的詳細資訊,請參閱 Rebase 與 merge 。
Rebase 和 force-push 指導方針
如果您重新建置先前 推送 的本機分支,然後再次執行預設 Git 推送命令,推送將會失敗。 默認 Git push 命令會套用快速轉送合併,以將本機分支整合到遠端分支。 該命令會在重新基底之後失敗,因為重新基底會改變本機目標分支中現有認可的順序,因此它不再符合其遠端對應專案的歷程記錄。 在此案例中, 強制推送 將會成功,方法是覆寫遠端分支。
Git 重設基底和強制推送是功能強大的工具,但在決定是否使用時,請記住這些指導方針:
除非您確定沒有人使用共用分支,否則請勿重新建置已推送並與他人共用的本機分支。 重新基底之後,您的本機分支將不再符合其遠端對應項目的歷程記錄。
請勿強制推送至其他人正在使用的遠端分支,因為其遠端分支的本機版本將不再符合更新的遠端分支歷程記錄。
您的小組應同意重新基底和強制推送的使用案例。
提示
若要進行共同作業檢閱程式,請使用 提取要求 ,將新工作合併至遠端存放庫的預設分支。
如何重新基底
Visual Studio 2022 提供 Git 版本控制體驗,方法是使用 Git 功能表、Git 變更 ,以及透過 方案總管 中的 操作功能表。 Visual Studio 2019 16.8 版也提供 Team Explorer Git 使用者介面。 如需詳細資訊,請參閱 Visual Studio 2019 - Team Explorer 索引標籤。
選擇 [Git > 管理分支 ] 以開啟 [Git 存放庫 ] 視窗。
在 [ Git 存放庫 ] 視窗中,以滑鼠右鍵按兩下目標分支,然後選取[ 簽出 ]。
以滑鼠右鍵按兩下來源分支,然後選取 [將目標分支重新設定<為<source-branch>> ]。
Visual Studio 會在成功重新基底之後顯示確認訊息。
如果因合併衝突而停止重新基底,Visual Studio 會通知您。 您可以 解決衝突 ,或取消重新基底並返回預先重新基底狀態。
Visual Studio 2019 16.8 版和更新版本提供 Git 版本控制體驗,同時維護 Team Explorer Git 使用者介面。 若要使用Team Explorer ,請從功能表列取消核取 [工具> 選項 >預覽功能 >] [新增 Git 使用者體驗]。 您可以從任一介面交換使用 Git 功能。
在 [Team Explorer] 中 ,選取 [ 首頁 ],然後選擇 [ 分支 ]。
在 [ 分支 ] 檢視中,以滑鼠右鍵按兩下目標分支,然後選取 [ 簽出 ]。
以滑鼠右鍵按兩下來源分支,然後選取 [重新基底到]。
確認重新基底選項,然後按兩下 [ 重新基底 ]。
Visual Studio 會在成功重新基底之後顯示確認訊息。
如果在重新基底期間發生衝突,Visual Studio 會通知您。 您可以 解決衝突 ,或取消重新基底並返回預先重新基底狀態。
若要將來源分支認可整合到目標分支中,請執行 git rebase
命令:
git rebase <source branch name> <target branch name>
如果您目前的本機分支是目標分支,您可以將 rebase 命令簡化為:
git rebase <source branch name>
Git 會在重新基底期間發生衝突時通知您。 您可以解決衝突 ,然後執行 ,或執行 git rebase --continue
git rebase --abort
以復原重新基底並返回預先重新基底狀態。
在重新基底之後強制推送本機分支
如果您重新建置先前推送的本機分支,後續的預設 Git 推送將會 失敗 。 相反地,您可以強制推送本機分支來覆寫其遠端對應專案,使其認可歷程記錄相符。
若要強制在 Visual Studio 中推送,您必須先啟用強制推送選項:
移至 [工具 >選項 >] 原始檔控制> Git 全域 設定。
選取 [ 啟用 push --force-with-lease ] 選項。
Git 推送 --force-with-lease
旗標比 --force
旗標更安全,因為它不會覆寫遠端分支,其認可未整合到您強制推送的本機分支內。
在 [ Git 變更 ] 視窗中,選取按鈕以推送認可。
或者,您可以從 Git 功能表選取 [推送 ]。
如果預設的 Git 推送作業失敗,Visual Studio 會 啟動 Git-Push 失敗 對話方塊。 選擇 [ 強制推送 ]。
Visual Studio 會在成功推送之後顯示確認訊息。
Visual Studio 2019 16.8 版和更新版本提供 Git 版本控制體驗,同時維護 Team Explorer Git 使用者介面。 若要使用Team Explorer ,請從功能表列取消核取 [工具> 選項 >預覽功能 >] [新增 Git 使用者體驗]。 您可以從任一介面交換使用 Git 功能。
在 Team Explorer 中 ,選取 [ 首頁 ],然後選擇 [同步 處理] 以開啟 [同步處理 ] 檢視。
在 [同步處理] 檢視中 ,選擇 [推送 ] 將變更上傳至遠端存放庫。
如果預設的 Git 推送作業失敗,Visual Studio 會 啟動 Git-Push 失敗 對話方塊。 選擇 [ 強制推送 ]。
Visual Studio 會在成功推送之後顯示確認訊息。
提示
Git 推送 --force-with-lease
旗標比 --force
旗標更安全,因為它不會覆寫遠端分支,其認可未整合到您強制推送的本機分支內。
若要強制將新認可從本機分支推送至同名遠端分支:
git push --force-with-lease <remote> <local branch name>
如果您想要推送的分支是取出的分支,您可以簡化強制推送命令以:
git push --force-with-lease <remote>
當您複製遠端存放庫時,Git 會將別名 origin
指派為您複製之遠端存放庫 URL 的縮寫。 執行 git remote -v
以檢查 origin
別名值。 若要手動新增 origin
別名,請執行 git remote add origin <remote repo url>
。 origin
使用 別名,您可以進一步簡化強制推送命令:
git push --force-with-lease origin
如果您目前的本機分支在 上 origin
追蹤遠端分支,您可以完整縮寫 force push 命令:
git push --force-with-lease
不過,如果您的本機分支未追蹤遠端分支,則完全縮寫的推送命令將會失敗。 執行 git remote show origin
以檢查分支的追蹤狀態。
互動式重新基底來壓縮本機認可
一般而言,當您在本機功能分支中處理新功能時,您將建立多個認可。 當您準備好發佈新功能時,您可能會想要將這些認可合併成單一認可,以簡化認可歷程記錄。 您可以使用互動式重新基底,將 多個認可壓縮 成單一認可。
Visual Studio 2022 不支援互動式重新配置。 請改用 Git 命令行。
Visual Studio 2019 不支援互動式重新配置。 請改用 Git 命令行。
查看您想要執行互動式重新基底的本機分支。
認可 、隱藏或捨棄任何未認可的變更。
估計您想要在認可歷程記錄中的回溯程度。 當您執行互動式 rebase 命令時,您不需要確切地挑選要壓縮的特定認可。 例如,如果您想要在最後五個認可內壓縮認可,請執行:
git rebase -i HEAD~5
Git 會開啟一個編輯器,其中列出最後五個認可,從最新的開始。 例如:
pick 7068b09 Update README network switch section
pick 9d247f7 Update README network controller section
pick 5d7ab9f Fix fiber optic transmitter test
pick 7b43f3f Add network switch test
pick 00859d9 Add network controller test
讓第一行保持為不變。 在後續幾行中,若要將認可與上述項目合併,請將 變更 pick
為 squash
。 例如,若要合併前兩個認可,以及底部兩個認可,請將認可清單修改為:
pick 7068b09 Update README network switch section
squash 9d247f7 Update README network controller section
pick 5d7ab9f Fix fiber optic transmitter test
pick 7b43f3f Add network switch test
squash 00859d9 Add network controller test
儲存並關閉編輯器。 Git 接著會開啟每個合併認可集的新編輯器,提示您輸入認可訊息。 針對每個認可集,將認可訊息壓縮成一則訊息,然後儲存並關閉編輯器。 在上述範例中,壓縮的認可會使用新的認可訊息來壓縮:
8fcb88f Update README network sections
ac6d3c0 Fix fiber optic transmitter test
f0aadc3 Add two network tests
即使 Fix fiber optic transmitter test
認可未遭到壓縮,它也有新的認可標識符,因為它現在會連結到不同的前置認可。
如需互動式存放區的詳細資訊,請參閱 Git Rebase 互動式模式 。
注意
Azure DevOps 用戶可以 壓縮合併 ,以壓縮提取要求期間主題分支的認可歷程記錄。
下一步
相關文章