標簽: git
緣由?
有一次被人問到怎么把一個分支的所有commit按一個commit合並到主分支上,當時一臉蒙B,平時開發都是直接merge,很少考慮到這種問題,於是特意搜索了相關資料。
場景
其實在開發中,我們永遠都是保留一個主master分支干靜,我們都是會重新拉一個dev分支做開發,遇到BUG就會拉BUG分支解決BUG,但是在分支上做開發和解決BUG不只會有一個提交,而合並到主干上也沒有必要讓別的開發看到冗余的commit信息,其實別的開發只要需要看到這個分支是解決了什么問題或者開發了什么任務即可。
按普通的提交流程是:
git checkout master //切換回主分支
git pull //拉取master代碼
git merge dev //如無沖突就已經合並成功如遇沖突就解決沖突再提交代碼
如果想合並分支commit到主分支可以按如下走法:
git checkout master //切換回主分支
git pull //拉取master代碼
git merge dev --squash //如遇沖突就解決沖突
git commit -m "這里是注釋"
原理就是--squash會把分支上的所有相對master分支的修改一次性推送到本地,這樣就可以解決在master上只會看到一個提交了。
方法2
另一種方法就是通過rebase來做合並commit再merge到master分支
1:假設當前在dev分支上,提交了二條commit修改,在dev分支上執行如下代碼
git rebase -i master
這時 git 會打開編輯器,你會看到 dev 分支上的 2 個最新 commit,以及一些指引提示
如下圖
每個 commit 前有一個操作命令,默認是 pick ,表示該行被選中,需要進行 rebase 操作。下面一堆注釋的指引中還有幾個指令,我們常用到的是以下 2 個
- squash:將這一行的 commit 與上一個 commit 進行合並
- fixup:與 squash 相同,只是不會保留這行 commit 的提交 message 信息
按如下圖保存后,dev 分支就只剩下 1 個 commit 了,這個合並后的 commit 提交的信息包含之前 2 個 commit 的信息
再切回master分支執行合並操作即可:
git checkout master
git merge dev
這樣就做到你一個commit提交到了主分支達到要求