之前在公司都是做產品,只有一個 repo,不過現在不只維護一個專案。已經不是 git merge
,就可以搞定了。
前陣子為了要同步共用的 code 做 sync,研究了一下,有兩個指令可以做到這件事。
一個是 git cherry-pick
,另一個則是 git format-patch
。
我兩個都試過,但我實在覺得 cherry-pick 對於跨 repo 的指令太繁雜了,所以在這裡介紹 format-patch 的用法。
常用指令
產最後一個 commit 的 patch 出來
1 | git format-patch -1 |
0001-hide-some-menu-for-admin.patch
產指定的patch出來
1 | git format-patch -1 <sha> |
產最後三個 commit 的 patch 出來
1 | git format-patch -3 |
0001-fixed-reset-password.patch
0002-update-src-from-https.patch
0003-hide-some-menu-for-admin.patch
要記得這部分跟我們平常看 git log --oneline
順序不一樣,0001 是最舊的,0003 是最後一筆 commit。
接下來只有把 xxx.patch 檔,複製到你另一個 repo 的資料夾下。
一次匯入一個patch
1 | git am 0001-fixed-reset-password.patch |
一次匯入所有patch
1 | git am *.patch |
結論
由於自動產的 patch 檔名會帶 commit 內容,所以不像用 cherry-pick 用 sha 編號難以辨別,一個不專心就撿錯包了,我通常直接用 format-patch
幾筆一次拉出來,然後再看檔名,把不需要的 patch 砍掉方便又快速。
不過這時候就會對於那種 log 內只寫 0001_fix_bug.patch 的情況,非常感冒…,都不能理解 merge code 人的心酸。
補充
如果想嘗試 git cherry-pick 的話,要先把另一個 repo 加進去,然後做 git fetch other_repo,然後另一個repo東西,就會變成分支,然後你就可以用 cherry-pick 指令去撿了。