浪網(wǎng)站制作電商網(wǎng)站建設(shè)定制
文章目錄
- 一、理解分支
- 二、創(chuàng)建、切換、合并分支
- 三、刪除分支
- 四、合并沖突
- 五、合并模式
- 六、分支策略
- 七、bug分支
- 八、強(qiáng)制刪除分支
努力經(jīng)營(yíng)當(dāng)下 直至未來(lái)明朗!
一、理解分支
-
HEAD指向的是master分支,master中指向的是最新一次的提交,也就是master中存儲(chǔ)得到最新一次提價(jià)的commit_id。
-
在gitcode倉(cāng)庫(kù)底下,
cat .git/refs/heads/master
就可以打印出master中的內(nèi)容,即最新一次提交的commit_id。
git cat-file -p [commit_id]
就可以打印出該commit_id的相關(guān)信息
-
master主分支:其實(shí)就相當(dāng)于是每次提交的結(jié)果鎖串成的線。
二、創(chuàng)建、切換、合并分支
- 查看當(dāng)前本地倉(cāng)庫(kù)有哪些分支:
git branch
- HEAD其實(shí)是可以指向其他分支的,被指向的分支就是當(dāng)前正在工作的分支。
- master就說(shuō)明當(dāng)前工作的分支就是master
-
創(chuàng)建本地分支:
git branch [分支名]
-
新建的分支是指向創(chuàng)建該分支的時(shí)候所站的版本上的,即該版本的commit_id
-
切換分支,重新設(shè)置當(dāng)前的工作分支,即HEAD指向新的分支
git checkout [分支名]
-
在dev分支上提交的內(nèi)容在master分支上找不到,因?yàn)閙aster和dev分支都是指向在各自分支上的最新提交。
-
合并分支:首先看目前在哪個(gè)分支上
git branch
-> 切換到想要合并到的分支上git checkout [分支名]
-> 合并分支git merge [被合并的分支]
-> 此時(shí)該分支就指向了被合并分支的最新一次提交
(fast-forward是快速模式)
三、刪除分支
-
在合并了分支之后,被合并的分支就可以被刪除了
git branch -d [要?jiǎng)h除的分支]
-
注意:只能在其他分支上刪除該分支,本分支上不能刪除本分支。
-
因?yàn)閯?chuàng)建、合并和刪除分支非常快,所以Git鼓勵(lì)使用分支完成某個(gè)任務(wù),合并后再刪除分支,這和直接在master分支上工作的效果是一樣的,但是過(guò)程更安全。
四、合并沖突
-
在merge合并分支的時(shí)候是可能出現(xiàn)沖突的。
-
如果相對(duì)分支A上的某個(gè)文件file中的內(nèi)容進(jìn)行升級(jí),此時(shí)就需要重新創(chuàng)建一個(gè)分支B對(duì)文件file中的內(nèi)容進(jìn)行修改,而與此同時(shí)分支A也對(duì)文件file中的內(nèi)容進(jìn)行了修改;而分支B最后是要合并到分支A上的,此時(shí)就會(huì)出現(xiàn)合并沖突問(wèn)題。
-
創(chuàng)建一個(gè)分支并將當(dāng)前分支切換到新分支上
git checkout -b [新分支]
-
git add .
將當(dāng)前目錄下的所有修改提交到暫存區(qū) -
不同分支對(duì)同一個(gè)文件修改之后進(jìn)行分支的合并,此時(shí)就會(huì)出現(xiàn)合并沖突
-
vim [文件名] 可以進(jìn)入文件查看沖突內(nèi)容,其中 <<< >>>中的內(nèi)容即是沖突內(nèi)容。
-
想要保留的是什么內(nèi)容是由開(kāi)發(fā)人員決定的,所以開(kāi)發(fā)人員就要進(jìn)行手動(dòng)修改文件內(nèi)容并進(jìn)行保存,然后重新進(jìn)行add和commit,此時(shí)保存的就是解沖突之后的結(jié)果。
-
解完沖突并合并分支,master存儲(chǔ)的是最新一次的提交,即接完沖突之后的提交
-
git log
搭配參數(shù)的使用
git log --graph --abbrev-commit
將提交commit進(jìn)行圖視化
五、合并模式
-
fast forward模式(ff模式)進(jìn)行合并分支,使用該種模式合并分支的時(shí)候,master會(huì)指向最新合并的分支指向的commit_id,也就分不清該次提交是merge還是正常commit來(lái)的。
-
no-ff模式:可以更加方便地追溯到此次的提交的是merge進(jìn)來(lái)的還是正常commit,方便追溯到對(duì)應(yīng)的人。(推薦使用)
git merge --no-ff -m "描述信息" [被合并的分支名]
六、分支策略
master分支是穩(wěn)定的,一般用于存儲(chǔ)線上環(huán)境的代碼。
七、bug分支
- 當(dāng)線上環(huán)境(即master主分支)上出現(xiàn)bug的時(shí)候,不要直接在master主分支上進(jìn)行修改,而是在本地專門(mén)創(chuàng)建一個(gè)修復(fù)master分支上bug的分支,然后測(cè)試團(tuán)隊(duì)測(cè)試之后再將該代碼分支合并到master主分支上。
- 不能在master主分支上直接進(jìn)行bug修復(fù)的原因:可能改出更大的bug,對(duì)線上環(huán)境影響較大。
- 模擬環(huán)境:開(kāi)發(fā)在dev2分支上開(kāi)發(fā)了部分代碼,但是還未提交,此時(shí)master主分支上出現(xiàn)了bug。此時(shí)需要新建一個(gè)專門(mén)的修復(fù)bug的分支來(lái)修復(fù)bug,則首先切到master分支上來(lái)新建一個(gè)修復(fù)bug的分支。
1)dev2分支上修改的代碼在master分支的工作區(qū)中出現(xiàn),即影響了master分支。
2)不想影響master分支,此時(shí)將當(dāng)前分支切換到dev2分支上,并將工作區(qū)中的內(nèi)容進(jìn)行儲(chǔ)存操作git stash
-> 可以使用tree .git/進(jìn)行查看,發(fā)現(xiàn)多了refs/stash來(lái)存儲(chǔ)工作區(qū)中的內(nèi)容 -> 此時(shí)工作區(qū)中就是干凈的
3)stash中存儲(chǔ)的是已經(jīng)被git追蹤管理的內(nèi)容。因?yàn)閒ile3并沒(méi)有提交到git中被git追蹤管理,所以是不能在stash中進(jìn)行存儲(chǔ)的,即git stash命令不可用。
4)此時(shí)就切換到master分支上新建一個(gè)修復(fù)bug的分支 -> 并對(duì)有bug的文件進(jìn)行修改,修改完成之后提交到該分支上 -> 切換到master主分支上并將修復(fù)分支上的代碼合并到master主分支上
5)dev2分支還沒(méi)有開(kāi)發(fā)完成,此時(shí)就需要切換回dev2分支繼續(xù)進(jìn)行開(kāi)發(fā),但是cat 該文件之后發(fā)現(xiàn)該文件中之前開(kāi)發(fā)了部分的代碼不見(jiàn)了,這些內(nèi)容已經(jīng)被放到了stash中進(jìn)行存儲(chǔ) -> 此時(shí)就需要將stash中的內(nèi)容恢復(fù)到該dev2分支的該文件中進(jìn)行繼續(xù)開(kāi)發(fā)
① git stash list
可以查看當(dāng)前stash中存儲(chǔ)的內(nèi)容
② git stash pop
可以將stash中存儲(chǔ)的內(nèi)容恢復(fù)到該分支的文件中
6)此時(shí)就可以繼續(xù)對(duì)dev2分支進(jìn)行開(kāi)發(fā),開(kāi)發(fā)完成之后就可以對(duì)代碼進(jìn)行提交,但是此時(shí)的狀態(tài)如下,直接將dev2分支合并到master分支上可能會(huì)存在沖突
7)為了避免將dev2分支合并到master主分支之后影響master住分支,就將master主分支合并到dev2分支上,這樣合并后即使有問(wèn)題也可以在本地分支dev2上進(jìn)行多次修改測(cè)試,不會(huì)影響master主分支中的代碼 -> 將問(wèn)題在dev2分支上解決完之后再將代碼合并到master主分支上
8)修復(fù)并合并完分支之后就可以將該修復(fù)分支進(jìn)行刪除了
git branch -d [分支名]
八、強(qiáng)制刪除分支
- 在分支A已經(jīng)被merge了之后想要?jiǎng)h除分支A:
git branch -d [分支A]
- 若分支B還沒(méi)有被merge過(guò),此時(shí)直接該分支B是受保護(hù)的,不能直接使用
git branch -d [分支B]
進(jìn)行刪除。 - 如果想要?jiǎng)h除還沒(méi)有被合并的分支每次是就需要強(qiáng)心進(jìn)行刪除,即
git branch -D [分支名]
,但是注意:不能在當(dāng)前分支上刪除當(dāng)前分支,必須要進(jìn)行分支的切換!!!