簡體   English   中英

設置默認差異算法不會轉換為默認合並算法(耐心)

[英]Setting default diff algorithm does not translate to default merge algorithm (patience)

我看過很多博客文章和堆棧溢出文章說git config --global diff.algorithm patience將允許差異和合並使用帶有默認遞歸算法的耐心策略選項。

我發現情況並非如此,我擺出以下演示來說明原因。

git config --global diff.algorithm patience   //mythical config statement  

git clone https://github.com/kjlubick/PracticingGit.git
cd PracticingGit
git checkout origin/patience-merge-1 -t

git checkout -b merge_test           //temp branch for merging
git diff origin/patience-merge-2

圖片 這個差異(圖片由meld 提供看起來很不錯。讓我們嘗試合並它。

git merge origin/patience-merge-2

圖片

嗯? 那個合並看起來很丑。 盡管第 9-19 行實際上沒有改變,但它們被標記為沖突/改變的方式與差異完全不同。

如果我們強制合並使用耐心策略選項:

git merge --abort
git merge origin/patience-merge-2 -X patience

圖片

這樣好多了。 沖突與我們之前所做的差異匹配並且在語義上是正確的。

我怎樣才能讓合並真正使用耐心設置,而不僅僅是差異?

我在黑暗中嘗試的其他鏡頭(未成功):

git config --global merge.algorithm patience
git config --global merge.diff.algorithm patience

系統信息:
視窗 8.1
git 版本 1.8.4.msysgit.0(通過 GitHub for Windows 2.0)

修補 git,如 Appleman1234 並不理想。 我希望這個功能在未來的版本中出現。

現在,我想我必須適應別名

git config --global alias.pmerge "merge -X patience --"

這讓我可以做

git pmerge origin/patience-merge-2

代替

git merge origin/patience-merge-2 -X patience

在我之前給出的例子中。

有一個特定於分支的合並選項的配置項

git config branch.master.mergeoptions "-X patience"

但不是全局默認設置。

一種方法是修補 git 以添加您要求的功能。

一個未經測試、未編譯的builtin/merge.c補丁示例

diff -Nar merge.c merge.c-new 
77c77
< static const char *pull_twohead, *pull_octopus;
---
> static const char *pull_twohead, *pull_octopus,*diff_algorithm;
586a587,588
>       else if (!strcmp(k, "diff.algorithm"))
>               return git_config_string(&diff_algorithm, k, v);
1305a1308,1311
>               int diff_algorithm_mask = 0;
>               if (diff_algorithm != null){
>                       diff_algorithm_mask = parse_algorithm_value(diff_algorithm);
>               }
1308a1315,1317
>                       if (diff_algorithm != null){
>                               add_strategies(diff_algorithm,diff_algorithm_mask);
>                       }
1310a1320,1322
>                       if (diff_algorithm != null){
>                               add_strategies(diff_algorithm,diff_algorithm_mask);
>                       }

請注意,我相信如果將這樣的補丁包含在 git 中,可能需要進行額外的工作來添加啟用和禁用此行為的配置值,因為文檔明確指出更改該值只會更改差異算法。 另一種方法是添加一個配置變量merge.algorithm,如果未設置,則讓它執行默認邏輯,如果設置,則執行merge.algorithm 中的算法。

另一種不需要更改代碼的替代方法是 shell 別名 git 命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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