之前寫了一篇《如何選擇版本控制系統 ---為什麼選擇git版本控制系統》,位址是:有興趣的可以去看看,本篇文章算是這個系列的第二篇文章。
git誕生於2023年,由linux之父linus torvalds和他的團隊開發並不斷完善,它秉承了linux的開源精神,為廣大研發團隊帶來了非常棒的版本控制體驗。本文立足git的工作原理,深入**各種研發場景中工作流等問題。
git工作模式
**提交過程
一次修改被成功提交到遠端倉庫會歷經四個階段,1本地工作區->2快取區->3版本庫->4遠端版本庫,通過執行相應的git命令,檔案在這四個區域跳轉,並呈現不同的狀態:
1.已修改(modified):包括三種檔案,新增檔案,被修改的檔案,被刪除的檔案
2.已暫存(staged):對已修改的檔案執行git add或git rm操作,檔案就變成已暫存狀態,進入暫存區。暫存區實際上就是乙個檔案索引目錄樹,記錄了所有檔名、檔案狀態資訊,它已索引的方式建立了檔名和檔案內容(在物件庫.git/objects中儲存)的對應關係。
3.已提交(committed):對已暫存的檔案執行git commit操作,檔案就變成已提交狀態,進入本地版本倉庫。
4.已上傳:對已提交的檔案執行git push操作,檔案就變成已上傳狀態,進入遠端版本倉庫。
git如何記錄每次提交
我們思考一下,版本控制系統應該如何記錄每次提交呢?正常的思維肯定是記錄「差異」(delta),也就是前後兩個版本中檔案內容的不同,確實大多數版本控制系統是這麼做的,比如我們所熟悉的cvs,svn。但是,git卻不這樣!每次提交更新時,git會對全部檔案作乙個快照(snapshot),並儲存指向這次快照的索引。
這種儲存方式帶來很多好處,切換版本時,直接引用指向目標版本的索引即可,不需要像差異儲存那樣,需要版本之間的merge,速度會快很多,更重要的是,為後文所講到的輕量級分支切換提供了前提條件。
git分支
git新建分支的本質就是建立乙個指向最後一次提交的可變指標,所以,git分支的建立不是複製版本庫的內容,僅僅是新建了乙個指標,它以40個字元長度sha-1字串形式儲存在檔案中,這難以想象的輕量級就是源於「快照」儲存的版本設計理念。
git工作流
什麼是git工作流?你可以理解為**管理的分支策略。這裡從典型的gitflow工作流出發,配合我正在使用的**託管平台(華為軟體開發雲),給大家詳細講解工作流是如何服務於專案流程管理和團隊協同開發。
ømaster:主線分支,版本有較強穩定性,供生產環境部署使用,這個分支只能從其它分支合併,不能在這個分支上直接提交修改。
新建分支:
在開發雲介面輸入新分支名,並選擇從哪個分支檢出即可。
ørelease:發布分支,發布新版本時,基於develop分支建立,發布完成後,合併到master和develop分支。
各個分支之間的關係可以從開發雲的「倉庫網路」中檢視:
優點:專案管理流程明確
分支合併
無論哪種工作流都會涉及到分支合併(把乙個分支中的修改整合到當前分支),主要有兩種方法:三方合併(merge)和衍合(rebase)。我們通過對同一種場景進行不同操作體會兩種合併方法的區別。
場景:master分支新增了c4節點,hotfix分支新增了c3節點,現將hotfix分支合併到master分支:
1.三方包括hotfix新增節點c3,master新增節點c4,以及兩者的共同祖先節點c2。這種合併操作簡單,但新增合併節點c5,形成了環形,版本記錄可讀性差。
a)pc端命令操作方式:
#git checkout master
#git merge hotfix
b)開發雲平台頁面操作:
第一步:
第二步:
2.衍合先將master分支新增節點c4以補丁形式儲存在.git/rebase目錄中,然後同步hotfix分支最新**,再應用補丁c4』。
#git checkout master
#git rebase hotfix
衝突解決
型別一:兩個合併分支修改了同一行**
解決方法:
1.分析哪種修改方法正確,手動合併;
2.提交修改。
型別二:檔案被重新命名為不同的名字
解決方法:
1.確認哪個名字是正確的,刪除錯誤的;
2.提交修改。
結語
版本控制系統
linux一直痛恨的cvs及svn都是集中式的版本控制系統,而git是分布式版本控制系統,集中式和分布式版本控制系統有什麼區別呢?1 集中式版本控制系統 代表 svn cvs 版本庫是集中存放在 伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從 伺服器取得最新的版本,然後開始幹活,幹完活了,再...
版本控制系統
github是全球最大的開源專案託管平台,這個平台在技術領域也非常有影響力,託管必然離不開版本控制,下面就介紹一下版本控制系統。q1 什麼是版本控制系統?a 版本控制系統的英文名叫做vcs version control system 版本控制系統是以記錄目錄或檔案的改變為基礎的。試想一下,如果沒有...
git版本控制系統
總結 1.初始化乙個git倉庫,使用 git init 命令 2.新增檔案到git倉庫分兩步 第一步,使用命令 git add file 注意,可反覆多次使用,新增多個檔案 第二步,使用命令 git commit 完成小結 1 head 指向的是當前版本,因此可以使用 git reset hard ...