![](/img/trans.png)
[英]git workflow: throwaway merges and git-rerere - what's the point?
[英]What is git-rerere and how does it work?
據我了解,通過保存沖突解決信息對項目同步很有用,但我並不完全清楚如何使用和配置它。
我想為我的持續集成 (CI) 環境進行配置。 是否建議這樣做?
請不要用其他問題標記重復: 啟用 git rerere 有什么缺點嗎? . 因為我的懷疑與“那么啟用 rerere 有什么缺點嗎?它會導致哪些潛在問題不會發生?”
git rerere
? 正如文檔所述 , rerere
代表重新使用re corded re解決方案。
但這並沒有真正解釋它是什么 。 值得首先添加,這里, git rerere
本身 - 命令 - 不是你必須運行的東西。 它只有六個子命令: clear
, forget
, diff
, status
, remaining
和gc
。 這些都沒有記錄或重復使用分辨率 - 實際上, git rerere clear
和git rerere forget <path>
只丟棄一些記錄的分辨率。 gc
命令類似,但指的是舊的,而不是當前的。
大部分工作都是在rerere.enabled
的設置下rerere.enabled
(這使得Git在適當的時候運行git rerere
,沒有子命令)。 你可以自己運行沒有子命令的git rerere
,但這並沒有真正做任何重要事情,因為Git會自己做。
git config rerere.enabled true
一旦你設置了rerere.enabled
,當Git進行合並 - 任何合並,包括那些來自git am
和git rebase
以及git cherry-pick
等等,不僅僅是那些來自git merge
本身 - 並且遇到沖突,Git會:
git commit
時)你做了什么來解決它們。 這里有一個缺失的步驟,這就是為什么從2開始編號的原因。步驟1是:
如果記錄的分辨率完全解決沖突,則步驟2-4變得多余。 Git可能仍會運行它們(我不確定它是否會)更新記錄的分辨率上的時間戳。
一旦你設置了rerere.enabled
,它就是合並自己的行為,它們都會產生沖突並且 (因為它會自動運行沒有參數的git rerere
)記錄它們,然后嘗試重用任何現有的記錄分辨率。 這是記錄最終決議的承諾行為(因為Git會再次為你自動運行git rerere
)。 所以這一切都是自動的 - 您只需要通過運行自己的git diff
命令確保您以前重復使用的分辨率是正確的。 如果沒有,只需像往常一樣修復文件,添加和提交,Git將用新的解決方案替換錄制的分辨率。
請注意,您仍然必須git add
和git commit
! 您應該始終檢查合並結果 (和/或運行測試) - 盡管您應該始終這樣做,無論您的rerere.enabled
設置如何。
正如VonC在評論中指出的那樣 ,如果您之前沒有記錄的合並沖突解決方案,則可以在這些分辨率上“訓練”rerere數據庫。 Git源代碼中有一個貢獻的腳本來執行此操作; 它也可以在線獲得。
為CI環境啟用rerere
是沒有意義的,因為您的CI環境永遠不應該首先解決合並沖突。 為什么你認為你會想要它?
我似乎無法讓 rerere train 腳本正常工作。 它只是不斷地要求我輸入我的密碼來簽署我認為回購中可用的每一個提交。
git 2.38(2022 年第 3 季度)的要求應該更少:“ rerere-train
”腳本(在contrib/
中)用於在重新創建一次性合並時兌現commit.gpgSign
。 這已得到修復。
請參閱Celeste Liu ( CoelacanthusHex
) 提交的 cc391fc (2022 年 7 月 20 日)。
(由Junio C Hamano -- gitster
--在提交 f0f9a03中合並,2022 年 8 月 1 日)
contrib/rerere-train
: 避免無用的 gpg 登錄訓練簽字人:Celeste Liu
用戶可能已將“
git merge
” ( man )配置為始終要求 GPG 對生成的提交進行簽名。
我們不是運行“git merge
”來重新創建合並提交,而只是重放合並沖突,我們將立即丟棄結果提交; 簽署它們是沒有意義的。使用“
--no-gpg-sign
”選項覆蓋強制從命令行進行無用簽名的配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.