这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
分支简介
分支是什么呢? 你可以理解成树枝。 分支可以用来干什么呢? 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
假如,你开发了一个支付宝,然后想添加一个扫福的功能,你总不能直接在你的版本库里乱改吧,这个版本正常用着呢,万一改错,不能用了就麻烦了。话说不是有clone么,克隆一份就好了,再怎么改也不会出问题,但是,你在开发过程中,完成一部分工作后总得提交到远程仓库吧。(有人说,不用提交啊,自己在本地仓库搞就好了。注意,协同作业)
这个时候就用到分支了。把仓库看成一棵树,随着一次次的commit,这棵树越长越高,分支就向树枝一样。在分支上可以随便撒野,不会搞坏主分支。你可以把你的修改先提交到自己创建的分支上,等你把这个扫福的功能开发完了,还能合并到主分支上。
分支的创建
在我们创建好仓库后,版本库的状态是下面这样的,其中的[A],[B],[C] 代表一个commit
HEAD->master-->|
|
[A]-->[B]-->[C]
其中 master 代表的是主分支,而HEAD代表的是当前分支,由于只有一个分支所以HEAD指向的是 master 我们使用下面的命令创建一个分支,然后切换到新建的分支。
git branch mybranch
git checkout mybranch
你也可以使用一条命令,创建并切换
git checkout -b mybranch
查看下分支
git branch
master
* mybranch
现在git仓库的状态是下面这样的
master-->|
|
[A]-->[B]-->[C]
|
|<--mybranch<--HEAD
然后我们再次对Hello.java文件做一下修改
public class Hello{
public static void main(String[] args){
}
public void addBranch(){
}
}
然后commit到版本库
分支的合并
现在git仓库的状态是下面这样的
master-->|
|
[A]-->[B]-->[C]~~>[D]
|
|<--mybranch<--HEAD
然后切换到 master 分支
git checkout master
现在git仓库的状态是下面这样的
HEAD-->master-->|
|
[A]-->[B]-->[C]~~>[D]
|
|<--mybranch
合并到 master 分支
git merge mybranch
执行结果
Updating 28c1cc8..11d62a7
Fast-forward
Hello.java | 3 +++
1 files changed, 3 insertions(+)
现在git仓库的状态是下面这样的
HEAD-->master-->|
|
[A]-->[B]-->[C]~~>[D]
|
|<--mybranch
分支的删除
git branch -d mybranch
解决冲突
快速合并的速度确实很快,但是前提是两个分支没有冲突。
重新创建新的分支
git checkout -b newbranch
修改 readme.txt 文件
hello git
hello git 2.0
添加 hello.java 文件
在 newbranch 分支上做的修改
提交
git add readme.txt
git commit -m "newbranch 修改"
[newbranch b8ac4ad] newbranch 修改
1 file changed, 1 insertion(+)
切换到 master 分支
git checkout master
打开 readme.txt 文件,发现并没有改变,因为我们的修改不是在master分支上的。
添加一行
hello git
hello git 2.0
添加 hello.java 文件
在 master 分支上做的修改
提交
git add readme.txt
git commit -m "master 修改"
[master 80c56bf] master 修改
1 file changed, 1 insertion(+)
现在 两个分支上对一个文件的同一个地方(同一行)做了不同的修改,是没办法快速合并的。
合并下试试
git merge newbranch
git merge newbranch
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
果然,git说, readme.txt 文件冲突了,修复后重新提交。 使用 git status 看看状态
git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git说 对 readme.txt 共同的两个修改
我们直接打开 readme.txt 文件看看
hello git
hello git 2.0
添加 hello.java 文件
<<<<<<< HEAD
在 master 分支上做的修改
=======
在 newbranch 分支进行修改
>>>>>>> newbranch
其中 <<<,===,>>>是分割线。 我们修改一下
hello git
hello git 2.0
添加 hello.java 文件
修复了冲突
然后提交 git add readme.txt git commit -m "修复了冲突"
[master 9f1e5f5] 修复了冲突
好了,解决。现在git已经将两个分支自动合并了。你可以使用
git log --graph
查看分支图
然后删除 newbranch 分支
git branch -d newbranch
Deleted branch newbranch (was b8ac4ad).
合并的方式选择
从上面我们知道,分支的合并有两种方式,一种是 快速合并,一种是解决冲突的合并。
两种合并的区别是
快速合并要保证没有冲突,合并完删除分支后,会丢掉分支信息。
冲突合并会保留分支信息,Git会在merge时生成一个新的commit。
可以使用--no-ff参数强制禁用快速合并
git merge --no-ff -m "禁用快速合并" newbranch
因为需要重新生成一个 commit 所以需要添加-m参数。