![](/img/trans.png)
[英]Force git to display differences between branches in editor like a merge conflict
[英]Have git raise a merge conflict for differences between branches
我有一個github分支,其中有很多不在主分支上的更改。 當我嘗試將change分支合並到main分支時,git會自動合並大量內容,並為其中添加項直接集成到現有html或javascript中的實例引發沖突。
我想要的是git在兩個分支之間存在差異的所有實例中引發合並沖突,因此我可以審核並批准所有添加。
我已經嘗試過“我們的”策略,但這只是進行了合並,使所有即將到來的更改都無法告訴我。
合並它們時,是否有辦法觸發兩個分支之間所有差異的合並沖突? 還是類似的功能,可以幫助以謹慎的方式合並這些分支? 我知道使用git diff,但我希望存在的東西更像是解決合並沖突時發生的事情。
我想要通過並批准所有增加的內容。
Git的自動合並功能可以為您省錢,但如果您不希望使用它,可以將其關閉並通過另一種方法來應用各個差異,
git merge --no-commit -s ours thatbranch
git checkout -p thatbranch -- .
這將提示您輸入當前的分支和內容之間的每一個差異thatbranch
,讓“批准每除了”你以后。 當合並結果看起來像您想要的方式時, git commit
。
合並它們時,是否有辦法觸發兩個分支之間所有差異的合並沖突?
否。問題實際上出在git read-tree
(以及git merge
使用的實現它的C代碼)中。 閱讀樹只是說:
--ours
)中的提交具有哈希H ours 。 在索引時隙3的提交(--theirs
)具有散列ħ 他們的 。
“完成”表示:丟棄暫存插槽1-3; 將所選的哈希ID寫入插槽0。
合並沖突僅在低級別合並聲明一個時發生。 您可以控制調用哪個程序(如果有的話)以執行低級合並,但不能控制前三個“ if”測試。
還是類似的功能,可以幫助以謹慎的方式合並這些分支?
最接近的方法是運行git merge --no-commit
,然后對於每個索引條目(使用git ls-files --stage
來獲取所有git ls-files --stage
,將暫存槽零中的哈希ID與目錄樹中的哈希ID相比較。合並基礎。 那是:
使用git merge-base --all
查找合並基礎提交哈希ID。 如果有兩個或更多,請停止並尋求幫助,因為現在問題很難解決。 否則,將此哈希ID保存為合並基礎哈希ID。 無論如何,您現在也可以獲取其他兩個哈希ID( git rev-parse HEAD
獲取我們的ID,以及git rev-parse merge-argument
獲取它們的ID)。
創建一個臨時索引,並使用git read-tree
從合並庫中的文件中填充它。 (如果可以簡化編碼器,則可以推遲此步驟。)
照常使用(沒有臨時索引) git merge
,但添加--no-commit
。 考慮檢查退出狀態,因為0表示“ Git認為一切都很好”,而非零表示“出問題了”(包括合並沖突),但是即使Git認為出了問題,您也可能希望繼續。
讀取結果索引(使用git ls-files --stage
)。 git merge
認為成功git merge
每個文件都在暫存插槽零中。 git merge
認為每個文件git merge
失敗的文件在插槽1、2和/或3中都有一個或多個條目。
讀取臨時索引(使用git ls-files --stage
並適當設置GIT_INDEX_FILE
環境變量)。 對於此索引中的所有文件,如果更新后的主索引中的對應文件位於插槽0中,但具有不同的哈希ID,則意味着Git從--ours
或--theirs
提交中--ours
了該文件。
對於Git認為已成功合並但與合並庫不匹配的文件,請使用git update-index --index-info
將合並庫,我們的文件及其文件放入插槽1、2和3,保留Git認為合並失敗的文件(或更新它們,但更新將是無操作)。 注意只有部分提交而不是全部3次提交的文件:它們的暫存槽應為零,以指示該版本中不存在該文件。
這里的重命名文件也存在一些問題。 如果Git認為它已成功合並並考慮了重命名,則該文件將以新名稱位於插槽0中。 合並基礎名稱將消失,並且此新名稱將不在合並基礎提交中。 您可以記下這一點,但是請注意,如果在--ours
或--theirs
添加了一個新文件,而不是在另一個提交中添加了該文件,則該文件也將位於插槽0中,而不是在--theirs
基站中。
不過,通常,以上六個步驟應該會產生所需的結果:成功合並的文件將被視為“沖突”,並且合並工具將看到所有三個輸入。 您不會在文件的工作樹副本中看到任何沖突標記 ,但是您會知道哪些文件是哪個文件,因為git status
會將它們稱為unmerged 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.