目录
Git 分支
分支的新建与合并
1. 新建分支
1
2
3
4
5
6
# 新建并切换
$ git checkout -b iss53
# 等价于
$ git branch iss53
$ git checkout iss53
2. 合并分支
情况一:master 可以顺着移动到 hotfix,会快速把 master 指针指向 hotfix 所在
1
2
3
4
$ git checkout master
$ git merge hotfix
# 合并成功删除 hotfix 分支
$ git branch -d hotfix
示意图


情况二:master 与 iss53 分叉开来,Git 会做一些简单的第三方合并
1
2
3
4
$ git checkout master
$ git merge iss53
# 合并成功删除 iss53 分支
$ git branch -d iss53


第二种情况,很可能遇到 合并冲突 的问题,此时需要手动解决这些冲突
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 产生冲突
$ git merge iss53
# 查看冲突文件的未合并状态
$ git status
# 解决冲突
## 手动解决
$ vim index.html
$ git add index.html
$ git status
## 工具解决
$ git mergetool
# 最后确定提交
$ git commit
分支管理
git branch
- -v 带有最后一次提交的分支列表
- –merged 已经合并的分支列表
- –no-merged 没有合并的分支列表
- -d 删除分支(没有合并的分支删除不了)
分支开发工作流
1. 长期分支
只在 master 分支上保留完全稳定的代码,使用其他分支进行开发测试,待到稳定后,合并到主分支上。
事实上我们刚才讨论的,是随着你的提交而不断右移的指针。 稳定分支的指针总是在提交历史中落后一大截,而前沿分支的指针往往比较靠前。
示意图


2. 主题分支
考虑这样一个例子,你在 master 分支上工作到 C1,这时为了解决一个问题而新建 iss91 分支,在 iss91 分支上工作到 C4,然而对于那个问题你又有了新的想法,于是你再新建一个 iss91v2 分支试图用另一种方法解决那个问题,接着你回到 master 分支工作了一会儿,你又冒出了一个不太确定的想法,你便在 C10 的时候新建一个 dumbidea 分支,并在上面做些实验。 你的提交历史看起来像下面这个样子:

现在,我们假设两件事情:你决定使用第二个方案来解决那个问题,即使用在 iss91v2 分支中方案。 另外,你将 dumbidea 分支拿给你的同事看过之后,结果发现这是个惊人之举。 这时你可以抛弃 iss91 分支(即丢弃 C5 和 C6 提交),然后把另外两个分支合并入主干分支。 最终你的提交历史看起来像下面这个样子:

注意
以上全部操作所影响的范围都是在本地仓库
远程分支
查看远程分支的信息
1
2
$ git remote show origin
$ git ls-remote origin
注意区分本地 master 和远程 origin/master 的区别
以下是一个可能遇到的工作模式
-
第一步,克隆远程仓库到本地

-
第二步,本地和远程仓库都有代码变动

-
第三步,本地同步远程仓库的代码

-
第四步,如果有另外一个远程仓库


1. 推送
本地的分支并不会自动与远程仓库同步——你必须显式地推送想要分享的分支。 这样,你就可以把不愿意分享的内容放到私人分支上,而将需要和别人协作的内容推送到公开分支。
1
2
3
4
5
# 自动创建远程分支的名字
$ git push origin serverfix
# 手动指定远程分支的名字
$ git push origin serverfix:awesomebranch
2. 跟踪分支
跟踪分支是与远程分支有直接关系的本地分支
1
2
3
4
5
6
7
8
9
10
11
# 默认创建同名新分支并跟踪
# 以下都是相同效果的
$ git checkout -b serverfix origin/serverfix
$ git checkout --track origin/serverfix
$ git checkout serverfix
# 指定新分支的名字
$ git checkout -b sf origin/serverfix
# 设置已有分支来跟踪远程分支
$ git branch -u origin/serverfix
3. 删除远程分支
1
$ git push origin --delete serverfix
变基(rebase)
变基解释
1
2
3
4
5
6
7
# 将 experiment 变基到 master 分支
$ git checkout experiment
$ git rebase master
# 快进 master 分支到 experiment 节点上
$ git checkout master
$ git merge experiment
如下图所示,变基是找出 c4 在基于 c2 的所有变动,依照提交顺序重新在 c3 的基底上提交,并舍弃之前的 c4 的分支。



另外一个复杂的例子
从 client 节点变基到 master节点
1
2
3
4
5
6
7
# 找出 client 分支在 server 分支上的所有变动
# 然后基于 master 分支进行提交
$ git rebase --onto master server client
# 快进 master 到 client
$ git checkout master
$ git merge client
这种情况适用于,我们想把 client 合并到主分支上,而保留 server 分支(可能需要再完善测试稳定等原因)



如果想进一步把 server 分支变基到 master 节点
1
2
3
4
5
6
7
8
9
10
# server 分支变基到 master 分支
$ git rebase master server
# 快进 master 到 server
$ git checkout master
$ git merge server
# 清理分支(此时client/server都在 master 主干上)
$ git branch -d client
$ git branch -d server


变基的风险
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。