
编者按:8.6-8.11
git分支作为git的‘必杀技特性’,让git从众多版本控制系统中脱颖而出,
本宝宝总结了git分支的使用,不懂的可以私信噢~
新建分支
分支操作近似大部分都在本地操作完成。
[1]创建新分支:git branch [branchname](HEAD指针指向当前所在本地分支,当前所在提交对象创建一个指针)
[2]切换分支:git checkout [branchname](HEAD指针也指向了新分支,工作目录变成新分支所指向的快照内容)
新建并切换分支:git checkout -b [branchname]===[1]+[2]
HEAD分支随着提交操作自动向前移动
查看各个分支当前所指对象:$ git log --oneline —decorate
查看分叉历史:git log --oneline --decorate --graph —all
合并分支
一个例子:
有一个线上分支,新需求,新建一个分支:git checkout -b [newbranch]
紧急问题切换回master分支:git checkout master
新建一个紧急问题分支:git checkout -b hotfix
切换回master分支合并紧急问题分支:git checkout master & git merge hotfix(快进)
删除hotfix分支:git branch -d hotfix
切换回新需求分支继续工作:git checkout [newbranch]
二个例子:
新需求分支合并紧急问题分支(目前master已经合并了紧急问题分支)
方法一:新需求分支:git merge master
方法二:切换master分支:git merge hotfix
Git merge:
作用一:快进
作用二:使用两个分支的末端所指的快照(C4和C5)以及这两个分支的工作祖先(C2),做一个简单地三方合并。
合并冲突解决:上半部分HEAD为当前分支,下半部分为另一个分支
注:切换分支前保存一个干净的状态~保存进度(stashing)&修补提交(commit amending)
分支管理
git branch:[1]创建分支;[2]删除分支;[3]查看分支列表
查看每一个分支的最后一次提交:git branch -v
查看哪些分支已经合并到当前分支:git branch --merged
查看哪些分支尚未合并到当前分支:git branch --no-merged
分支开发工作流
长期分支:稳定性逐步提升,分支逐步靠前。
特性分支(短期分支)
远程分支&跟踪分支
1.远程分支:
显示远程引用的完整列表:git ls-remote
获取远程分支信息:git remote show(显示origin)
远程分支:(remote)/(branch)——远程仓库remote中branch分支的最后一次提交状态
远程分支:服务器克隆会自动将其命名为origin,创建一个指向master分支的指针,本地命名为origin/master
[1]克隆后:默认远程仓库remote:origin(git clone)+++默认起始分支branch:master(git init)===默认远程分支
[2]本地(master)与远程(origin/master)的工作可以分叉
[3]git fetch:更新远程仓库(origin/master)引用
[4]添加另一个远程仓库:git remote add [newname] [newurl]
[5]推送新的分支:git push [remotename] [branchname]
[6]另一个协作者:git fetch后本地生成一个远程分支origin/master,指向服务器master分支的引用
[7]git fetch远程分支后,本地只有一个不可更改的origin/master指针,运行git merge origin/master合并到自己所在分支;
如果想要在自己的master分支工作,可以将其建立在远程分支之上,git checkout -b master origin/master
2.跟踪分支/上游分支:(在本地分支上)
跟踪分支上git pull:git能自动识别去哪个服务器抓取,合并到哪个分支
克隆仓库自动创建一个跟踪分支:git checkout -b [branch] [remote]/[branch]===git checkout --track [remote]/[branch]
创建一个不同的跟踪分支:git checkout -b [newbranch] remote/branch
已有本地分支跟踪拉取下来的远程分支:git branch -u remote/master
远程分支快捷方式:@u 或 @upstream
查看设置的所有跟踪分支:git branch -vv(本地缓存的服务器数据,获取最新需抓取所有的远程仓库git fetch --all)
3.拉取
git fetch:从服务器抓取本地没有的数据,不会修改工作目录中的内容,只会获取数据让自己合并
git pull:大多数===git fetch && git merge(最好用后者)
4.删除远程分支:git push origin —delete [branch]
变基:(rebase)
将一系列提交按照原有次序依次应用到另一个分支上。
[1] git rebase master
[1]+[2]===git rebase master [A分支]
git merge [A分支]
一个例子:
master生成一个特性分支server再生成一个特性分支client,需求:client分支合并到master
git checkout master
$ git merge client
变基使用范围:
在推送前清理提交使之清洁,只在从未推送至共用仓库的提交上执行变基命令。
git fetch:更新远程仓库
git pull:合并到当前分支
情景:
[1]一个人合并了推送,[2]另一个人修改合并后提交,[3]一个人再变基提交,[4]另一个人fetch&pull合并提交,出现相同的log而且结构混乱。
解决办法:
[4]另一个人fetch后不要pull合并提交,而是执行变基,git会自动分辨做了哪些修改等。
方法一:git fetch & git rebase [远程分支]
方法二:git fetch & git pull —rebase
在已经被推送至公用仓库的提交上执行变基命令de解决办法:通知每个人执行git pull —rebase
合并和变基
相同点:
最后都指向相同的快照。
不同点:
提交历史不同。
合并:重于记录
变基:重于结果
git cherry-pick
想要某个分支中的一个或几个提交,捡别的分支提过来合并。
B分支想要A分支中的几个提交
切换:git checkout [branchB]
一个:git cherry-pick [commit id]
多个:git cherry-pick [commit id1] [commit id2] [commit id3]
不合并放入暂存区待提交:git cherry-pick [commit id] --no-commit
合并没冲突,ok。
有冲突:git statu-查看—解决冲突—git add—提交—cherry pick剩余commit
分享一段很棒的比喻:
git rebase有点类似git merge,但是两者又有不同,打个比方,你有两个抽屉A和B,里面都装了衣服,现在想把B中的衣服放到A中,git merge是那种横冲直撞型的,拿起B就倒入A里面,如果满了(冲突)再一并整理;而git rebase就很持家了,它会一件一件的从B往A中加,会根据一开始放入的时间顺序的来加,如果满了你可以处理这一件,你可以继续加,或者跳过这一件,又 或者不加了,把A还原。所以merge适合那种比较琐碎的,简单的合并,系统级的合并还是用rebase吧。
小贴士
本文总结自Git电子书第三章git分支:
https://git-scm.com/book/zh/v2
小结
不断总结,不断完善自己的知识体系,才能形成自己的核心竞争力。否则知识就像一盘散沙,你总会觉得自己在原地踏步。个人认为写博客不便于构建知识体系,推荐印象笔记&onenote,绝对值得你拥有。
网友评论