分支管理
分支在實(shí)際中的作用是喜每,再給當(dāng)前項(xiàng)目開發(fā)新功能的時(shí)候间护,可以將新功能未完成的代碼庫提交到獨(dú)立的分支企蹭,但整體完成后再合并到主分支白筹。從而既保證了原項(xiàng)目能正常運(yùn)作,又杜絕了新功能丟失進(jìn)度的風(fēng)險(xiǎn)谅摄。
創(chuàng)建與合并分支
創(chuàng)建dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
參數(shù)表示創(chuàng)建并切換徒河,相當(dāng)于以下兩條命令:
$ git branch dev
$ git checkout dev
用git branch
命令查看當(dāng)前分支:
$ git branch
* dev
master
git branch
命令會(huì)列出所有分支,并在當(dāng)前分支前標(biāo)*
號(hào)送漠。
現(xiàn)在可以在dev
分支上進(jìn)行修改顽照,比如在readme.txt
加上一行:
Creating a new branch is quick.
在提交并切換到master
分支后,可以發(fā)現(xiàn)master
分支的提交點(diǎn)沒有變化闽寡。
接下來合并master
分支和dev
分支:
$ git merge dev
Updating b3ce958..f39faf9
Fast-forward
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Fast-forward
信息表示此次合并是”快進(jìn)模式“代兵,直接把master
指向dev
的提交爷狈。
合并完成后可以放心刪除dev
分支:
$ git branch -d dev
Deleted branch dev (was f39faf9).
解決沖突
在合并分支是也可能會(huì)出現(xiàn)一些問題奢人,比如:
創(chuàng)建一個(gè)新的分支featurel
,并將readme.txt
文件的最后一行改為:
Creating a new branch is quick AND simple.
在featurel
分支上提交:
$ git add readme.txt
$ git commit -m "And simple"
[featurel 724fe08] And simple
1 file changed, 1 insertion(+), 1 deletion(-)
切換到master
分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
此時(shí)Git
還會(huì)提示本地master
分支進(jìn)度比遠(yuǎn)程master
分支超前一個(gè)提交淆院。
如果我們?cè)?code>master分支上把readme.txt
文件的最后一行修改為:
Creating a new branch is quick & simple.
并提交何乎,那么master
分支與featurel
分支都分別有了新的提交,如圖:
這種情況下土辩,Git無法執(zhí)行“快速合并”支救,只能試圖把各自的修改合并起來,但這種合并就可能會(huì)有沖突拷淘,比如:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
readme.txt
文件存在沖突各墨,需要手動(dòng)解決之后才能提交。此時(shí)可用git status
查找沖突的文件启涯。
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
此時(shí)編輯readme.txt
可以看到:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<
贬堵,=======
恃轩,>>>>>>>
標(biāo)記出不同分支的內(nèi)容。
再次修改如下后保存:
Creating a new branch is quick and simple.
并提交:
$ git add readme.txt
$ git commit -m "conflict fixed"
[master f648aa0] conflict fixed
現(xiàn)在的分支情況就如下圖所示:
用帶參數(shù)的git log也可以看到分支的合并情況:
* f648aa0 conflict fixed
|\
| * 44f163b AND simple
* | 2a2a0d6 & simple
|/
* 2db35f3 brach test
...
最后黎做,刪除feature1
分支:
$ git branch -d feature1
Deleted branch feature1 (was 44f163b).
分支管理策略
合并分支時(shí)叉跛,加上--no-ff
參數(shù)就可以用普通模式合并,合并后的歷史有分支蒸殿,能看出來曾經(jīng)做過合并筷厘,而fast forward
合并就看不出來曾經(jīng)做過合并。
操作如下:
$ git checkout -b dev
Switched to a new branch 'dev'
$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge
1 file changed, 1 insertion(+)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
此時(shí)用git log
可查看分支歷史:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
Bug分支
Git提供了stash
功能可以暫存不方便提交的工作宏所,以便于切換到其他分支時(shí)不丟失當(dāng)前進(jìn)度酥艳。
示例:
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
可用git stash list
查看暫存的工作。
恢復(fù)則有兩種選擇爬骤,一是用git stash apply恢復(fù)充石,但是恢復(fù)后,stash內(nèi)容并不刪除霞玄,你需要用git stash drop來刪除骤铃;
另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了溃列。
Future 分支
軟件開發(fā)中劲厌,總有無窮無盡的新的功能要不斷添加進(jìn)來膛薛。
添加一個(gè)新功能時(shí)听隐,肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了哄啄,所以雅任,每添加一個(gè)新功能,最好新建一個(gè)feature
分支咨跌,在上面開發(fā)沪么,完成后,合并锌半,最后禽车,刪除該feature
分支。
現(xiàn)在刊殉,終于接到了一個(gè)新任務(wù):開發(fā)代號(hào)為Vulcan的新功能殉摔,該功能計(jì)劃用于下一代星際飛船。
于是準(zhǔn)備開發(fā):
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
5分鐘后记焊,開發(fā)完畢:
$ git add vulcan.py
$ git status
# On branch feature-vulcan
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: vulcan.py
#
$ git commit -m "add feature vulcan"
[feature-vulcan 756d4af] add feature vulcan
1 file changed, 2 insertions(+)
create mode 100644 vulcan.py
切回dev
逸月,準(zhǔn)備合并:
$ git checkout dev
一切順利的話,feature
分支和bug
分支是類似的遍膜,合并碗硬,然后刪除瓤湘。
但是,就在此時(shí)恩尾,接到上級(jí)命令弛说,因經(jīng)費(fèi)不足,新功能必須取消特笋!
雖然白干了剃浇,但是這個(gè)分支還是必須就地銷毀:
$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
銷毀失敗。Git友情提醒猎物,feature-vulcan
分支還沒有被合并虎囚,如果刪除,將丟失掉修改蔫磨,如果要強(qiáng)行刪除淘讥,需要使用命令git branch -D feature-vulcan
。
現(xiàn)在強(qiáng)行刪除:
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 756d4af).
刪除成功堤如!
多人協(xié)作
當(dāng)從遠(yuǎn)程倉庫克隆時(shí)蒲列,實(shí)際上Git自動(dòng)把本地的master
分支和遠(yuǎn)程的master
分支對(duì)應(yīng)起來了,并且搀罢,遠(yuǎn)程倉庫的默認(rèn)名稱是origin
蝗岖。
要查看遠(yuǎn)程庫的信息,用git remote
:
$ git remote
origin
或者榔至,用git remote -v顯示更詳細(xì)的信息:
$ git remote -v
orgin https://github.com/yimingjin1995/learngit.git (fetch)
orgin https://github.com/yimingjin1995/learngit.git (push)
上面顯示了可以抓取和推送的origin
的地址抵赢。如果沒有推送權(quán)限,就看不到push的地址唧取。
推送分支
推送分支铅鲤,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫。推送時(shí)枫弟,要指定本地分支邢享。例如:
$ git push origin dev