1.分支的理解与好处
1.1 理解什么是分支
1.当我们初始化一个git仓库时,默认就会创建一个名为
master
的分支,我们习惯上称其为 主分支;
2.加如在开发过程中,有多个任务并行进行或某个版本需要进行bug修复时,就需要以某个提交历史版本为基础,创建一条或多条新的分支,用于进行对应的任务;
仅有一条
master
主分支的提交历史如图所示:
有多个分支的提交历史如图所示:
1.2 理解为什么要用分支
使用分支有如下好处:
1.多任务并行开发时,可以提高开发效率;
2.各个分支在开发过程中相互独立,如果某一个分支开发失败不会对其他分支产生影响。
失败的分支直接删除即可。
2.分支的基本操作命令
2.1 查看分支 【git branch】
git branch : 仅查看分支名称
git branch -v : 查看分支名称+当前版本号+提交备注
【注】:当前所在分支会在分支名称前用绿色的*
号标注出来
2.2 创建分支 *【git branch 新分支名称】
git branch 新分支名 : 以当前分支HEAD 指针指向的版本为基础版本,创建新的分支;
git branch 新分支名 提交版本号 : 以指定的提交版本号为基础版本,创建新的分支;
git branch 新分支名 已存在分支名 : 以指定的 已存在分支的HEAD指针指向的版本为基础版本,创建新的分支。
1.git branch 新分支名
2.git branch 新分支名 执行提交版本
3.git branch 新分支名 旧分支名
2.3 切换分支 git checkout 目标分支名称
切换分支之前,确保当前分支已经是提交状态。即
工作区、暂存区、版本库三者之间状态一致
。
当 工作区、暂存区、版本库三者之间的状态不一致时,请参考第三节 异常处理-切换分支被拒绝
操作步骤。
切换分支的命令为 :
git checkout 目标分支的名称
具体的操作如下图所示:
2.4 删除分支
1.
git branch -d 分支名
: 删除一个已经完成了的分支。并且当前位置不能在 被删除的分支上。 被删除分支的所有提交都合并到了当前分支上。
2.
git branch -D 分支名
: 强制删除一个分支。当前位置不能在被删除的分支上。 被删除分支 存在独立的提交没有合并到当前分支上来。
0.不可在当前分支上删除当前分支
-d 和 -D 参数都不可以!
1.1 git branch -d 【被删除分支没有独立提交的时候】
1.2 git branch -d 【被删除分支有自己的独立提交没有合并的时候】
2.1 git branch -D
2.5 合并分支 git merge(*)
情景:某一个分支上的功能开发完成或bug修改完成,需要合并到主分支上来,合并完成之后,主分支上就包含了功能分支或bug分支上的内容。
合并分支的命令是 :
git merge 分支名称
具体的操作步骤:
0.预备工作:查看master分支的提交历史和当前文件的状态;
1.创建新的分支 feature-b :git branch feature-b
;
2.切换到新的分支 feature-b :git checkout feature-b
;
3.在feature-b分支上进行开发操作,并完成版本的提交;
4.切换到主分支 master 上 :git checkout master
;
5.合并分支 feature-b :git merge feature-b
;
6.合并成功后查看日志与文件内容,确认合并成功。
3.分支的异常处理-切换分支被拒绝
拒绝时的提示 :
error: Your local changes to the following files would be overwritten by checkout: b.txt Please commit your changes or stash them before you switch branches. Aborting
拒绝切换分支产生的情景:
**有两个分支,且二者的提交版本已经不同了。**
3.1 模拟切换分支被拒绝的产生
1.确保两个分支的提交历史已经不同;
2.在其中一个分支上进行修改 : 仅修改文件 或 修改文件+提交到暂存区;【注意】此处修改的文件,须在切换目标分支上也存在,即切换动作会导致二者的冲突时,才会出现切换分支被拒绝的情况。
而 如果是新建一个文件后再切换分支,则不会出现此问题。3.切换到另一个分支上
3.2 解决方案一:提交并切换
将当前分支上的修改完成一次提交后再进行切换:
git add .
: 将修改添加到暂存区
git commit -m "xxx"
: 将暂存区提交到版本库,完成一次提交
git checkout target-branch-name
:再次执行切换命令
3.2 解决方案二:放弃修改并强行切换
使用参数 --force 执行强制切换动作,这样做会令这一部分的修改被覆盖。
git checkout --force target-branch-name
: 强行切换到目标分支上
3.3 解决方案三:储藏修改并切换
git stash
: 将修改暂存
git stash pop 暂存记录标识
: 将具体的某一次暂存的数据恢复
git stash list
: 查看暂存的列表
4.分支的异常处理-合并冲突
4.1 冲突产生的条件
当不同分支上的同一个文件的同一行发生了不同的修改时,git在合并分支的时候就无法确定哪一个是正确的,此时就会产生合并冲突。
4.2 模拟冲突的产生
1.准备两个分支
master分支
和feature-c 分支
,两个分支初始状态一致;
2.修改master 分支
上的c.txt
文件的第一行
,并完成提交;
3.切换到feature-c分支
上;
4.修改feature-c分支
上的c.txt
文件的第一行
,并完成提交;
5.切换到master分支
上,进行合并feature-c分支
。
此时:冲突出现!
4.3 查看冲突的具体表现
表现一:文本提示冲突,当前状态 变成了
分支名|MERGING
,如master|MERGING
如下图中,提示信息明确指出,冲突在c.txt
文件中
表现二:冲突文件中内容的冲突标志
在冲突存在的文件中,会将双方的修改都展示出来
表现三:查看状态,提示存在两个修改
4.4 编辑解决冲突
当出现合并冲突的时候,需要我们手动进行合并,并完成一次提交。
此时才算是将冲突解决完成。
4.5 查看合并的提交历史
5.分支的特殊操作-恢复被删除的分支
当我们删除一个分支的时候,git只是删除了指向相关提交的指针,该提交的对象仍然在版本库中。
因此,只要我们直到被删除的分支的散列值的信息,就可以恢复被删除的分支。
【实质:在某次提交的基础上,创建了一个同名的分支】
操作步骤:
1.git reflog 查看散列值的信息;
2.git branch 命令恢复。
6.分支的操作补充-创建并同时切换分支
直接使用如下命令即可:
$ git checkout -b 新分支的名字
7.分支的操作补充-取消合并
在合并分支出现冲突时,往往需要手动进行文件的修改,及文件的合并,在此过程中,如果不慎手动修改出了错,或者直接想取消合并的时候,就可以直接使用下面的命令:
$ git reset --merge
此命令会直接将
git merge
动作取消
8.完成
Congratulations!
You are one step colser to success!