Git+GitHub,構(gòu)建自己的開源倉庫之Git分支

封面--來源網(wǎng)絡(luò)

簡介

最近公司里還是沒什么事做,雖然工資還是在正常發(fā),但是還是要有憂患意識(shí),畢竟,生于憂患,死于安樂。所以,最近一段時(shí)間都處于學(xué)習(xí)狀態(tài),越學(xué)習(xí)越發(fā)現(xiàn)要學(xué)的東西太多,越學(xué)習(xí)越發(fā)現(xiàn)自己懂得少。言歸正傳,今天記錄一下Git分支的相關(guān)知識(shí)。


遠(yuǎn)離舒適區(qū),常駐學(xué)習(xí)區(qū)

Git分支命令

命令 描述 示例
git branch <branch-name> 創(chuàng)建分支 git branch dev
git branch 查看本地分支 git branch
git branch -r 查看遠(yuǎn)程分支 git branch -r
git checkout <branch-name> 切換分支 git checkout develop
git checkout -b <branch-name> 創(chuàng)建并切換到分支 git checkout -b release
git branch -d <branch-name> 刪除分支 git branch -d bug-fix-109
git branch -D <branch-name> 強(qiáng)制刪除分支 git branch -D bug-fix-110
git merge <branch-name> 合并分支到當(dāng)前分支 git merge develop
git log --graph --pretty=oneline --abbrev-commit 查看分支合并記錄 git log --graph --pretty=oneline --abbrev-commit

上表中列出了git分支操作的基本命令,還有一些高級(jí)用法,以及一些配合使用的其他命令,如git log --graph --pretty=oneline --abbrev-commit,下面就逐條來解讀這些命令。

我們在操作這些命令的時(shí)候,都要注意一些,要明白自己當(dāng)前在哪個(gè)分支操作,要對(duì)哪個(gè)分支產(chǎn)生效果。我們在創(chuàng)建完一個(gè)本地倉庫后,會(huì)自動(dòng)創(chuàng)建一個(gè)主分支,即master分支,在未進(jìn)行任何分支操作之前,我們都是在master主分支上操作的。

創(chuàng)建分支

創(chuàng)建一個(gè)develop分支:

git branch develop
  • 為什么要?jiǎng)?chuàng)建分支?
    不影響主線分支的情況下開展工作,協(xié)同團(tuán)隊(duì)其他成員共同開發(fā)。

  • SVN等其他版本控制系統(tǒng)也有分支功能,為什么都沒怎么用過?
    創(chuàng)建/切換/刪除分支的成本太高,太慢,沒法愉快的玩耍,于是就成了擺設(shè),而Git則不同,創(chuàng)建切換分支都是秒級(jí)完成,根本感受不到。因此Git推薦開發(fā)者多多的使用分支功能。

    創(chuàng)建完一個(gè)分支后,Git就會(huì)生成一個(gè)指針develop,指向的是當(dāng)前commit節(jié)點(diǎn)的提交,另一個(gè)分支master也有一個(gè)指針master指向當(dāng)前commit節(jié)點(diǎn)的提交。當(dāng)我們在develop分支上提交新的內(nèi)容后,develop指針就會(huì)指向這個(gè)提交,而master指針依然指向原來的提交。

查看本地分支

git branch

這條命令會(huì)列出本地已創(chuàng)建的分支,并且會(huì)在分支名字前面用星號(hào)*標(biāo)記當(dāng)前所在的分支:

 chengshengyang@csy-pc MINGW64 ~/test (master)
$ git branch
  develop
* master

查看遠(yuǎn)程分支

git branch -r

列舉遠(yuǎn)程倉庫的分支

$ git branch -r
  origin/HEAD -> origin/master
  origin/master

可以看到遠(yuǎn)程倉庫只有一個(gè)分支,本地的develop還沒有push到遠(yuǎn)程倉庫,指針HEAD指向的是master分支。

切換分支

git checkout develop

切換到develop分支

$ git checkout develop
Switched to branch 'develop'

切換分支其實(shí)是Git將HEAD指針做了修改,指向了develop,所以這個(gè)過程很快。

創(chuàng)建并切換分支

其實(shí)就是創(chuàng)建切換二合一的命令,可以快速的切換到新的分支

 git checkout -b release

chengshengyang@csy-pc MINGW64 ~/test (develop)
$ git checkout -b release
Switched to a new branch 'release'
chengshengyang@csy-pc MINGW64 ~/test (release)

直接從develop分支切換到了新建的release分支了,一步到位。

合并分支

git merge develop

此時(shí),我們在develop上的工作完成了,需要合并到master分支,準(zhǔn)備發(fā)布用。先切換到master分支:

git checkout master

開始合并:

git merge develop

這之前,我們在develop分支對(duì)b.txt文件做了修改:

$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
chengshengyang@csy-pc MINGW64 ~/test (develop)
$ vim b.txt

chengshengyang@csy-pc MINGW64 ~/test (develop)
$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
git create branch is fast.

提交修改:

chengshengyang@csy-pc MINGW64 ~/test (develop)
$ git add b.txt

chengshengyang@csy-pc MINGW64 ~/test (develop)
$ git commit -m "modify b.txt"
[develop eb926ac] modify b.txt
1 file changed, 2 insertions(+), 1 deletion(-)

切換到master分支后,同樣,也修改一下b.txt文件的最后一行:

chengshengyang@csy-pc MINGW64 ~/test (master)
$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
chengshengyang@csy-pc MINGW64 ~/test (master)
$ vim b.txt

chengshengyang@csy-pc MINGW64 ~/test (master)
$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
git merge branch is fast.

chengshengyang@csy-pc MINGW64 ~/test (master)
$ git add b.txt

chengshengyang@csy-pc MINGW64 ~/test (master)
$ git commit -m "modify b.txt master"
[master 9e2050b] modify b.txt master
1 file changed, 2 insertions(+), 1 deletion(-)

現(xiàn)在master分支和develop分支都修改了b.txt的同一個(gè)位置,現(xiàn)在合并develop分支到master分支肯定會(huì)沖突:

chengshengyang@csy-pc MINGW64 ~/test (master)
$ git merge develop
Auto-merging b.txt
CONFLICT (content): Merge conflict in b.txt
Automatic merge failed; fix conflicts and then commit the result.

現(xiàn)在看看b.txt被合并成什么樣子了:

$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
<<<<<<< HEAD
git merge branch is fast.
=======
git create branch is fast.
>>>>>>> develop

跟其他版本控制系統(tǒng)類似,會(huì)用<<<<<<<<、========、>>>>>>>>來劃分沖突的內(nèi)容。因?yàn)镚it不知道m(xù)aster分支和develop分支哪個(gè)提交的內(nèi)容是正確的,需要程序員手動(dòng)修改后提交,注意我們此時(shí)所處的分支狀態(tài)是這樣的:

chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)

(master|MERGING)狀態(tài),說明在主分支master進(jìn)行合并的狀態(tài),合并未完成。解決沖突后提交:

$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333D
git merge branch is fast.
git create branch is also fast.

chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)
$ git commit -m "merge develop"
U       b.txt
error: commit is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)
$ git add b.txt

chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   b.txt


chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)
$ git commit -m "merge develop-fix conflict"
[master abffc90] merge develop-fix conflict

這里我犯了個(gè)錯(cuò),解決沖突后沒有add就直接commit,于是有了上面的一個(gè)提交失敗提示。
沖突解決后,文件需要執(zhí)行add操作后才能commit,如果不清楚可以先用git status查看狀態(tài)

查看分支合并記錄

git log --graph --pretty=oneline --abbrev-commit

這條命令是說用線條的形式顯示分支的合并記錄:

chengshengyang@csy-pc MINGW64 ~/test (master)
$ git log --graph --pretty=oneline --abbrev-commit
*   abffc90 merge develop-fix conflict
|\
| * eb926ac modify b.txt
* | 9e2050b modify b.txt master
|/
* 7bbd5fc add 19.png for jianshu.io

這條命令比較長,不好記,可以給它設(shè)置一個(gè)簡單的別名,但是這里暫時(shí)不說如何設(shè)置,還是多寫寫這些命令,等記住了,熟練了再設(shè)置個(gè)別名,提高效率順便裝裝逼啥的。

上面的合并方式是普通模式,已經(jīng)很快了,但是有種模式叫“快進(jìn)模式”,即Fast Forward,更快。一般合并沒有沖突的時(shí)候,Git都會(huì)使用Fast Forward模式快速合并,這種合并模式也是修改指針,所以快。但是,使用Fast Forward模式合并后,如果刪除合并的分支,使用上面的命令git log --graph --pretty=oneline --abbrev-commit就看不到分支的信息了,如果要避免這種情況,要使用下面的命令來合并:

git merge --no-ff -m "commit description" fix-bg-001

參數(shù)"--no-ff"指定合并不使用快進(jìn)模式,使用普通模式。

刪除分支

如果你現(xiàn)在在一個(gè)bug分支上解決一個(gè)bug,然后去develop分支、master分支合并成功了,這個(gè)分支也就沒什么用了,可以刪掉了:

chengshengyang@csy-pc MINGW64 ~/test (master)
$ git branch -d fix-bug-001
Deleted branch fix-bug-001 (was 0309fed).

如果分支內(nèi)容還沒有合并就要?jiǎng)h除,會(huì)提示錯(cuò)誤信息:

$ git branch -d test
error: The branch 'test' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test'.

而且提示了可以使用

git branch -D test

來強(qiáng)制刪除:

$ git branch -D test
Deleted branch test (was 92b398f).

以上就是git分支的一些基本命令的解讀了,學(xué)會(huì)了這些基本操作,才能更好的理解分支管理的策略。

分支管理策略

其實(shí)說到分支管理策略,我本人也沒有什么值得借鑒的經(jīng)驗(yàn),所以,這里就做了點(diǎn)功課,看看別人是怎么做分支管理的。

一般企業(yè)中開發(fā)一個(gè)項(xiàng)目的分支策略:

  • 主分支 master
    Git主分支的名字,默認(rèn)叫做master。它是自動(dòng)建立的,版本庫初始化以后,默認(rèn)就是在主分支在進(jìn)行開發(fā)。所有提供給用戶使用的正式版本,都在這個(gè)主分支上發(fā)布。
    master分支要時(shí)刻與遠(yuǎn)程同步,一般我們發(fā)布最新版本就用master分支。
  • 開發(fā)分支 develop
    主分支只用來分布重大版本,日常開發(fā)應(yīng)該在另一條分支上完成。開發(fā)用的分支叫做Develop。這個(gè)分支可以用來生成代碼的最新代碼版本。如果想正式對(duì)外發(fā)布,就在Master分支上,對(duì)Develop分支進(jìn)行"合并"(merge)。
    團(tuán)隊(duì)中所有人都在這個(gè)分支上開發(fā),所以也需要與遠(yuǎn)程同步。
  • 功能分支 feature
    功能分支,它是為了開發(fā)某種特定功能,從Develop分支上面分出來的。開發(fā)完成后,要再并入Develop。功能分支的名字,可以采用feature-*的形式命名。
    該分支是否需要推送到遠(yuǎn)程,要看是不是有幾個(gè)人合作開發(fā)新功能,如果你是一個(gè)開發(fā),就沒有必要了。
  • 預(yù)發(fā)布分支 release
    預(yù)發(fā)布分支,它是指發(fā)布正式版本之前(即合并到Master分支之前),我們可能需要有一個(gè)預(yù)發(fā)布的版本進(jìn)行測試。預(yù)發(fā)布分支是從Develop分支上面 分出來的,預(yù)發(fā)布結(jié)束以后,必須合并進(jìn)Develop和Master分支。它的命名,可以采用release-*的形式。
    建議該分支推送到遠(yuǎn)程倉庫。
  • bug 分支 fixbug
    bug分支,軟件正式發(fā)布以后,難免會(huì)出現(xiàn)bug。這時(shí)就需要?jiǎng)?chuàng)建一個(gè)分支,進(jìn)行bug修補(bǔ)。修補(bǔ)bug分支是從Master分支上面分出來的。修補(bǔ)結(jié)束以后,再合并進(jìn)Master和Develop分支。它的命名,可以采用fixbug-*的形式。
    bug分支一般只在本地使用來修復(fù)bug,一般不需推送遠(yuǎn)程倉庫中,修復(fù)合并后刪除分支。
  • 其它分支 other
    根據(jù)具體情況具體對(duì)待。

以上是根據(jù)網(wǎng)上摘取的關(guān)于分支管理策略的一些內(nèi)容,不一定適合每個(gè)人,僅供參考。

總結(jié)

對(duì)于分支的操作就寫這么多,如果您還有什么想知道的,就自己去網(wǎng)上找找相關(guān)資料,留言給我也可。如果覺得我的文章對(duì)你有用,歡迎點(diǎn)贊。有不足之處歡迎留言指出,謝謝。
看完本文的你或許對(duì)前兩篇內(nèi)容也感興趣
Git+GitHub,構(gòu)建自己的開源倉庫之Git命令
Git+GitHub,構(gòu)建自己的開源倉庫之初識(shí)Git

最后,分享一首歌曲:
Girl From Heavens

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,848評(píng)論 4 54
  • 秋天于我,是遼闊的,也是感傷的。我經(jīng)常會(huì)記起那個(gè)秋天,飄揚(yáng)而去的是一縷縷無可把握的悲哀。 四年級(jí)的我,還是一個(gè)“瘋...
  • 美索不達(dá)米亞平原在中東兩河流域,又名兩河平原。是一片位于底格里斯河及幼發(fā)拉底河之間的沖積平原,現(xiàn)今的伊拉克境內(nèi),那...
    艾米樂樂閱讀 1,191評(píng)論 0 0
  • 生活中每一樁糟糕的事,幾乎都是時(shí)機(jī)不當(dāng)?shù)慕Y(jié)果,每件好事,都是時(shí)機(jī)恰到好處的結(jié)果?!秿u上書店》 這是一座島,來來...
    盔甲騎士閱讀 380評(píng)論 1 1
  • 哈佛大學(xué)---世界一流學(xué)府,其中走出不少杰出 和成功人物,如我像神一般存在,當(dāng)看到(哈佛凌晨四點(diǎn)半)一書,并想來看...
    嬌之語閱讀 792評(píng)論 0 0

友情鏈接更多精彩內(nèi)容