簡體   English   中英

讓git為分支之間的差異引發合並沖突

[英]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代碼)中。 閱讀樹只是說:

  • 索引槽1(merge-base)中的提交具有哈希H base
  • 索引插槽2(-- --ours )中的提交具有哈希H ours
  • 在索引時隙3的提交(--theirs )具有散列ħ 他們的

    • 如果所有三個哈希都匹配,則使用任何副本,我們就完成了。
    • 如果H base = H 他們的 ,使用我們的副本H ours ,我們就完成了。
    • 如果H base = H ours ,請使用其副本H 他們的 ,我們就完成了。
    • 這三個都是不同的:執行低級合並。
  • “完成”表示:丟棄暫存插槽1-3; 將所選的哈希ID寫入插槽0。

合並沖突低級別合並聲明一個時發生。 您可以控制調用哪個程序(如果有的話)以執行低級合並,但不能控制前三個“ if”測試。

還是類似的功能,可以幫助以謹慎的方式合並這些分支?

最接近的方法是運行git merge --no-commit ,然后對於每個索引條目(使用git ls-files --stage來獲取所有git ls-files --stage ,將暫存槽零中的哈希ID與目錄樹中的哈希ID相比較。合並基礎。 那是:

  1. 使用git merge-base --all查找合並基礎提交哈希ID。 如果有兩個或更多,請停止並尋求幫助,因為現在問題很難解決。 否則,將此哈希ID保存為合並基礎哈希ID。 無論如何,您現在也可以獲取其他兩個哈希ID( git rev-parse HEAD獲取我們的ID,以及git rev-parse merge-argument獲取它們的ID)。

  2. 創建一個臨時索引,並使用git read-tree從合並庫中的文件中填充它。 (如果可以簡化編碼器,則可以推遲此步驟。)

  3. 照常使用(沒有臨時索引) git merge ,但添加--no-commit 考慮檢查退出狀態,因為0表示“ Git認為一切都很好”,而非零表示“出問題了”(包括合並沖突),但是即使Git認為出了問題,您也可能希望繼續。

  4. 讀取結果索引(使用git ls-files --stage )。 git merge認為成功git merge每個文件都在暫存插槽零中。 git merge認為每個文件git merge 失敗的文件在插槽1、2和/或3中都有一個或多個條目。

  5. 讀取臨時索引(使用git ls-files --stage並適當設置GIT_INDEX_FILE環境變量)。 對於此索引中的所有文件,如果更新后的主索引中的對應文件位於插槽0中,但具有不同的哈希ID,則意味着Git從--ours--theirs提交中--ours了該文件。

  6. 對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM