要想使git產(chǎn)生整潔的提交歷史有以下幾種方法:
- 在你commit之前,先拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼丢习,然后再commit你自己的代碼顶掉,最后推送到遠(yuǎn)程倉(cāng)庫(kù)。
-
如果你沒(méi)有創(chuàng)建自己的新分支墩剖,即在跟遠(yuǎn)程倉(cāng)庫(kù)相同的分支上做改動(dòng)猴凹,并且commit了,那么當(dāng)你從遠(yuǎn)程倉(cāng)庫(kù)拉取代碼時(shí)岭皂,可以使用SourceTree的衍合(rebase)選項(xiàng)郊霎。
9.png - 如果你在本地創(chuàng)建了自己的新分支,做了改動(dòng)爷绘,并且commit了书劝,可以使用衍合(rebase)。假設(shè)遠(yuǎn)程倉(cāng)庫(kù)的分支是
master
土至,你在本地又開(kāi)了個(gè)新分支experiment
购对,并在這個(gè)分支上做改動(dòng),commit改動(dòng)陶因÷獍可以運(yùn)行下面的命令。
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
$ git checkout master
$ git merge experiment
通過(guò)以上幾種方法楷扬,可以使你提交的代碼歷史記錄是一條線性且沒(méi)有分叉的直線解幽。
不過(guò)也要注意下衍合的風(fēng)險(xiǎn)。
一旦分支中的提交對(duì)象發(fā)布到公共倉(cāng)庫(kù)毅否,就千萬(wàn)不要對(duì)該分支進(jìn)行衍合操作亚铁。
如果你遵循這條金科玉律,就不會(huì)出差錯(cuò)螟加。否則徘溢,人民群眾會(huì)仇恨你吞琐,你的朋友和家人也會(huì)嘲笑你,唾棄你然爆。
下面是我做的一些試驗(yàn)站粟。如果你理解git的合并(merge)和衍合(rebase),下面的試驗(yàn)就不用看了曾雕,我是之前不太理解這些概念奴烙,動(dòng)手做了一下,才理解了一些的剖张。
把遠(yuǎn)程倉(cāng)庫(kù)的項(xiàng)目拷貝到不同的目錄(A和B)切诀,來(lái)模擬兩個(gè)程序員對(duì)代碼的改動(dòng)。
- B做改動(dòng)搔弄,推送到遠(yuǎn)程倉(cāng)庫(kù)幅虑;然后,A做改動(dòng)顾犹,commit倒庵,然后從遠(yuǎn)程倉(cāng)庫(kù)拉取,推送到遠(yuǎn)程倉(cāng)庫(kù)。(這次有分叉)
1.png
- B做改動(dòng)炫刷,推送到遠(yuǎn)程倉(cāng)庫(kù)擎宝;然后,A做改動(dòng), 從遠(yuǎn)程倉(cāng)庫(kù)拉取浑玛,然后commit绍申,推送到遠(yuǎn)程倉(cāng)庫(kù)。(這次是直線的)
2.png
- B做改動(dòng)锄奢,推送到遠(yuǎn)程倉(cāng)庫(kù)失晴;然后,A做改動(dòng)拘央,commit涂屁,然后從遠(yuǎn)程倉(cāng)庫(kù)拉取。在master分支上做
git rebase master
灰伟,推送到遠(yuǎn)程倉(cāng)庫(kù)拆又。(這次有分叉)
3.png
- B做改動(dòng),推送到遠(yuǎn)程倉(cāng)庫(kù)栏账;然后帖族,在A的test0分支做改動(dòng),commit挡爵, A的master分支從遠(yuǎn)程倉(cāng)庫(kù)拉取竖般,在A的test0分支執(zhí)行
git rebase master
;再在A的master分支執(zhí)行git rebase test0
。推送到遠(yuǎn)程倉(cāng)庫(kù)茶鹃。(這次是直線的)
4.png
5.png
- B做改動(dòng)涣雕,推送到遠(yuǎn)程倉(cāng)庫(kù)艰亮;然后,在A的test0分支做改動(dòng)挣郭,commit迄埃, A的master分支從遠(yuǎn)程倉(cāng)庫(kù)拉取,A合并test0分支兑障。推送到遠(yuǎn)程倉(cāng)庫(kù)侄非。(這次有分叉)
6.png
- B做改動(dòng),推送到遠(yuǎn)程倉(cāng)庫(kù)流译;然后逞怨,在A的test0分支做改動(dòng),commit福澡, A的master分支從遠(yuǎn)程倉(cāng)庫(kù)拉取骇钦,在A的master分支執(zhí)行
git rebase test0
。推送到遠(yuǎn)程倉(cāng)庫(kù)竞漾。(這次情況有點(diǎn)復(fù)雜)
7.png
- B做改動(dòng),推送到遠(yuǎn)程倉(cāng)庫(kù)窥翩;然后业岁,在A的test0分支做改動(dòng),commit寇蚊, A的master分支從遠(yuǎn)程倉(cāng)庫(kù)拉取笔时,在A的test0分支執(zhí)行
git rebase master
;再在A的master分支執(zhí)行git rebase test0
。推送到遠(yuǎn)程倉(cāng)庫(kù)仗岸。(這次是直線的, 跟上面某一步是完全一樣的允耿,只不過(guò)是在之前所有的操作基礎(chǔ)上做的)
8.png
- B做改動(dòng),推送到遠(yuǎn)程倉(cāng)庫(kù)扒怖;然后较锡,A做改動(dòng),commit盗痒,然后從遠(yuǎn)程倉(cāng)庫(kù)拉取時(shí)用sourceTree的rebase選項(xiàng),推送到遠(yuǎn)程倉(cāng)庫(kù)蚂蕴。(這次是直線的)
9.png
10.png
- A做改動(dòng),commit;B做改動(dòng)俯邓,推送到遠(yuǎn)程倉(cāng)庫(kù)骡楼;然后,A從遠(yuǎn)程倉(cāng)庫(kù)拉取時(shí)用sourceTree的rebase選項(xiàng),推送到遠(yuǎn)程倉(cāng)庫(kù)稽鞭。(這次是直線的)
11.png
參考:
- Git 分支 - 分支的衍合
-
git-Merge-Rebase
這個(gè)是我自己建的博客鸟整,不過(guò)因?yàn)椴欢岸耍?yè)面不好看朦蕴,以后博客就寫在簡(jiǎn)書(shū)了篮条。