我習慣開發分支合併到主分支前先做 Rebase 再合併 (延伸閱讀:直接合併 vs 先 Rebase 再合併)。舉例來說,假設我從 master 開了 featureX 分支開發,現在要合併回 master:

我會先從 featureX 分支 git rebase master 將 featureX 分支接到 master 後面:

一般來說,合併的標準做法是先 checkout 到要併入的目標分支,再下指令 merge。因此,我會切回 master,再下指令 git merge featureX:

git checkout master
git merge featureX

如上圖所示,切換 master 再合併 featureX 雖屬快轉合併(Fast-Forward,分支移到新的 Commit 位置即可,不產生合併線),但檔案狀態會先從 featureX 還原到 master 狀態(在本例是移除 featureX 新增的 c1.txt 及 c2.txt 兩個檔案),合併時再把 c1.txt 及 c2.txt 加回去。

有沒有可能省掉這段無意義的「刪掉檔案再加回去」程序?

由前幾天分享 開發分支快速 Rebase 主分支技巧,從讀者 Peter Dave Hello 及馬楊陞的留言,我學到新技巧(特此感謝)。原來,fetch 指令除了取回遠端內容,還有更新分支的功能,其語法為:(<src>:<dst> 是所謂 refspec,想像成將 repository 的 src 更新到本地的 dst)

git fetch <repository> <src>:<dst>

例如:git fetch orign master:master 即是取回遠端 origin/master 更新到本機 master,可省下 pull 或 merge 動作。而這組指令,也能實現我們想到的「本機不切換分支直接合併」。以上述案例,用 . 當成 repository,使用指令 git fetch . featureX:master 便能在不 Checkout 切換到 master 的狀況下抓取 featureX 的內容更新到 master,達到 master 合併 featureX 的相同結果,但省掉切換 master 刪除檔案,merge 時再還原的過程,快速又方便。

不過,這招只適用快轉(Fast-Forward)模式的合併,如果不是,會被狠狠拒絕。(因此,上回提過的 git branch --force 雖然也能實現相同效果,但操作失誤風險高,用 fetch 較讓人放心)

學會這招,未來應該靠它省下不少無謂的 checkout + merge 檔案異動,讚!!

Tips of how to merge a branch without checkout it first.


Comments

# by 匿名

感謝黑大分享 文中有筆誤的地方,git fetch . featureX/master 這指令的 / 應該為 : ,看 terminal 上的指令是正確的。

# by Jeffrey

to 匿名,感謝。 沒寫幾個錯字,我都不知道怎麼寫文章了呢?(鳴鳴鳴...)

# by 小麥

這篇讚 我在 feature 分支時,有時會需要更新 develop 分支的進度 之前我會先 checkout 回 develop 分支、git pull 再 checkout 回 feature 分支、pull rebase develop 現在我用 `git fetch origin develop:develop` 直接更新 develop 分支進度 然後 feature 分支可以直接 pull rebase develop 更新進度 這樣就省了兩個指令~

Post a comment