Git Rebase原理以及黃金準則詳解

2021-09-19 04:44:38 字數 2262 閱讀 2220

本文主要講解下git rebase的基本概念用法、其內部原理以及我們在真實專案中使用git rebase應該遵循的原則以及為啥需要遵循這些原則。

相信對於rebase肯定不會陌生,就好像上圖描述的過程一樣,當你使用rebase命令的時候,即好像將你需要去rebase的分支拔下來然後重新插到另乙個分支上。官方對於rebase的描述為:

「git-rebase: forward-port local commits to the updated upstream head」— git doc
基於以上表述,我們可以得出以下相對更準確的git rebase的工作流程:

從上圖可以看出,在對特徵分支進行rebase之後,其等效於建立了新的提交。並且老的提交也沒有被銷毀,只是簡單地不能再被訪問或者使用。在對於分支的章節我們曾經提及,乙個分支只是乙個執行提交的指標。因此如果既沒有分支或者tag指向某個提交,該提交將無法再被訪問使用,但是該提交會一直存在於你的檔案系統中,占用著你的磁碟儲存。

「no one shall rebase a shared branch」 — everyone about rebase

估計你也肯定看過這個原則,不過可能表述不一樣罷了。本章節就是用例項的角度來**下,為啥不能再乙個共享的分支上進行git rebase操作。所謂共享的分支,即是指那些存在於遠端並且允許團隊中的其他人進行pull操作的分支。假設現在bob和anna在同乙個專案組中工作,專案所屬的倉庫和分支大概是下圖這樣:

現在bob為了圖一時方便打破了原則,正巧這時anna在特徵分支上進行了新的提交,此時的結構圖大概是這樣的:

當bob打算推送自己的分支到遠端的時候,它收到了如下的警告:

git嘗試著使用fast-forward來合併你的分支,具體的細節我們會在其他部落格中進行討論,這邊只需要明白遠端的git server被bob搞得一頭霧水,不知道應該如何去合併。此時bob為了推送他的本地的提交,只能選擇強行合併,即告訴遠端:不要再嘗試著合併我推送給你的和你已經有點提交,一切按照我推送過去的來。那麼git會進行如下操作:

在進行pull操作之後,git會進行自動地合併操作,結果大概是這樣的:

這個第m個提交即代表著合併的提交,也就是anna本地的分支與github上的特徵分支最終合併的點,現在anna解決了所有的合併衝突並且可以push她的**,在bob進行pull之後,每個人的git commit結構為:

到這裡,看到上面這個混亂的流線圖,相信你對於rebase和所謂的**準則也有了更形象深入的理解。這還只是僅有兩個人,乙個特徵分支的專案因為誤用rebase產生的後果。如果你團隊中的每個人都對公共分支進行rebase操作,那還不得一團亂麻。另外,相信你也注意到,在遠端的倉庫中存有大量的重複的commit資訊,這會大大浪費我們的儲存空間。如果你還覺得這麼什麼,那我們來假設下還有一哥們emma,第三個開發人員,在他進行了本地commit並且push到遠端之後,倉庫變為了:

TCP IP以及socket原理

tcp ip協議族,tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,但實際上tcp ip協議是指網際網...

Token原理以及應用

近期由於專案需要開發供第三方使用的api,在整個架構設計的乙個環節中,對api訪問需要進行認證,在這裡我選擇了token認證。在客戶端儲存的tokens是無狀態的,並且能夠被擴充套件。基於這種無狀態和不儲存session資訊,負載負載均衡器能夠將使用者資訊從乙個服 務 傳到其他伺服器上。如果我們將已...

Token原理以及應用

近期由於專案需要開發供第三方使用的api,在整個架構設計的乙個環節中,對api訪問需要進行認證,在這裡我選擇了token認證。在客戶端儲存的tokens是無狀態的,並且能夠被擴充套件。基於這種無狀態和不儲存session資訊,負載負載均衡器能夠將使用者資訊從乙個服 務 傳到其他伺服器上。如果我們將已...