新聞中心
讓大家覺得你一次就能寫出完美的代碼,并讓你的補(bǔ)丁更容易審核和合并。
成都創(chuàng)新互聯(lián)公司長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平定企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),平定網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
軟件開發(fā)是混亂的。有很多錯(cuò)誤的轉(zhuǎn)折、有需要修復(fù)的錯(cuò)別字、有需要修正的錯(cuò)誤、有需要稍后糾正的臨時(shí)和粗陋的代碼,還有在以后的開發(fā)過程中發(fā)現(xiàn)一次又一次的問題。有了版本控制,在創(chuàng)建“完美”的最終產(chǎn)品(即準(zhǔn)備提交給上游的補(bǔ)?。┑倪^程中,你會(huì)有一個(gè)記錄著每一個(gè)錯(cuò)誤轉(zhuǎn)折和修正的原始記錄。就像電影中的花絮一樣,它們會(huì)讓人有點(diǎn)尷尬,有時(shí)也會(huì)讓人覺得好笑。
如果你使用版本控制來定期保存你的工作線索,然后當(dāng)你準(zhǔn)備提交審核的東西時(shí),又可以隱藏所有這些私人草稿工作,并只提交一份單一的、完美的補(bǔ)丁,那不是很好嗎?git rebase -i,是重寫歷史記錄的完美方法,可以讓大家覺得你一次就寫出了完美的代碼!
git rebase 的作用是什么?
如果你不熟悉 Git 的復(fù)雜性,這里簡單介紹一下。在幕后,Git 將項(xiàng)目的不同版本與唯一標(biāo)識(shí)符關(guān)聯(lián)起來,這個(gè)標(biāo)識(shí)符由父節(jié)點(diǎn)的唯一標(biāo)識(shí)符的哈希以及新版本與其父節(jié)點(diǎn)的差異組成。這樣就形成了一棵修訂樹,每個(gè)簽出項(xiàng)目的人都會(huì)得到自己的副本。不同的人可以把項(xiàng)目往不同的方向發(fā)展,每個(gè)方向都可能從不同的分支點(diǎn)開始。
左邊是 origin 版本庫中的主分支,右邊是你個(gè)人副本中的私有分支。
有兩種方法可以將你的工作與原始版本庫中的主分支整合起來:一種是使用合并:git merge,另一種是使用變基:git rebase。它們的工作方式非常不同。
當(dāng)你使用 git merge 時(shí),會(huì)在主分支(master)上創(chuàng)建一個(gè)新的提交,其中包括所有來自原始位置(origin)的修改和所有本地的修改。如果有任何沖突(例如,如果別人修改了你也在修改的文件),則將這些沖突標(biāo)記出來,并且你有機(jī)會(huì)在將這個(gè)“合并提交”提交到本地版本庫之前解決這些沖突。當(dāng)你將更改推送回父版本庫時(shí),所有的本地工作都會(huì)以分支的形式出現(xiàn)在 Git 版本庫的其他用戶面前。
但是 git rebase 的工作方式不同。它會(huì)回滾你的提交,并從主分支(master)的頂端再次重放這些提交。這導(dǎo)致了兩個(gè)主要的變化。首先,由于你的提交現(xiàn)在從一個(gè)不同的父節(jié)點(diǎn)分支出來,它們的哈希值會(huì)被重新計(jì)算,并且任何克隆了你的版本庫的人都可能得到該版本庫的一個(gè)殘破副本。第二,你沒有“合并提交”,所以在將更改重放到主分支上時(shí)會(huì)識(shí)別出任何合并沖突,因此,你需要在進(jìn)行變基rebase之前先修復(fù)它們?,F(xiàn)在,當(dāng)你現(xiàn)在推送你的修改時(shí),你的工作不會(huì)出現(xiàn)在分支上,并且看起來像是你是在主分支的最新的提交上寫入了所有的修改。
合并提交(左)保留了歷史,而變基(右)重寫歷史。
然而,這兩種方式都有一個(gè)缺點(diǎn):在你準(zhǔn)備好分享代碼之前,每個(gè)人都可以看到你在本地處理問題時(shí)的所有涂鴉和編輯。這就是 git rebase 的 --interactive(或簡寫 -i)標(biāo)志發(fā)揮作用的地方。
git rebase -i 登場
git rebase 的最大優(yōu)點(diǎn)是它可以重寫歷史。但是,為什么僅止于假裝你從后面的點(diǎn)分支出來呢?有一種更進(jìn)一步方法可以重寫你是如何準(zhǔn)備就緒這些代碼的:git rebase -i,即交互式的 git rebase。
這個(gè)功能就是 Git 中的 “魔術(shù)時(shí)光機(jī)” 功能。這個(gè)標(biāo)志允許你在做變基時(shí)對(duì)修訂歷史記錄進(jìn)行復(fù)雜的修改。你可以隱藏你的錯(cuò)誤! 將許多小的修改合并到一個(gè)嶄新的功能補(bǔ)丁中! 重新排列修改歷史記錄中的顯示順序!
output of git rebase -i
當(dāng)你運(yùn)行 git rebase -i 時(shí),你會(huì)進(jìn)入一個(gè)編輯器會(huì)話,其中列出了所有正在被變基的提交,以及可以對(duì)其執(zhí)行的操作的多個(gè)選項(xiàng)。默認(rèn)的選擇是選擇(Pick)。
Pick:會(huì)在你的歷史記錄中保留該提交。Reword:允許你修改提交信息,可能是修復(fù)一個(gè)錯(cuò)別字或添加其它注釋。Edit:允許你在重放分支的過程中對(duì)提交進(jìn)行修改。Squash:可以將多個(gè)提交合并為一個(gè)。- 你可以通過在文件中移動(dòng)來重新排序提交。
當(dāng)你完成后,只需保存最終結(jié)果,變基操作就會(huì)執(zhí)行。在你選擇修改提交的每個(gè)階段(無論是用 reword、edit、squash 還是發(fā)生沖突時(shí)),變基都會(huì)停止,并允許你在繼續(xù)提交之前進(jìn)行適當(dāng)?shù)男薷摹?/p>
上面這個(gè)例子的結(jié)果是 “One-liner bug fix” 和 “Integate new header everywhere” 被合并到一個(gè)提交中,而 “New header for docs website” 和 “D'oh - typo. Fixed” 合并到另一個(gè)提交中。就像變魔術(shù)一樣,其他提交的工作還在你的分支中,但相關(guān)的提交已經(jīng)從你的歷史記錄中消失了!
這使得使用 git send-email 或者用你新整理好的補(bǔ)丁集在父版本庫中創(chuàng)建一個(gè)拉取請(qǐng)求,然后來提交一個(gè)干凈的補(bǔ)丁給上游項(xiàng)目變得很容易。這有很多好處,包括讓你的代碼更容易審核,更容易接受,也更容易合并。
當(dāng)前題目:使用gitrebase-i來修改你的Git提交歷史
標(biāo)題來源:http://m.5511xx.com/article/dpgcjeg.html


咨詢
建站咨詢

