[Git] 常常出現 not something we can merge 錯誤訊息?
最近公司的 Jenkins 上,
常常出現 Git merge 的錯誤訊息,說 not something we can merge:
10:35:40 + GIT_COMMIT=8b9fb4c786d65a92c85069cbc87a985beb0ae2ed 10:35:40 + git merge 8b9fb4c786d65a92c85069cbc87a985beb0ae2ed 10:35:40 merge: 8b9fb4c786d65a92c85069cbc87a985beb0ae2ed - not something we can merge 10:35:40 Build step 'Execute shell' marked build as failure
不過這個錯誤在下一次的 Jenkins 任務通常就會消失,
很怪的是,看起來是在合併同一個 commit SHA1,
可是這次的失敗,下次的卻會成功…
上網找了一下 not something we can merge,
查到的可能性是 1) commit 拼錯、2) commit 在本地端找不到。
1) 的話不太可能,因為第二次合併就會成功。
2) 的話… 就有點奇怪,因為我們下的命令,
是先 git checkout dev,再 git pull,
所以理論上本地端應該要找的到 commit…
研究了很久,終於發現了問題點,
看看下面的 Jenkins 記錄:
- 10:32:16 執行 git checkout
- 10:32:16 執行 git pull
- 10:32:17 執行 git reset
- 10:32:17 執行 fgrep -R
- 10:33:14 執行 git ls-remote
- (中間省略)
- 10:35:40 執行 git merge
看出問題了嗎?
10:32:16 + git checkout -f dev 10:32:16 Previous HEAD position was a5083384 Merge branch 'dev' 10:32:16 Switched to branch 'dev' 10:32:16 Your branch is up to date with 'origin/dev'. 10:32:16 + git pull -p 10:32:17 Already up to date. 10:32:17 + git reset --hard origin/dev 10:32:17 HEAD is now at 8d2d715a Merge commit 'd16f8a1c80c54b5d4e26601fc93e258ac1455109' into dev 10:32:17 + GIT_LFS_POINTER_SIGNATURE='version https://git-lfs.github.com/spec' 10:32:17 + fgrep -R 'version https://git-lfs.github.com/spec' . 10:33:14 + git ls-remote ...... (省略) 10:35:40 + git merge 8b9fb4c786d65a92c85069cbc87a985beb0ae2ed 10:35:40 merge: 8b9fb4c786d65a92c85069cbc87a985beb0ae2ed - not something we can merge 10:35:40 Build step 'Execute shell' marked build as failure
沒錯,問題就在於 fgrep -R 跑了很久,
跑了幾乎一分鐘後,才跑到後面的 git ls-remote。
這個 fgrep -R 是我們用來找 Pull Request 裡面是不是有把 Git LFS 搞壞的東西,
因為它找整個專案的目錄,所以花了一分鐘的時間。
但是,這和合併時的 not something we can merge 的問題有什麼關聯呢?
仔細研究一下時間軸,
git pull 在拉到最新的 commit 之後,
有一分鐘的空檔時間在做 fgrep,可能有人在此時會發出新的 PR,
接著我們用 git ls-remote 找出所有的 PR,
後面再對這些 PR 做 git merge,
因此 git ls-remote 找出來的 PR,有可能是空檔中間產生出來的 PR,
而這 PR 在 git pull 時還不存在,因此沒有拉到本地端!
在了解這個問題的成因後,解法就很簡單了,
像我是將 git ls-remote 移到 git pull 之前,
確保這次看到的 PR 一定會被 git pull 拉到本地端,
至於 fgrep 期間跑出來的新 PR,
就等下次 Jenkins 定期任務觸發時再處理就行了~
這個難搞的 git merge 錯誤訊息,終於成功結案啦~^^
參考資料:branching and merging – How to resolve git’s “not something we can merge” error – Stack Overflow