GIT 系列之GIT分支

339 阅读3分钟

这是我参与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参数。