分支管理
git branch
列出所有分支,当前分支前面会标一个*号
$ git branch
* dev
master
表示有两个分支,当前分支为dev。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
$ git branch -r
MyName/master
$ git branch -a
* master
remotes/origin/master
上面命令表示,本地仓库的当前分支是master,远程分支是origin/master。
git branch命令的-d选项,用于删除分支(删除分支不能在 被删除分支上 进行)
$ git branch -d test
Deleted branch test (was 64fcede).
git checkout <分支>
切换分支
$ git checkout -b dev origin/master
上面命令表示,在origin/master的基础上,创建一个新分支并切换至新分支。git checkout命令加上-b参数表示创建并切换,即相当于:
$ git branch dev //创建dev分支
$ git checkout dev //切换到dev分支
Switched to branch 'dev'
git merge
合并指定分支到当前分支
$ git merge dev
冲突情况
当为dev进行新的一次提交,切换到master分支,会看到Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'MyName/master' by 1 commit.
(use "git push" to publish your local commits)
接下来为master分支也进行一次新的提交,然后合并dev分支
$ git merge dev
Auto-merging 新建文本文档.txt
CONFLICT (content): Merge conflict in 新建文本文档.txt
Automatic merge failed; fix conflicts and then commit the result.
可以看到git提示txt文件存在冲突,必须手动解决冲突后再提交。此时查看修改的txt
$ cat 新建文本文档.txt
123
<<<<<<< HEAD
master change
=======
dev change
>>>>>>> dev
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
接下来对内容进行修改再提交
git add *
$ git commit -m'conflict fixed'
[master a94df7f] conflict fixed
分支合并情况可用带参数的git log查看
分支策略
版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于日常开发。
除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:
- 功能(feature)分支
- 预发布(release)分支
- 修补bug(fixbug)分支
这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。
功能分支
第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop,然后删除feature分支。
功能分支的名字,可以采用feature-*的形式命名。
预发布分支
它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。
预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Master和Develop分支,然后删除预发布分支。它的命名,可以采用release-*的形式。
修补bug分支
软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。
修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支,然后删除bug分支。它的命名,可以采用fixbug-*的形式。
bug分支特殊情形
假如有个场景,在工作中,接到个bug修复任务,此时你正在dev进行的工作还没有提交也没办法提交(还未完成),注意,未提交状态下切换分支会将状态合并到切换分支。要想将dev正在进行的工作现场保存起来,就需要使用Git提供的 git stash
$ git stash
Saved working directory and index state WIP on dev: d5dd078 working
查看工作区,可以看到是干净的
$ git status
On branch dev
nothing to commit, working tree clean
接下来,就要确定bug在哪个分支,切换到对应分支并创建临时分支
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'MyName/master' by 11 commits.
(use "git push" to publish your local commits)
$ git checkout -b bug
Switched to a new branch 'bug'
完成修复bug后,切换到master分支接着完成合并,最后删除bug分支,bug修复工作便彻底结束。
接下来就要回到原本的dev工作了
git checkout dev
之前的保存的工作现场就用git stash list进行查看
$ git stash list
stash@{0}: WIP on dev: d5dd078 working
可以看到现场被保存在某个地方,接下来有两个方法恢复:
一是用git stash apply,恢复后stash内容不删除,要删除的话需要用git stash drop命令
二是用git stash pop,恢复的同时把stash内容删除。
强行删除还未合并的分支
假如你在开发一个新功能,最好新建一个feature分支,