git 的commit和push是頻繁與謹慎的統一
所謂頻繁,是指對於git commit的頻率定義應該是,在保證每次commit有意義的基礎上“最大限度”的頻繁。
所謂謹慎,是指在push之前壓縮那些臨時的或者無意義的commit,這要靠git 的rebase實現。
使用rebase實現commit壓縮
rebase(變基)主要用來整合來自不同分支的修改,與merge要達到的目的一樣。
它的原理是首先找到兩個分支 的最近共同祖先 ,然後對比當前分支相對於該祖先的歷次提交,提取相應的修改並存爲臨時文件, 然後將當前分支指向目標基底 , 最後以此將之前另存爲臨時文件的修改依序應用。
如果我們將rebase應用在同一分支的之前的某次commit,結果會怎麼樣?
通過以上原理我們可以看出,是的,在一個分支上用沒有任何變化,沒任何用。。。
也不盡然,我們使用交互模式執行rebase,通過簡單修改就可以實現commit的“合併”。
例子
比如,本地修改時做了若干次提交,很亂,如下,總共五次提交
$ git log --pretty=format:"hash: %h commit message: %s"
hash: 5460111 commit message: add s
hash: e48e8b5 commit message: 7
hash: f67f5c8 commit message: 6
hash: 7384f8b commit message: 2-5
hash: 3f13d3f commit message: 1
我們覺得中間提交沒啥意義,而且這幾快照不具有“分別的保存價值”,我們希望合成一個,那麼我們可以依次如下操作
- 執行交互的rebase操作
git rebase -i head~4
- 上述命令執行完成後,按照以下方法修改文件, squash 和 s都可以
From:
pick 7384f8b 2-5
pick f67f5c8 6
pick e48e8b5 7
pick 5460111 add s
To:
pick 7384f8b 2-5
s f67f5c8 6
squash e48e8b5 7
squash 5460111 add s
- 完成修改後保存並提交,這一步是生成壓縮後的提交的commit message,可以不修改,這樣就是羅列這幾次壓縮的messge,也可以按照下邊的方法修改
From:
\# This is a combination of 4 commits.
\# This is the 1st commit message:
2-5
\# This is the commit message #2:
6
\# This is the commit message #3:
7
\# This is the commit message #4:
add s
To:
\# This is a combination of 4 commits.
\# This is the 1st commit message:
change trace log level
到此已經完成commit壓縮的工作,可以push到服務器了,push之前可以log查看一下。
$ git log --pretty=format:"hash: %h commit message: %s"
hash: 4d1f3e2 commit message: change trace log level
hash: 3f13d3f commit message: 1