簡介
最近公司里還是沒什么事做,雖然工資還是在正常發,但是還是要有憂患意識,畢竟,生于憂患,死于安樂。所以,最近一段時間都處于學習狀態,越學習越發現要學的東西太多,越學習越發現自己懂得少。言歸正傳,今天記錄一下Git分支的相關知識。
Git分支命令
命令 | 描述 | 示例 |
---|---|---|
git branch <branch-name> | 創建分支 | git branch dev |
git branch | 查看本地分支 | git branch |
git branch -r | 查看遠程分支 | git branch -r |
git checkout <branch-name> | 切換分支 | git checkout develop |
git checkout -b <branch-name> | 創建并切換到分支 | git checkout -b release |
git branch -d <branch-name> | 刪除分支 | git branch -d bug-fix-109 |
git branch -D <branch-name> | 強制刪除分支 | git branch -D bug-fix-110 |
git merge <branch-name> | 合并分支到當前分支 | git merge develop |
git log --graph --pretty=oneline --abbrev-commit | 查看分支合并記錄 | git log --graph --pretty=oneline --abbrev-commit |
上表中列出了git分支操作的基本命令,還有一些高級用法,以及一些配合使用的其他命令,如git log --graph --pretty=oneline --abbrev-commit,下面就逐條來解讀這些命令。
我們在操作這些命令的時候,都要注意一些,要明白自己當前在哪個分支操作,要對哪個分支產生效果。我們在創建完一個本地倉庫后,會自動創建一個主分支,即master分支,在未進行任何分支操作之前,我們都是在master主分支上操作的。
創建分支
創建一個develop分支:
git branch develop
為什么要創建分支?
不影響主線分支的情況下開展工作,協同團隊其他成員共同開發。-
SVN等其他版本控制系統也有分支功能,為什么都沒怎么用過?
創建/切換/刪除分支的成本太高,太慢,沒法愉快的玩耍,于是就成了擺設,而Git則不同,創建切換分支都是秒級完成,根本感受不到。因此Git推薦開發者多多的使用分支功能。創建完一個分支后,Git就會生成一個指針develop,指向的是當前commit節點的提交,另一個分支master也有一個指針master指向當前commit節點的提交。當我們在develop分支上提交新的內容后,develop指針就會指向這個提交,而master指針依然指向原來的提交。
查看本地分支
git branch
這條命令會列出本地已創建的分支,并且會在分支名字前面用星號*標記當前所在的分支:
chengshengyang@csy-pc MINGW64 ~/test (master)
$ git branch
develop
* master
查看遠程分支
git branch -r
列舉遠程倉庫的分支
$ git branch -r
origin/HEAD -> origin/master
origin/master
可以看到遠程倉庫只有一個分支,本地的develop還沒有push到遠程倉庫,指針HEAD指向的是master分支。
切換分支
git checkout develop
切換到develop分支
$ git checkout develop
Switched to branch 'develop'
切換分支其實是Git將HEAD指針做了修改,指向了develop,所以這個過程很快。
創建并切換分支
其實就是創建切換二合一的命令,可以快速的切換到新的分支
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
此時,我們在develop上的工作完成了,需要合并到master分支,準備發布用。先切換到master分支:
git checkout master
開始合并:
git merge develop
這之前,我們在develop分支對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(-)
現在master分支和develop分支都修改了b.txt的同一個位置,現在合并develop分支到master分支肯定會沖突:
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.
現在看看b.txt被合并成什么樣子了:
$ cat b.txt
00000000000000000000000000
111111111111111111111111111
2222222222222222323333333333
<<<<<<< HEAD
git merge branch is fast.
=======
git create branch is fast.
>>>>>>> develop
跟其他版本控制系統類似,會用<<<<<<<<、========、>>>>>>>>來劃分沖突的內容。因為Git不知道master分支和develop分支哪個提交的內容是正確的,需要程序員手動修改后提交,注意我們此時所處的分支狀態是這樣的:
chengshengyang@csy-pc MINGW64 ~/test (master|MERGING)
(master|MERGING)狀態,說明在主分支master進行合并的狀態,合并未完成。解決沖突后提交:
$ 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
這里我犯了個錯,解決沖突后沒有add就直接commit,于是有了上面的一個提交失敗提示。
沖突解決后,文件需要執行add操作后才能commit,如果不清楚可以先用git status查看狀態
查看分支合并記錄
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
這條命令比較長,不好記,可以給它設置一個簡單的別名,但是這里暫時不說如何設置,還是多寫寫這些命令,等記住了,熟練了再設置個別名,提高效率順便裝裝逼啥的。
上面的合并方式是普通模式,已經很快了,但是有種模式叫“快進模式”,即Fast Forward,更快。一般合并沒有沖突的時候,Git都會使用Fast Forward模式快速合并,這種合并模式也是修改指針,所以快。但是,使用Fast Forward模式合并后,如果刪除合并的分支,使用上面的命令git log --graph --pretty=oneline --abbrev-commit就看不到分支的信息了,如果要避免這種情況,要使用下面的命令來合并:
git merge --no-ff -m "commit description" fix-bg-001
參數"--no-ff"指定合并不使用快進模式,使用普通模式。
刪除分支
如果你現在在一個bug分支上解決一個bug,然后去develop分支、master分支合并成功了,這個分支也就沒什么用了,可以刪掉了:
chengshengyang@csy-pc MINGW64 ~/test (master)
$ git branch -d fix-bug-001
Deleted branch fix-bug-001 (was 0309fed).
如果分支內容還沒有合并就要刪除,會提示錯誤信息:
$ 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
來強制刪除:
$ git branch -D test
Deleted branch test (was 92b398f).
以上就是git分支的一些基本命令的解讀了,學會了這些基本操作,才能更好的理解分支管理的策略。
分支管理策略
其實說到分支管理策略,我本人也沒有什么值得借鑒的經驗,所以,這里就做了點功課,看看別人是怎么做分支管理的。
一般企業中開發一個項目的分支策略:
- 主分支 master
Git主分支的名字,默認叫做master。它是自動建立的,版本庫初始化以后,默認就是在主分支在進行開發。所有提供給用戶使用的正式版本,都在這個主分支上發布。
master分支要時刻與遠程同步,一般我們發布最新版本就用master分支。 - 開發分支 develop
主分支只用來分布重大版本,日常開發應該在另一條分支上完成。開發用的分支叫做Develop。這個分支可以用來生成代碼的最新代碼版本。如果想正式對外發布,就在Master分支上,對Develop分支進行"合并"(merge)。
團隊中所有人都在這個分支上開發,所以也需要與遠程同步。 - 功能分支 feature
功能分支,它是為了開發某種特定功能,從Develop分支上面分出來的。開發完成后,要再并入Develop。功能分支的名字,可以采用feature-*的形式命名。
該分支是否需要推送到遠程,要看是不是有幾個人合作開發新功能,如果你是一個開發,就沒有必要了。 - 預發布分支 release
預發布分支,它是指發布正式版本之前(即合并到Master分支之前),我們可能需要有一個預發布的版本進行測試。預發布分支是從Develop分支上面 分出來的,預發布結束以后,必須合并進Develop和Master分支。它的命名,可以采用release-*的形式。
建議該分支推送到遠程倉庫。 - bug 分支 fixbug
bug分支,軟件正式發布以后,難免會出現bug。這時就需要創建一個分支,進行bug修補。修補bug分支是從Master分支上面分出來的。修補結束以后,再合并進Master和Develop分支。它的命名,可以采用fixbug-*的形式。
bug分支一般只在本地使用來修復bug,一般不需推送遠程倉庫中,修復合并后刪除分支。 - 其它分支 other
根據具體情況具體對待。
以上是根據網上摘取的關于分支管理策略的一些內容,不一定適合每個人,僅供參考。
總結
對于分支的操作就寫這么多,如果您還有什么想知道的,就自己去網上找找相關資料,留言給我也可。如果覺得我的文章對你有用,歡迎點贊。有不足之處歡迎留言指出,謝謝。
看完本文的你或許對前兩篇內容也感興趣
Git+GitHub,構建自己的開源倉庫之Git命令
Git+GitHub,構建自己的開源倉庫之初識Git
最后,分享一首歌曲:
Girl From Heavens