Git学习 - Part4(分支管理)
一、创建和合并分支
-
分支概念
每次提交,Git都会将他们串成一个时间线,这条时间线就是一个分支。
截止到目前只有一个主分支叫master
分支。
HEAD
指向master
,master
指向最新的提交。当创建新的分支,例如
dev
时,Git就新建了一个指针名为dev
,指向master
相同的提交,再把HEAD
指向dev
,表示当前分支在dev
上。
之后对工作区的提交和修改都是针对
dev
分支了。
将
dev
合并到master
上,只需将master
指向当前dev
的提交即可。
合并完成后甚至可以删除dev
分支,即将dev
指针删掉。 -
创建并切换分支
例如创建dev
分支,然后切换到上面。(dev
均可直接替换其他名字,下同)
git checkout -b dev
-b表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
随后的修改即在dev
分支上进行。 -
查看分支
使用git branch
命令列举所有分支并用*标注出当前分支:
git branch
-
合并分支到当前分支
切换到master
分支
git checkout master
随后将dev
分支合并到master
分支上
git merge dev
此时Git提示为Fast-forward
信息,表示此次合并为“快进模式”即直接进行指针的移动。 -
删除分支
git branch -d dev
删除dev
分支 -
git switch
命令
由于checkout
命令具有迷惑性,因此使用switch
更加科学。
创建并切换到新的分支:git switch -c dev
直接切换到已有分支:git switch master
二、分支冲突
-
产生如图冲突,
master
和feature1
各自更改了相同文件的内容然后各自提交
-
合并冲突
此时使用git merge feature1
会提示冲突
使用git status
查看冲突的文件
使用cat
查看并修改冲突的文件具体内容,Git会自动用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,手动将他们改为统一的内容。
再将该文件提交即可。
用带参数的
git log
查看分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
最后删除feature1
分支
git branch -d feature1
三、分支管理策略
-
--no-ff
方式下的git merge
通常合并分支时,没有冲突的话Git会使用Fast forward模式,在这种模式下,删除分支后会丢掉分支信息。
使用--no-ff
则会在合并时生成一个新的commit,从分支历史上就可以看出分支信息。与不加参数的区别在于可以看出曾经做过合并。
详细命令为:git merge --no-ff -m "some descriptions" <name>
因为合并要创建一个新的commit
,所以需要使用-m
将描述加进去。
-
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;你和你的小伙伴们每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
四、bug分支
-
场景描述
假设有一个紧急任务如处理bug需要立即进行,而当前在dev
上所进行的工作还未完成只做了一半不想提交。
因此可以使用stash
功能,将当前工作现场储藏起来,等以后恢复现场之后继续工作:
git stash
-
首先确定在哪个分支上修补bug,例如
master
git checkout master
-
创建临时分支
git checkout -b issue-101
-
修补bug后提交
git add readme.txt
git commit -m "fix bug 101"
-
修补完成后,切换
master
分支并完成合并,最后删除issue-101
分支
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
-
显示工作现场
git stash list
-
恢复工作现场
-
git stash apply
恢复工作现场git stash drop
删除stash内容 -
git stash drop
直接恢复并删除stash内容 -
git stash apply stash@{0}
恢复指定的stash内容
-
-
将bug修复到
dev
上
只复制修复bug的提交
使用cherry-pick
命令复制一个特定的提交到当前分支,其中commit id
为提交修复bug的提交id:
git cherry-pick <commit id>
五、Feature分支
-
场景描述
添加一个新任务时,最好新建一个feature
分支,在上面开发,完成后合并,最后删除该feature
分支。 -
销毁分支
此时接收到命令取消新功能但是包含机密的分支必须要销毁。
使用普通git branch -d <branchname>
命令无法删除分支,Git会提示分支还未合并,如果删除会丢失修改。
因此使用git branch -D <branchname>
强行删除分支。
六、多人协作
-
查看远程库信息
当从远程仓库克隆时,实际上是Git自动将本地的master
分支和远程的master
分支对应起来,并且远程仓库的默认名为origin
git remote
git remote -v
可以显示更详细的信息 -
推送分支
指定本地分支以及远程库:
git push <远程库名> <分支名>
-
抓取分支
git clone git@github.com:<用户名>/<远程库名>.git
默认情况下只能看到本地的master
分支
现在要在dev
分支上开发,就要创建origin
的dev
分支到本地:
git checkout -b dev origin/dev
现在就可以在dev
上修改并将dev
分支push
到远程库如果
git push
时遇到冲突,先用git pull
把最新的提交从origin/dev
抓下来,然后在本地合并,解决冲突,再推送:
首先需要指定本地dev
分支与远程origin/dev
分支的链接(提示no tracking information
):
git branch --set-upstream-to=origin/dev dev
再pull:
git pull
随后在本地解决冲突,随后提交并push。
七、Rebase
-
git rebase
rebase
操作可以把本地未push的分叉提交历史整理成直线;rebase
的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。