itsPG.org

PG @ NCTU SenseLab

將github上的多筆commits合併成為一條commit

翻修github上的README.md的時候,每更改一次都是一條新的commit,多修改幾次之後master就拉出長長的一條線,感覺不是很必要,這邊教你怎樣將遠端多筆commits強制合併為一條

這個範例目前僅限於要合併的commits位於尾端,至於要怎樣整合中間的commits這個我現在git還不夠熟,不敢亂測…

Step 1

git branch squash 先開一個新的分支來儲存我們目前master所做的修改」

Step 2

git log 看一下log檔,找出想要倒回去的時間點,以這個例子來說是154b5d

commit 154b5d78bcbab2b4513ba02c0104cf45422d6c8a
Author: PG <smartPG@gmail.com>
Date:   Fri Dec 7 15:08:18 2012 -0800

    Initial commit

Step 3

git reset --hard 154b5d 強制reset

Step 4

git checkout squash checkout之前儲存的分支

Step 5

git rebase -i master 將目前的squash分支接到master上

Step 5-1

此時會叫出編輯器畫面顯示出squash分支與master領先的commits,讓你選擇如何合併commits,commits出現順序是從舊的到新的,也就是說最新的commit會出現在編輯器最下面

pick e5ca022 a
pick 1e4fcd3 b
pick 796bef9 c
pick 7897670 d
pick d0b99a9 e

將內容改成以下形式後,存檔離開

pick e5ca022 a
s 1e4fcd3 b
s 796bef9 c
s 7897670 d
pick d0b99a9 e

這代表我們要把commit b, c, d合併到commit a,完成合併之後僅會留下commit a與commit e

Step 5-2

接下來會出現若干次編輯器畫面,讓你輸入修改後的commit訊息

# This is a combination of 4 commits.
# The first commit's message is:


squash a~d test

# This is the 2nd commit message:



# This is the 3rd commit message:



# This is the 4th commit message:

這邊主要是讓你看一下你選擇合併的commit記錄,並輸入新的commit 訊息,所有#開頭的行並不會被算到commit訊息裡面

我輸入squash a~d test並刪除多餘的訊息,合併就完成了

Step 6

git checkout master 回到master分支

Step 7

git merge squash 合併squash分支

Step 8

git push --force origin master 強制更新遠端的master

Comments