前言
在上一讲中我们讲到了git中时间线和提交commit的关系,还介绍了master,HEAD,branch的基本概念。这一讲内容我们学习非常重要的对分支的操作,其中包括:创建分支、分支切换、删除分支以及分支节点的切换。
课前准备:
https://download.csdn.net/download/qq_17204647/86969196
下载这个资源然后解压,运行文件中的下图文件,(右击-git bash here-输入下面代码)
bash make_math_repo.sh
在同一目录下会生成math文件夹,里面有本章所有操作后的样子。
8.1 分支简介
几乎所有的版本控制系统都在某种形式上支持分支,但是在大多数版本控制系统中,分支的使用是较为低效的过程----常常需要完全创建一个源代码的副本。
但是Git的分支模型却极为轻量,就算是大型项目,创建分支也能在瞬间完成。在不同分支间的切换操作也是一样轻便。
Git分支的创建和合并功能因此也频繁被使用。
之前我们曾学过,当我们创建git仓库时(Repository),Git 会自动创建默认名为master的分支。而在这一章节,我们会看到分支会像树一样,从下往上生长。
8.1.1 master分支不是必要的分支
当我们创建git的时候,git默认给我们创建了一个名为master的分支,因此很多初学git的人认为这是一个特殊的,重要的分支。实际上,这个分支和我们建立的其他所有分支一样,没有什么特殊的,我们甚至可以删除它!
mkdir empty //创建empty文件夹
cd empty //进入文件目录
git init // 创建git仓库
touch foo //创建名为foo的文件
git add foo
git commit -m "committing the file foo" //提交修改
git branch //查看当前所有分支
以上操作后,结果如图
其中星号*代表当前所在分支。
git branch dev //创建名为dev的分支
git branch
结果如图
我们先切换分支后,将master分支删除
git checkout dev //切换分支
git branch -d master //删除master分支
git branch
结果如图
我们可以看到,master分支被删除。但是由于dev分支是在master分支建立并提交foo之后节点创建的,因此dev分支在这里享有和master相同的内容。
因此,请记住,master不是特殊分支,重要的分支是你在项目中,自己决定的。
8.2创建和删除分支
8.2.1 创建分支
在我们的项目中,主分支上的提交,是主要的,干净可运行的代码。
创建分支一般有两种情况,一是我们需要给项目添加新的代码,二是对之前代码进行修改。
第一种情况,如果我们添加新代码在主分支上进行,极有可能导致整个系统崩溃,而且添加新的代码功能常常需要一段时间才能完成。而这段时间,我们不可能让主分支上的代码暴露,完全处于停滞状态。
第二种情况,对于修改bug或是修改代码,常常会引出其他意想不到的bug(如复合式bug)
这个时候,我们就需要创建分支,将我们的工作区域和主分支的工作区域分隔开来。
8.2.1.1 为了添加新内容创建分支
git branch //查看分支
git branch 分支名 //创建新分支
git checkout 分支名 //切换到指定分支
在当前的节点,输入如下代码,这样我们就得到一个名为new_feature新分支
git branch new_feature
输入gitk可以看到如下图
然后转到新建的分支,新建文件并提交
git checkout new_feature //切换到new_feature分支
echo "new file" > newfile.txt
git add newfile.txt
git commit -m "Adding a new file to a new branch"
echo "another new file" > file3.c
git add file3.c
git commit -m "Starting a second new file"
输入gitk,可以看到如下图
上面的查看是在GUI中查看的分支情况,实际上在命令行窗口也可以查看,输入
git log --graph --decorate --pretty=oneline --all --abbrev-commit
显示如下图
tips:上面git的命令行太长,而查看提交的分支情况又是常用的命令,因此我们可以用自定义别名来将上面命令变短,操作如下
我们选用lol 作为自定义的git命令别称,然后输入如下代码
git config --global alias.lol "log --graph --decorate --pretty=oneline --all --abbrev-commit"
测试如图:
注意:在这里我们需要明确一点,分支间是相互独立的。
我们可以在master分支上进行一次修改并提交,
echo "A small update." >> readme.txt
git commit -a -m "A small update to readme."
在gitk中,为了能够查看所有分支情况,在view-new view
选择黑线框并apply,得到如下显示
其中加粗显示的为当前分支,在分支名位置右击,可以如下显示,对分支进行操作
还有一种更明显的方式能够比较两个不同的工作环境,输入下面代码,并查看工作目录
git checkout master
git checkout new_feature
两个分支下,工作目录分布如下图
(master分支下文件) (new_feature分支下文件)
8.2.1.2 修改代码(更常见)
直接转到你需要修改代码的节点,创建分支
git branch 新分支名 SHA1 ID
还有一种更快创建分支的命令
git checkout –b 分支名 start point //创建分支同时让该分支为当前分支
其中start point可以是分支名,SHA1 ID或者是一个tag
实践输入如下命令
git branch another_fix_branch 7eb1b19 //在7eb1b19节点创建新分支
git checkout -b fixing_readme another_fix_branch //在another_fix_branch所在节点创建新分支
结果如下图
8.2.2 删除分支
当你创建分支,一般是因为你想尝试一些东西。而有时候这些尝试失败了,则需要删除分支。
git branch –d 分支名 //删除指定分支
删除分支时,记住要先切换到主分支再进行删除操作,不然会显示错误
注意删除这个操作没有自动防故障装置,很容易便可以删除。
但是如果你误删了需要的分支,可以通过以下操作进行补救。
git branch -d fixing_readme //删除fixing_readme 分支
git branch -d another_fix_branch //删除another_fix_branch 分支
git checkout -b another_fix_branch 7eb1b19 //恢复误删分支
如果你误删比较久,找不到SHA1 ID,可以输入
git reflog
然后能够显示所有对分支的操作。
8.3 分支安全切换
如果你是在分支中仅增加了新文件,则可以切换到其他分支。
但是如果对分支内容进行修改更新时,如果没有提交更新时无法切换到其他分支的。
但是如果没有完成修改不想提交这个修改,又想切换到其他分支时,可以使用git stash 暂时保存你的修改。这样你就可以切换到其他分支。
回到原先分支继续修改,则可以通过
git stash list //查看stash里内容
git stash pop //将stash内修改取出,变成和git stash命令前一样
这里的实践操作可以在课前准备生成的git仓库下进行操作
git checkout another_fix_branch //切换到another_fix_branch 分支
在math.sh文件中添加一行 c=0 ,切换到master分支
git status
git checkout master
出现如图问题,不能切换分支。
输入 git stash,重复上述命令,顺利切换分支!
而当我们回到原先分支,输入git stash pop命令就可以继续先前操作。
(pop前代码行) (pop后代码行)
总结:
本章介绍了git分支的创建和删除操作,还介绍了误删分支时,如何恢复分支。简单讲解了git stash在分支切换时,挂起修改的作用。
版权归原作者 莫蘭 所有, 如有侵权,请联系我们删除。