本篇星爪,我們說說分支,分支可是個好東西
小王正在開發(fā) 功能1曾掂,然后開發(fā) 功能 6惫谤,開發(fā)了一部分,然后測試反饋 功能 1 有問題啊珠洗,小王要 fix 功能1溜歪,可 feature6 還沒完呢,完了運行不起來……
先把代碼注釋掉许蓖?注釋后蝴猪,再修改富岳,影響到了本來的功能怎么辦?一點都不智能拯腮,在 Git 版本管理中窖式,分支(branch)就可以完美解決這個困擾。
分支是什么动壤?
其實每次提交萝喘,Git 都會把它們串成一條時間線,到目前為止琼懊,只有一條時間線阁簸,在 Git 里這條線就是主分支,也就是 master 分支哼丈。
用分支來處理上述情境會是怎樣呢
- Step 1:在開發(fā)新功能之前先創(chuàng)建一個分支启妹,比如就叫 feat_6,用來開發(fā) 功能 6
- Step 2:在 feat_6 分支開發(fā) 新功能
- Step 3:測試說 功能 1 有個 bug醉旦,那么可以先把開發(fā)的功能提交到 feat_6 上
- Setp 4:切換分支到 主分支(有 功能 1 的分支)饶米,修復(fù) bug 并提交
- Step 5:提交完成后,可以回到 feat_6 繼續(xù)開發(fā)新功能
分支的創(chuàng)建與切換
新建并切換车胡, 使用git checkout -b <new_branch>
Step 1: 假設(shè)當(dāng)前 master 指向 C2 (最新一次 commit )檬输,現(xiàn)在在 C2 這個節(jié)點創(chuàng)建一個新分支 feat_6 并切換,那么新的分支也會指向 C2
創(chuàng)建 feat_6 分支并切換 git checkout -b feat_6
可以看到當(dāng)前的分支已經(jīng)從 master 切換到了 feat_6 (工作區(qū)間地址后面藍(lán)色字標(biāo)識的就是當(dāng)前分支)
此時 master 和 feat_6 兩個分支的內(nèi)容完全一樣的
擴展理解
在前面我們提到過 HEAD 比如
git reset HEAD^
這個 HEAD匈棘,可以理解成 HEAD 指向當(dāng)前分支丧慈,而 Git 用分支指向最新提交
當(dāng)前 master 和 feat_6 都指向最新提交 C2,在 feat_6 分支上主卫,HEAD 就指向 feat_6
Step 2~3: 繼續(xù)在新分支上開發(fā)功能逃默,在該分支功能提交后(C3),這個分支的指針也會向最新內(nèi)容推進
在 feat_6 分支上新建一個 feat_6.txt簇搅, 并提交完域,此時 HEAD 也會指向 feat_6 分支,而 feat_6 指向最新提交馍资。(在初始使用過程中筒主,可以先忽略 HEAD 的概念)
為什么要先提交?
如果沒有提交鸟蟹,修改的文件會留在工作區(qū)或者暫存區(qū)里,那么這些還沒有提交的修改使兔,會和你在即將檢出(checkout)的分支產(chǎn)生沖突而阻止 Git 為你切換分支建钥,所以切換分支之前最好保證當(dāng)前的分支干凈(工作區(qū)或暫存區(qū)里沒有修改的文件)
- 在實際操作過程中,你會發(fā)現(xiàn)有時工作區(qū)和暫存區(qū)存在文件虐沥,也可以成功切換熊经,而且這些文件會一起保留到當(dāng)前分支
假設(shè) 在建立 feat_6 之后泽艘,在 master 分支有人修改了 test 文件,feat_6 也修改了 test 文件镐依,此時 feat_6 沒有提交匹涮,在切換分支時,就會有類似如下提示
提示先 commit 或者 stash槐壳, commit 就是提交然低,stash 是 繞過 commit 方法來處理,后續(xù)學(xué)習(xí)
Step 4~5: 切換到 master 分支务唐,來修復(fù) 功能1 的 bug雳攘,使用git checkout <branch>
, 切換到 master 分支就是git checkout master
(這里要和上一篇的 checkout 用法區(qū)別開)
那么此時的工作目錄中你的內(nèi)容就是 C2(在實例中枫笛,master 分支沒有 feat_6.txt)吨灭,和創(chuàng)建分支之前的內(nèi)容是一樣的,可以進行 fix刑巧,提交后喧兄,再回到 feat_6 繼續(xù)開發(fā)
實際場景的推薦處理方式:
如果在實際工作中,真的遇到了 bug 需要 fix啊楚,問題嚴(yán)重的建議再創(chuàng)建一個分支來修復(fù)繁莹,待修復(fù)完成后,再合并到主分支中特幔,以免影響到其他功能的驗收
比如咨演,創(chuàng)建這個分支名為 hotfix,并提交了修復(fù)的文件(C4)蚯斯,那分支走向如下圖
創(chuàng)建 hotfix 分支薄风,提交就不做逐步演示了,可以動手操作下
合并分支
不管是在 hotfix 修復(fù)問題拍嵌,還是在 feat_6 開發(fā)功能遭赂,最后測試后都要合并到主分支里,項目算完整横辆。
先回到主分支撇他,再使用git merge
命令來進行合并
git merge <branch>
合并指定分支到當(dāng)前分支
git checkout master
git merge hotfix
可以看到 master 分支有了剛剛 fix 的內(nèi)容(fix_feat_1.txt)
注意到上面的 Fast-forward 信息,Git 告訴我們狈蚤,這次合并是“快進模式”困肩,也就是直接把 master 指向 hotfix 的當(dāng)前提交,不存在任何需要解決的分歧脆侮。
合并之后 master 分支和 hotfix 分支指向同一位置锌畸。
查看分支
隨著分支的增多,可以通過 git branch
查看本地分支靖避,星號指向綠色分支是當(dāng)前分支
git branch -a
添加 -a
參數(shù)可以查看遠(yuǎn)程分支潭枣,遠(yuǎn)程分支會用紅色表示出來
刪除分支
在 完成 bug 修復(fù)之后 并且 master 也合并了 hotfix比默,hotfix 就可以刪掉了。
使用git branch -d <branch>
執(zhí)行刪除操作
git branch -d hotfix
(這個操作是在非 hotfix 操作的盆犁,示例中是在 master 分支命咐,自己不能刪除自己),再查看一下谐岁,hotfix 已經(jīng)不在分支列表中了
本篇先到這里醋奠,后面繼續(xù)介紹分支,來處理 feat_6 分支的內(nèi)容翰铡,和遇到的問題钝域。
最后回顧下知識點
-
git branch -b <new_branch>
創(chuàng)建并切換分支 -
git branch <branch>
切換分支 -
git merge <branch>
合并分支到當(dāng)前分支 -
git branch
查看本地分支 -
git branch -a
查看本地和遠(yuǎn)程分支 -
git branch -d <branch>
刪除分支
系列文章傳送門
Git 入門系列(一)- Git 概念/安裝/基本操作/遠(yuǎn)程推送更新
Git 入門系列(二)- 修改管理 / 撤銷操作 / 命令及區(qū)間關(guān)系
Git 入門系列(三)- 分支(上)創(chuàng)建與切換 / 合并 / 查看 / 刪除
Git 入門系列(四)- 分支(下)合并解決沖突 / 遠(yuǎn)程分支
Git 入門系列(五)- stash 貯藏
Git 入門系列(六)- 標(biāo)簽 tag
Git 入門系列(七)- 可視化 Git 管理工具
Git 入門系列(八) - FAQ
歡迎關(guān)注個人公眾號,【程序媛春哥的手記】