Git——Git分支管理

1. 分支的增删改查

  • 创建分支

git branch a// 创建分支 a
git checkout a// 切换到分支 a
git checkout -b a// 创建分支 a并切换到该分支上

git checkout develop origin/develop// 如果远程有个分支 develop,而本地没有,你想把远程的 develop 分支迁到本地
git checkout -b develop origin/develop// 同样的,把远程分支迁到本地并切换到该分支

  • 删除分支

① 删除本地分支
git branch -d a
git branch -D a// 强制删除分支

② 删除远程分支
git push origin :develop

  • 查看分支

git branch// 查看本地分支列表
git branch -r// 查看远程分支列表

2. 合并分支并解决冲突

(1)合并分支
指定分支合并到当前分支

a)merge

$ git merge <branchName>
$ git branch -d a
  • 若另一个分支是当前分支提交节点的祖父节点
    那么合并命令什么也不做

  • 若当前分支提交节点是另一个分支的祖父节点
    会导致fast-forward合并,只是简单的指针移动,并生成一个新的提交。该模式的本质是,将当前分支的指针直接指向<branchName>分支的最新提交。分支 a 的信息合并到 master 后将该分支删除。

该种方式删除分支后会丢掉分支信息。下图是删除分支后查看到的日志信息,可以看到,没有分支被合并上去的信息。

禁用Fast Forward模式

$ git merge --no-ff -m "merge with no-ff" a

上述指令强制禁用Fast Forward模式,Git 在合并时生成一个新的 commit(所以指令中通过-m添加提交日志),从分支历史上就可以看出分支信息。

  • 其余情况进行一次真正的合并
    当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

b)rebase

(2)解决冲突
廖老师说人生不如意事十之八九,合并分支也不是一帆风顺。手动解决冲突后再次提交(commit)(fix conflicts and run "git commit")。

① 手动解决冲突
Git 用<<<<<<=====>>>>>标记出不同分支的内容。面对冲突文件,我们很容易可以区分出哪些是我们想要的内容,我们只需保留想要的内容,同时移除<<< HEAD>>> a这些标记。

② 再次提交

$ git add README.md
$ git commit -m "fixed conflict"

3. 将本地分支与远程分支关联

Git 新建一个分支后必须与远程分支进行关联,关联的目的是如果在本地分支下执行指令: git pullgit push,只要没有显式指定关联分支就会失败。有以下几种方法关联。

(1)以 clone 的方式创建仓库,master 分支自动对应
当从远程仓库克隆时,Git 自动把本地 master 分支和远程的 master 分支对应起来了,远程仓库的默认名是 origin。

(2)基于远程分支创建本地分支
git checkout develop origin/develop// 如果远程有个分支 develop,而本地没有,你想把远程的 develop 分支迁到本地

git checkout -b develop origin/develop// 同样的,把远程分支迁到本地并切换到该分支

(3)在将本地分支提交到远程仓库时,若远程仓库没有对应分支则创建
git push origin master// 该形式中远程分支名被省略,表示将本地分支推送到与之存在追踪关系的远程分支(通常二者同名),如果该远程分支不存在,则会被创建。

git push -u origin master

(4)手动执行指令将本地分支与远程分支关联
远程仓库有 master和 dev 两个分支,通过 clone 的方式得到本地仓库,发现本地仓库只有一个 master 分支和远程仓库关联。在本地仓库新建一个名为 dev 的分支。使用$ git pull(该形式中省略了远程主机名、本地分支名和远程分支名,表示拉取当前分支对应的唯一一个的远程分支的内容),出现下图中提示,说明本地分支和远程分支没有关联起来。使用$ git push(该形式中省略了远程主机名、本地分支名和远程分支名,表示将修改推送到当前分支对应的唯一一个的远程分支上),出现下图中提示。

git pull
git push

所以为了解决上述问题,需要手动将本地分支和远程分支关联起来。

$ git branch --set-upstream-to <远程分支> <本地分支>
$ git branch --set-upstream-to origin/dev dev
关联结果

4. 团队协作流程 Git Flow

(1)相关概念
Git Flow 是一种成熟的分支管理流程,定义了多人协作下的分支管理规范。

Git Flow 中涉及到的分支
  • master(记录发布历史)

保存官方的发布历史,使用标签为 master 上发布的版本打标签(tag)。永远处在即将发布状态(production-ready)

  • develop(集成各种功能开发)

  • feature(功能开发)

每一个新功能的开发,都应各自使用独立的分支,该分支基于 develop,功能完成后 merge 回 develop。功能开发永远不应该直接牵扯到 master。

  • release(用于进行发布前的准备)

一旦 develop 积攒了足够多的新功能(或者预定的发布日期到了),可以基于 develop 建立一个用于产品发布的分支。该分支的创建意味着一个发布周期的开始,也意味着本次发布不会再增加功能——在这个分支上只能修改 bug,做一些文档工作或和发布相关的任务。一切准备就绪后,该分支合并到 master,并用版本号打上标签。

发布分支上的改动还应合并到 develop 分支,因为在发布周期内,develop分支仍在被使用,release 版本中修复的 bug 应同步到 develop 分支。

该分支基于 develop,功能完成后 merge 回 master 和 develop

  • hotfix(用于维护的分支)

发布后的维护工作或紧急修复工作需要使用一个独立的分支。这是唯一可以直接基于 master 创建的分支。一旦问题被修复了,所有的改动应并入 master 和 develop 分支。并使用新的版本号为 master 分支上的提交打上标签。

该分支基于 master ,功能完成后 merge 回 master 和 develop

(2)使用

① 创建 develop 分支
首先给默认的 master 分支配备一个 develop 分支。简单的做法是,在本地仓库创建一个空的 develop 分支,然后把它推动到中央仓库。这样服务器上的中央仓库中有 master 和 develop 两个分支。

$ git branch develop 
$ git push -u origin develop

② 在功能分支上开发功能
小明和小红分别开发功能 A 和 B。以小明为例,他首先需要克隆中央仓库,但由于本地仓库只有一个 master 分支,需要在本地仓库创建 develop 的追踪分支。然后在 develop 分支的基础上创建功能分支 feature/A,然后在功能分支上开发功能。

$ git clone git@github.com:SiXiWanZi/SSHTest.git
$ git checkout -b develop origin/develop // 基于远程仓库 origin 上的 develop 分支在本地创建 develop 分支
$ git checkout -b feature/A develop // 基于 develop分支创建 feature/A 分支

小明将相关代码使用 Git三部曲提交到 feature/A 分支上。

$ git status
$ git add 
$ git commit

经过几次修改,小明觉得他的功能完成了,那么将该分支合并到 develop 上,然后删除该分支。

$ git pull origin develop??
$ git checkout develop
$ git merge feature/A
$ git branch -d feature/A

③ 进行发布前的准备工作
功能开发完成后进入发布阶段,使用一个新的分支进行产品发布的准备工作,包括测试、文档的更新及其他准备工作。一旦创建了这个分支,并把它推送到中央仓库,这次产品发布包含的功能也就固定下来了。任何还处于开发状态的功能只能等待下一个发布周期。

$ git checkout -b release/1.0 develop 

一些准备就绪后,将发布分支上的修改并入到 master(开发准备工作做完后,将其并入 master 进行正式发布) 和 develop(因为修复的 bug 对于正在进行的功能开发是有用的)。

$ git pull origin master
$ git checkout master
$ git master release/1.0
$ git push origin master
$ git pull origin develop
$ git checkout develop
$ git master release/1.0
$ git push origin develop

合并后删除分支。

$ git branch -d release/1.0

④ 正式发布版本
无论什么时候,把一些东西并入 master,都应该随即打上合适的标签。

$ git tag -a 1.0 -m "initial public release" master???
$ git push --tags???

⑤ 发现正式发布版本中的 bug,需紧急修复
为了修复这个 bug,小明基于 master 创建了一个分支 hotfix/C,在该分支上修复 bug 后,把改动合并到 develop 和 master。

$ git pull origin master
$ git checkout master
$ git master hotfix/C
$ git push origin master
$ git pull origin develop
$ git checkout develop
$ git master hotfix/C
$ git push origin develop

合并后,将修复分支删除。

$ git branch -d hotfix/C
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352