The Issue of the Day Before

git pull 的警告訊息

git -

使用 git 2.27.0 或更高版本時, git pull 出現警告,可使用 git config pull.rebase false 除去。

但依狀況我更建議用 git config pull.ff only

Why

使用 git 2.27.0 以上版本時, git pull 命令會出現下列警告,

hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint:
hint:   git config pull.rebase false  # merge (the default strategy)
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.

What

rebase

會在本地和遠程維護一個分支,如果兩者沒衝突則會直接接在後面不會產生新的 commit

git rebase before flow
Figure 1. before
git rebase after flow
Figure 2. after

而在一般情況下會是,下面這樣的

git merge flow
Figure 3. merge
fast-forward

快進模式,如果源頭沒有變動也沒有衝突則 commit 會直接接在後面不會產生新的 commit

git ff before flow
Figure 4. before
git ff after flow
Figure 5. after

How

這是在 Git 2.27 後中增加的。

主要是希望在進行拉取時指示如何處理,有三個建議: 你可以將 git config 改為 git config --global 作為所有存儲庫的默認。

git config pull.rebase false # 合併(默認策略) // (1)
git config pull.rebase true # rebase // (2)
git config pull.ff only # fast-forward only // (3)
  1. 這會跟之前一樣並消除警告。

  2. 等同 git pull --rebase

  3. 只有在本地分支可以快進時才執行拉取。如果有衝突會直接中止並顯示錯誤消息(不會創建任何提交)。

這實際上是在遠程分支之上提交,在本地和遠程維護一個分支(與涉及兩個不同分支的默認行為不同 - 一個在本地,另一個在遠程 - 並且,為了將兩者結合起來,執行合併)。

上面的命令都能抑制警告,但作用不同。

若實際上,有不同的需求則可直接使用參數來取代 config 的設定。

若設定為 git config pull.ff only 而在需要用到 rebase false 可以使用 git pull --no-ff;需要用到 rebase true 可以使用 git pull --rebase

Git 2.29 或更高版本,也可以設置 pull.ff [false|true|only]

  • git config pull.ff true 默認。如果可能,拉取快進,否則合併。

  • git config pull.ff false 拉取永遠不會快進,並且總是會創建合併。

  • git config pull.ff only 如果可能,拉取快進,否則中止並顯示錯誤消息。

閱讀在雲端