[toc]
chapter(八)
8.1 对分支的理解
在第2章对版本回退说明时,讲到Git将每次提交都创建成一个时间线。而这条时间线就是一个分支,也就是现在唯一有的那个master。
master被成为主分支,还记得命令git reset HEAD <file>
吗?
这里面有个HEAD
,它就是指向master
.
看下下面这张图,图是盗的:
可以很清晰的看到,master
是指向最新提交,而HEAD
是指向master
,而那三个圈指的就是每次提交的内容,每提交一次master
就会向前移动,这样就串成了一条时间线。
比如某天,你想回退某个版本,直接改变指向的位置,不久完了。
之前我们的分支只有一个master
,可以我们可以创建别的分支啊!
创建分支的命令:git branch <分支名>
toto@pc:~/code/testGit$ git branch dev
toto@pc:~/code/testGit$ git branch --list
dev
* master
根据上面代码块,先是创建了一个分支,然后使用命令git branch --list
查看了下,有那些分支。
可以看到,有两个分支:dev
和* master
,dev
是刚刚创建的分支,而master
是主分支。
可为什么master
前面要有一个*呢?
我想聪明的你,已经猜到了!
是的。那个*
代表当前的HEAD
指向的是master
我们在试着切换下分支,使用命令:git checkout <分支名>
toto@pc:~/code/testGit$ git checkout dev
Switched to branch 'dev'
toto@pc:~/code/testGit$ git branch --list
* dev
master
看到没!切换分支后*
跑到了dev前面!这是HEAD
指向的就是dev
再无耻的盗个图:
有了刚才的演练,看这张图是不是已经很有感觉了!
当你创建新的分支dev
时,聪明的Git也创建了一个指针dev
,它与master
指针都指向最新的提交。
而当切换分支到dev
时,HEAD
指向到了dev
。
现在已经切换到了分支dev
了,如果我们有提交了一次文件,那dev
指针就向前走了一步,而master
还是原地不动。
如下图:
toto@pc:~/code/testGit$ vim helloword.cpp
toto@pc:~/code/testGit$ cat helloword.cpp
#include<iostream>
int main()
{
std::cout << "This is a program that test Git!" << std::endl;
std::cout << "test git status" << std::endl;
std::cout << "test git status2" << std::endl;// 新增的一行
std::cout << "test new branch!" << std::endl;
int a = 1;
return 0;
}
toto@pc:~/code/testGit$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: helloword.cpp
no changes added to commit (use "git add" and/or "git commit -a")
上面代码,我修改helloword.cpp
toto@pc:~/code/testGit$ git add helloword.cpp
toto@pc:~/code/testGit$ git commit -m "test new branck"
[dev 828ea5e] test new branck
1 file changed, 1 insertion(+)
toto@pc:~/code/testGit$ git status
On branch dev
nothing to commit, working tree clean
上面代码,我将helloword.cpp
提交上去。
请记住,现在提交到了dev
中,而master指向上面那个版本。就如上图所示。
假设dev
的工作已经完成了,那请问现在如何把两个分支进行合并呢?就是把dev
合并给master
非常简单,我们只需要把master
指针指向dev
当前的提交,就行。
toto@pc:~/code/testGit$ git checkout master
Switched to branch 'master'
toto@pc:~/code/testGit$ git branch
dev
* master
toto@pc:~/code/testGit$ cat helloword.cpp
#include<iostream>
int main()
{
std::cout << "This is a program that test Git!" << std::endl;
std::cout << "test git status" << std::endl;
std::cout << "test git status2" << std::endl;// 新增的一行
int a = 1;
return 0;
}
上面的代码块,我现实切换了分支到master
,然后查看了下代码helloword.cpp
可以发现helloword.cpp
怎么没有改变啊!
我想你已经知道原因了!
那就是因为刚才所有的操作是dev
分支上干的。再看下这张图:
master
是指向上一版本的,当你切换分支后,master
还是指向上一版本,那怎么可能改变呢?
现在把dev
分支合并到master
分支上.命令:git merge dev
toto@pc:~/code/testGit$ git merge dev
Updating 05e641d..828ea5e
Fast-forward
helloword.cpp | 1 +
1 file changed, 1 insertion(+)
toto@pc:~/code/testGit$ cat helloword.cpp
#include<iostream>
int main()
{
std::cout << "This is a program that test Git!" << std::endl;
std::cout << "test git status" << std::endl;
std::cout << "test git status2" << std::endl;// 新增的一行
std::cout << "test new branch!" << std::endl;
int a = 1;
return 0;
}
看到没,合并后helloword.cpp
就是最新更改的版本了!
上面的提示信息Fast-forward
指的是这次合并是快进模式,也就是把master
指针直接指向dev
。
ok!
假设我现在不想要分支dev
了,我要把他删掉。
采用命令:git branch -d dev
toto@pc:~/code/testGit$ git branch -d dev
Deleted branch dev (was 828ea5e).
toto@pc:~/code/testGit$ git branch
* master
可以看到,已经删除掉了!
8.2 总结
命令:git branch <分支名>
可以创建分支
命令git branch --list
或git branch
可以查看下有那些分支。
命令git checkout <分支名>
或git switch <分支名>
都可以切换分支
命令git merge <分支名>
可以合并某分支到当前分支
命令git branch -d <分支名>
可以删除分支