Introduction
通常一个仓库会有两个主分支master和develop:
master分支(默认创建的master分支)用来做release,develop分支用来做日常开发。
当软件在develop分支上开发到一定阶段,并通过测试达到稳定阶段的时候,我们会把这个时候develop分支上的软件merge到master(release一个新的版本),然后打上一个tag标记一个版本号。
所以我们从来不到master分支上进行开发,master仅仅是用来进行release的,master上永远都是保持最稳定的代码的版本。
另外开发过程中还会存在一些临时性分支:
- 功能(feature)分支
- 预发布(release)分支
- 修补bug(bug)分支
这些分支通常用完后删除。
关于git分支管理模型有一篇经典文章对此描述非常详细:A successful Git branching model,这篇文章实在太牛逼了竟然有完整翻译版本:介绍一个成功的 Git 分支模型。
Branch基本操作
git branch <branch> | 新建分支 |
git checkout –b <branch>
|
新建并切换到新分支 |
git checkout –b <branch> <existingBranch>
|
新建并切换到新分支-基于现有分支 |
git checkout <branch>
|
切换到新分支 |
git branch –a | 查看现有分支 |
git log --graph | 分支图形式查看历史 |
git merge <branch> | 将branch分支merge到当前分支 |
git cherry-pick <commit_id> | 将指定的某次提交(任意分支的任意一次提交)merge到当前分支上来 |
git branch -d <branch> | 删除分支 |
git branch –m <branch> <newName> | 重命名分支 |
Merge branch
比如将develop上更改merge到master上:
$ git checkout master
$ git merge --no-ff develop
这里加上--no-ff非常推介,git merge的默认形式是-ff(fast forward),不会在途中产生Merge branch ‘develop’这个节点,相当于隐藏了部分仓库操作信息,对回溯历史不利。
Merge branch的指定文件
上面讲的是最常规的用法,所有branch都是在开发同一个软件。
但是遇到有的人一个仓库中软件开发到一定阶段就产生了两个分道扬镳的Branch,两个Branch用在不同场景。
两个场景下该软件大部分代码是形同的,然后小部分是不同的,各自有自己的特殊需求,相当于产生了一个额外的定制版本。
本来好的办法是把软件做到兼容两个场景,但是有的时候这样做真很困难;有的时候开发人员水平并不是水平有限,用这种傻瓜方式能满足需求为什么要花心思去设计一个复杂的兼容架构呢。
但是这就出现了一个问题,两个Branch分道扬镳后,有一部分代码是两个branch相同的,如果你在这个branch发现了bug,想要merge到另一个branch会遇到问题,常规的merge操作或者cherry-pick操作是直接合并整个仓库,对于两个branch中各自私有的特性代码我们是不想要合并的。这就提出了将一个branch的制定文件或者文件夹merge到另外一个branch的需求,暂时git不支持这样的merge操作.
但是网友提出了checkout命令来实现这个操作:
如我有一个仓库有两个分支master和newBranch,我想把newBranch中tag vB0.0.2指向的那次提交中 C:RepoHelloGitsourceProgram.cs这个文件merge到master中
$ git checkout master
$ git checkout <harsh Of vB0,0,2> <file>
但是这种方法实际上是从vB0.0.2那次commit中取出这个文件强行覆盖了当前的这个文件,这样的作法非常危险。
更加安全的做法是(如上图所示):
1. 基于master新建一个名叫masterTemp的hotFix分支
2. 将newBranch给merge到masterTemp上来
在merge过程中或merge后需要做如下处理
- 如果某个文件在master和newBranch中都经过了修改,在merge过程中会产生冲突,自己根据需要保留或丢弃某一个分支的修改即可
- 如果在newBranch上新加了某个文件,则会自动被添加merge后的masterTemp分支上,你需要在merge后查看新添加的文件,如果这些文件是你想要加入到master的则保留;如果这些文件是newBranch中特有的不用加入到master的话你需要进行手动删除
- 如果在newBranch上删除了某个文件,则merge后的masterTemp分支上该文件将会小时,你需要在merge后查看被删除的文件,如果这些文件删除是你想要加入到master的则接受,否则你需要手动从把该文件从之前版本中checkout出来;
3. 将merge并处理后的masterTemp再merge到master上来
4. 删除masterTemp分支
hotFix分支使用完后边不再有存在的价值了
远程分支操作
git remote -v | 查看远程仓库地址 |
git remote rm origin
|
删除远程仓库地址 |
git remote add origin url
|
配置远程仓库地址 |
git branch --set-upstream-to=origin/remoteBranchName localBranchName
|
绑定远程分支 |