我們正在使用 Gitlab 免費的自托管 13.8.4-ee。在合并沖突期間,我們希望 Git 將未解決的沖突狀態按原樣保存在合并中,以便我們能夠在以后繼續解決沖突。
我們在 Gitlab UI 的 Merge 工具中檢查過,這是不可能的。“合并請求”中的“草稿”選項只會使合并處于非就緒狀態,但我們無法保存已解決和未解決的沖突,因為git mergetool將解決與 BASE(共同祖先)版本的未解決沖突,而不是而不是保留本地副本。我們還檢查了這在 Beyond Compare 或 Meld 等外部??合并工具中是不可能的。即使在 Github 的免費版本中檢查時,它也不允許在洗掉所有沖突標記之前保存/關閉合并。
有沒有辦法在 Git 中保存當前的合并狀態?在 TFS 中,可以按原樣保存當前合并狀態。
請檢查上一個問題的答案:沖突情況下的 Git 合并將本地副本替換為共同祖先副本
uj5u.com熱心網友回復:
你不能。
更準確地說,您在 Git 中永久保存任何內容(甚至僅一天左右,或出于傳輸目的等)的方式是進行commits。但是,當您處于合并沖突的程序中時,您無法進行任何新的提交。您想保存內容,以便合并可以在其他地方繼續。因此,您處于 Catch-22 情況:您想保存沖突,但要做到這一點,您必須首先完全解決沖突,然后再沒有沖突要保存。
Git 確實需要為此提供一種工具,并且有多種可能的方法來添加一種方法,但是——至少據我所知——沒有人能夠完全通過添加一種方法來實作。
(這不是檔案中是否有沖突標記的問題,盡管理想情況下“保留部分但沖突的合并”也會保留并恢復這些沖突標記。實際問題是索引中有非零的暫存編號。這些非零暫存編號是阻止寫出一棵樹的原因,如果沒有寫出樹的能力,就無法保存各種檔案。)
uj5u.com熱心網友回復:
您正在尋找git rerere. 我不知道任何 Web 前端是否以及如何實作這一點,但從命令列這很容易。
這是進入您所描述的情況的命令列版本:
git checkout main
git merge feature # has conflicts
resolve resolve
oops, cannot continue because reasons
問題是,如何在不丟失已經完成的決議的情況下暫停合并并執行其他操作?
最簡單的方法是git config rerere.enabled true在git merge(例如,將其包含在標準模板的配置中)之前已經完成。那么保存合并狀態的方法就是
git rerere
它將注意到并記住任何新的沖突或解決方案;你可以git merge --abort。由于 Git 現在會記住您剛剛記錄的解決方案,因此當您重新運行合并時,會出現相同的沖突,git 會git rerere為您運行,它會查看沖突并將您記錄的解決方案從其 rr-cache 應用到您的作業樹。你又回到了你離開的地方。
rerere.enabled
Activate recording of resolved conflicts, so that identical
conflict hunks can be resolved automatically, should they be
encountered again. By default, git-rerere(1) is enabled if there is
an rr-cache directory under the $GIT_DIR, e.g. if "rerere" was
previously used in the repository.
如果您已經在那里,如果您正在合并并添加了一些解決方案并且還沒有打開 rerere,那么追溯執行它很容易。對于機上合并,
git config rerere.enabled true
git worktree add scratch @
git -C scratch merge feature
git worktree remove -f scratch
現在您可以git rerere記錄您已經做出的決議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363599.html
