Git学习记录08

目录

[toc]

chapter(八)

8.1 对分支的理解

在第2章对版本回退说明时,讲到Git将每次提交都创建成一个时间线。而这条时间线就是一个分支,也就是现在唯一有的那个mastermaster被成为主分支,还记得命令git reset HEAD <file>吗? 这里面有个HEAD,它就是指向master.

看下下面这张图,图是盗的: figure8.1 可以很清晰的看到,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 再无耻的盗个图:

figure8.2

有了刚才的演练,看这张图是不是已经很有感觉了!

当你创建新的分支dev时,聪明的Git也创建了一个指针dev,它与master指针都指向最新的提交。 而当切换分支到dev时,HEAD指向到了dev

现在已经切换到了分支dev了,如果我们有提交了一次文件,那dev指针就向前走了一步,而master还是原地不动。

如下图: figure8.3

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分支上干的。再看下这张图: figure8.3

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 --listgit branch可以查看下有那些分支。

命令git checkout <分支名>git switch <分支名>都可以切换分支

命令git merge <分支名>可以合并某分支到当前分支

命令git branch -d <分支名> 可以删除分支

请我喝咖啡

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,您说多少就多少

打开支付宝或微信扫一扫,即可请我喝咖啡哦