Git問題解決方案:不建議在沒有為偏離分支指定合並策略時執行pull操作(Pulling without specifying how to reconcile divergent branches)


1 問題背景
如果你也在使用2.27.0版本及以上的Git時,使用git pull命令出現以下的警告文案,可以查看本文章來解決此問題。

博主最近在Android Studio上使用git pull命令時,每次Android Studio都會彈出下述的警告文案:

warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the following commands sometime before your next pull:

git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only

You can replace "git config" with "git config --global" to set a default preference for all repositories. You can also pass --rebase, --no-rebase, or --ff-only on the command line to override the configured default per invocation.

該警告的中文版本文案描述如下:

warning: 不建議在沒有為偏離分支指定合並策略時執行pull操作。
您可以在執行下一次pull操作之前執行下面一條命令來抑制本消息:

git config pull.rebase false # 合並(缺省策略)
git config pull.rebase true # 變基
git config pull.ff only # 僅快進

您可以將 "git config" 替換為 "git config --global" 以便為所有倉庫設置
缺省的配置項。您也可以在每次執行 pull 命令時添加 --rebase、--no-rebase,
或者 --ff-only 參數覆蓋缺省設置。

當博主看到上述的警告信息后很懵,於是在百度和Google上都查詢了相關的問題解釋和解決方案,但都沒有詳細的論證證據和說服力,於是樓主自己前往了Git官方參考文檔中查詢了相關知識點,終於理清了這個問題,現在把問題產生的原因、解決方案分享給大家。

2 理解問題
2.1 理解問題的文案描述
我們在上述的警告文案描述中可以發現兩個重要的Git配置信息pull.rebase和pull.ff。

先來了解一下pull.ff。
在《Git官方文檔-參考-pull.ff》文章中可以查看到它的定義:

當把pull.ff設置為false時,這個變量告訴Git在這種情況下,如果執行不帶選項的git pull命令時先嘗試快進合並,如果不行再進行正常合並生成一個新的提交。

當把pull.ff設置為only時,只允許快進合並(相當於執行命令git pull --ff-only),如果執行不帶選項的git pull命令時,如果不能進行快進合並則終止當前操作。

如果將pull.ff設置為only,而執行不帶選項的git pull命令被終止,其實可以使用帶參數的git pull --no-ff或者git pull --rebase命令來執行pull操作。

接着在《Git官方文檔-參考-pull.base》文章中可查看pull.rebase的定義,但是官網的定義過於復雜,因此此處只解釋當選項pull.rebase的參數為true或者false時的定義:

當pull.rebase為true時,運行不帶選項的命令git pull相當於執行git pull --rebase。

當pull.rebase為false時,運行不帶選項的命令git pull不會被改變含義,即不會變基。如果想變基,需要在執行命令時顯式地加上選項--rebase,即git pull --rebase。

2.2 理解git pull命令的原理及其各選項的含義
2.2.1 git pull命令的原理
git fetch會查詢git remote中所有的遠程倉庫所包含分支的最新提交,並將其記錄到.git/FETCH_HEAD文件中。

.git/FETCH_HEAD是一個版本鏈接,指向着目前已經從遠程倉庫取下來的所有分支的最新提交。

git pull命令等價於:先執行git fetch,再執行git merge FETCH_HEAD將遠程倉庫對應分支的最新提交合並到當前本地分支中。

2.2.2 git pull命令中各選項的含義
其中git pull有這幾項常見的選項搭配:

不帶任何選項的git pull命令:先嘗試快進合並,如果不行再進行正常合並生成一個新的提交。
git pull --ff-only命令:只嘗試快進合並,如果不行則終止當前合並操作。
git pull --no-ff命令:禁止快進合並,即不管能不能快進合並,最后都會進行正常合並生成一個新的提交。
git pull --rebase命令:先嘗試快進合並,如果不行再進行變基合並。
2.3 理解git pull命令出現問題的原因
現在,看完上述的問題的文案描述、git pull命令的原理及其各選項的含義后,現在我們清楚為什么git pull命令出現該警告文案的原因了:

執行不帶任何選項的git pull命令時,會產生三種歧義: git pull --ff-only、git pull --no-ff、git pull --rebase,而這三種pull方式的合並策略差異很大,即對整個分布式項目的版本管理有很大的影響作用。

而我們執行不帶任何選項的git pull命令時,Git就不知道我們到底想用哪種合並策略來執行git pull,因此Git會給出上述的警告文案,建議我們通過git config命令指定不帶選項的git pull命令應該按照這三種合並策略的哪種來執行。

3 解決問題
現在我們再次回顧一下上述執行不帶選項的git pull命令提示的警告文案:

warning: 不建議在沒有為偏離分支指定合並策略時執行pull操作。
您可以在執行下一次pull操作之前執行下面一條命令來抑制本消息:

git config pull.rebase false # 合並(缺省策略)
git config pull.rebase true # 變基
git config pull.ff only # 僅快進

您可以將 "git config" 替換為 "git config --global" 以便為所有倉庫設置
缺省的配置項。您也可以在每次執行 pull 命令時添加 --rebase、--no-rebase,
或者 --ff-only 參數覆蓋缺省設置。

首先理解什么是偏離分支:

當本地的分支落后於遠程分支時,本地分支又自行修改項目文件生成了新的提交,這時本地分支再執行git pull命令就不能快進合並,並且還容易發生沖突。這時的本地分支便稱為偏離分支,因為這時的本地分支的最新提交跟遠程分支的最新提交不同,產生了偏離。

接着理解什么是合並策略:

合並策略便是 git merge --ff-only、git merge --no-ff、git merge --rebase這三種常見的合並策略,分別代表着快進合並、非快進普通合並、變基合並。

而我們執行不帶任何選項的git pull命令時,Git就不知道我們到底想用哪種合並策略來執行git pull,因此Git會給出上述的警告文案,建議我們通過git config命令應該按照這三種合並策略的哪種來執行。

通過上述的文章講解,現在我們理解了為什么理解git pull命令出現問題的原因,因此只要我們在Git中配置選項pull.rebase或pull.ff的參數即可。配置后,即便我們再執行不帶任何選項的git pull命令,也不會再出現上述的警告文案啦。

3.1 如何配置選項pull.rebase或pull.ff的參數
博主已經在本文的《2.1 理解問題的文案描述》章節中將選項pull.rebase和pull.ff的參數的所有情況進行了一一介紹,因此具體怎么配置按照你使用Git的個人喜好即可。

例如博主喜歡在git pull時只接受快進合並和變基合並,那么博主可以執行git config pull.ff only,保證每次執行不帶選項的git pull時要么快進合並成功,要么快進合並失敗。如果快進合並失敗,博主再顯式執行git pull --rebase進行變基合並即可。

3.1.1 選項pull.rebase或pull.ff各個參數的含義
《Git官方文檔-參考-pull.ff》文章中對選項pull.ff各個參數的定義:

當把pull.ff設置為false時,這個變量告訴Git在這種情況下,如果執行不帶選項的git pull命令時先嘗試快進合並,不行再創建一個合並后新的提交。

當把pull.ff設置為only時,只允許快進合並(相當於執行命令git pull --ff-only),如果執行不帶選項的git pull命令時,不能進行快進合並則終止當前操作。

如果將pull.ff設置為only,而執行不帶選項的git pull命令被終止,其實可以使用帶參數的git pull --no-ff或者git pull --rebase命令來執行pull操作。

《Git官方文檔-參考-pull.base》文章中pull.rebase的各個參數的定義:

當pull.rebase為true時,運行不帶選項的命令git pull相當於執行git pull --rebase。

當pull.rebase為false時,運行不帶選項的命令git pull不會被改變含義,即不會變基。如果想變基,需要在執行命令時顯式地加上選項--rebase,即git pull --rebase。

3.2 如何保持當前的默認合並策略並阻止彈出警告文案
如果你是一個Git小白,看完我上述的文章還是沒看懂什么意思,又希望你自己在執行git pull命令時,既保持當前的默認合並策略,保證不再出現配置合並策略的警告文案,那么你只需要執行git config pull.ff false即可,因為pull.ff默認是沒有指定的,而沒有指定的pull.ff的默認值與顯式指定為false的效果一致。因此當你顯式指定pull.ff后,既保持當前的默認合並策略,又能保證不再出現配置合並策略的警告文案。

另外,上述提到的默認策略便是不帶任何選項的git pull命令:先嘗試快進合並,如果不行再進行正常合並生成一個新的提交。

本文參考文獻:
Git warning: Pulling without specifying how to reconcile divergent branches is discouraged
Git官方文檔-參考-pull.ff
Git官方文檔-參考-pull.base
Git官方文檔-參考-git pull
CNBlogs文章《git fetch, git pull 以及 FETCH_HEAD》

 

轉自:https://blog.csdn.net/wq6ylg08/article/details/114106272


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM