Git 学习文档 [二]

引子

接上篇,主要讲 Git 分支

Git 如果没有分支,我觉得就没什么可说的了

分支是什么?

分支 就是平行线,互不干扰

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

为什么大家喜欢用GIT ,因为GIT切分支是无消耗的,秒切

如果你试过SVN这个烂东西的话

HEAD 是什么?

说分支前要把HEAD 说一下
HEAD 是当前活跃分支的游标,可以理解为你现在在哪,HEAD就指向哪儿,GIT才知道你在哪里

创建分支

1
$ git branch dev

上面的命令,我们在当前分支下新建了一个dev的分支
但是我们当前不指向dev分支

我们的游标 HEAD 还是指向 master

如果这个时候我们需要将游标指向dev分支,我们需要用checkout

1
$ git checkout dev

也可以使用下面的命令

1
$ git checkout -b dev

这条命令也能创建一个dev的分支,而且在创建分支的时候,顺便将游标也指向了dev分支
这条命令相当于

1
2
$ git branch dev
$ git checkout dev

查看分支信息

1
2
3
$ git branch 
* dev
master

合并分支

修改当前分支上的文件
readme.md
添加一行

1
Git create branch

然后提交

1
2
3
4
$ git add readme.md
$ git commit -m"change readme"
[dev ad12e14] change readme
1 file changed, 1 insertion(+)

然后我们切回master分支

1
2
$ git checkout master
Switched to branch 'master'

这个时候如果查看readme.md 会发现 新加的那行信息不见了
因为那是提交在dev分支上的,master分支上没有

合并分支

1
2
3
4
5
$ git merge dev
Updating ba32a67..ad12e14
Fast-forward
readme.md | 1 +
1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

删除分支

1
2
$ git branch -d dev
Deleted branch dev (was ad12e14).

解决冲突

合并分支不会总是没有任何问题的

冲突一般都出在合并分支上
从远程仓库更新代码其实也是将远程仓库的代码和本地仓库的代码进行一次合并

准备新的feature1分支,继续我们的新分支开发:

1
2
$ git checkout -b feature1
Switched to a new branch 'feature1'

修改readme.md最后一行,改为:

1
Git Creating branch is quick AND simple.

在feature1分支上提交:

1
2
3
4
$ git add readme.md 
$ git commit -m "AND simple"
[feature1 a8ea57c] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)

切换到master分支:

1
2
3
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

在master分支上把readme.md文件的最后一行改为:

1
Git Creating branch is quick & simple.

提交

1
2
3
4
$ git add readme.md 
$ git commit -m "& simple"
[master 834ee23] & simple
1 file changed, 1 insertion(+), 1 deletion(-)

现在 master 和 feature1 都有自己的提交信息

两边都产生的修改

尝试合并分支

1
2
3
4
git merge feature1
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.

这个时候就需要手动解决这些冲突,然后再提交

使用git status 也可以发现问题

1
2
3
4
5
6
7
8
9
10
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: readme.md
#
no changes added to commit (use "git add" and/or "git commit -a")

查看文件内容

1
2
3
4
5
6
Git 
<<<<<<< HEAD
Git Creating branch is quick & simple.
=======
Git Creating branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

1
2
Git 
Git Creating branch is quick and simple.

然后再提交

1
2
3
$ git add readme.md 
$ git commit -m "conflict fixed"
[master 98aa17e] conflict fixed

这样就合并了冲突了

更多

1
2
3
4
5
6
7
8
9
10
11
12

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>