案例分析
我们在完成一个项目时,不可能是“单线程”开发的,很多时候任务是并行的,举个栗子:项目2.0版本上线了,现在要着手开发3.0版本,同时2.0版本可能还有一些bug需要修复,这些bug修复之后我们可能还会发2.1,2.2,2.3这些版本,我们不可能等所有bug都修复完了再去开发3.0版本,修复2.0的bug和开发3.0的新功能是两个并行的任务,这个时候我们3.0的功能开发直接在master分支上进行肯定不合适,我们要保证有一个稳定,可以随时发版本的分支存在(一般情况下这个角色由master分支来扮演),此时我们就可以灵活的使用Git中的分支管理功能:
1.创建一个长期分支用来开发3.0功能,假设这个分支的名字就叫v3,我们在v3上添加新功能,并不断测试,当v3稳定后,将v3合并到master分支上。
2.创建一个特性分支用来修复2.0的bug,一旦bug修复成功,就将该分支合并到master上,一旦发现新bug,就立马再创建分支进行修复,修复成功之后再合并。
以上两个步骤同步进行,这在Svn中简直是不可想象的,因为Svn的分支管理太low,而Git能够让我们做到随心所欲的创建、合并和删除分支。
查看分支
我们可以通过 git branch 命令来查看当前仓库有哪些分支,而我们处于哪一个分支中,如下:
这里显示当前仓库只有一个master分支,这是git默认创建出来的,master前面的 * 表示我们当前处于这一个分支中。
分支创建和切换
我们可以利用 git branch <分支名> 命令来创建一个分支,然后利用 git checkout <分支名> 来切换分支,如下:
还可以通过 git checkout -b <分支名> 来一步到位,创建并切换分支,如下:
$ git checkout - # 切换回上一个分支
分支合并
首先切换到four分支中,由于four分支和three分支是从master分支中创建出来的,所以此时four分支、three分支的内容和master分支的内容是一致的,然后我在three分支中向test.txt文件添加一行内容并提交,最终可以看到 three分支中的test.txt和master分支中test.txt的内容就不相同了,具体操作如下:
上图展示了此时master分支和 three 分支的不同,现在我通过 git merge --no-ff <分支名> 命令将 three 分支合并到master分支上。其中—no-ff 表示强行关闭fast-forward方式,fast-forward方式表示当条件允许时,git直接把HEAD指针指向合并分支的头,完成合并,这种方式合并速度快,但是在整个过程中没有创建commit,所以如果当我们删除掉这个分支时就再也找不回来了,因此在这里我们将之关闭。
想要合并分支,我们先切换到master分支上,然后执行 git merge --no-ff three 命令即可完成分支合并,如下图:
合并成功后,我们看到master分支上的文件中已经有了three分支中更新的内容了。
git merge 合并分支时如果出现冲突还是先重新编辑冲突文件,编辑完成之后,再执行git add 和git commit即可。
以图表方式查看分支
通过 git log --graph 命令来直观的查看分支的创建和合并等操作,如下图:
解决冲突
大多数情况下我们都是要解决冲突的,解决之后继续提交。
rebase合并
(1)远程fetch的代码,本地没有修改,直接rebase即可;
(2)若本地对文件修改,没有add,rebase时,会提示“Cannot rebase: You have unstaged changes.Please commit or stash them.”,add后没有commit,会提示“Cannot rebase: Your index contains uncommitted changes.Please commit or stash them.”。commit后,如果没有修改同一文件,rebase不会冲突。
(3)若本地对同一个文件修改,commit后,rebase时,有2种情况:
① 如果没有修改同一位置,则可以rebase,不会产生冲突;
② 如果修改了同一处,则rebase时会出现冲突,也不用怕,此时git已经进行了合并,只是没有应用自己的提交,解决办法:修改冲突的文件,然后执行git add xxx和 git rebase --continue操作即可。如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态,如何解决,后续再补充。
merge合并
merge合并也可能存在冲突,解决冲突与rebase相似,处理完冲突文件后,重新提交即可。
冲突总结
- 修改同文件不同处,rebase和merge合并不会冲突
- 修改同文件同一处,合并会冲突,解决方式:rebase,解决冲突,执行add+rebase continue;merge,解决冲突,重新提交
删除分支
删除分支命令:
$ git branch -d <分支名> #没事别乱删
退回到之前的状态
我们可以通过如下命令来回到之前的状态:
$ git rebase --abort
其它文章:
Git 基本操作
git stash工作区储藏
Git 关联远程仓库GitHub