学习笔记:插图如果侵权请联系博主删除。
1.什么是分支?
开发软件时,可能有多个人同时为同一个人软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。
Git分支功能可以支持同时进行多个功能的开发和版本管理。
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,可以在同一个数据库里可以进行同时进行多个修改。
可以同时进行:发布版本的历史记录,添加功能的历史记录,修复错误的历史记录
分叉的分支可以进行合并
为了不受其他开发人员的影响,可以在主分支上建立自己专用的分支。
完成工作后,将自己分支上的修改合并到主分支,
因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了。
添加新功能,修改显示动画的错误,添加任务栏,导入各自的分支,然后进行合体。
2.master分支
在数据库进行最初的提交后,Git会建立一个名为master的分支。因此之后的提交,在切换分支之前都会添加到master分支里
3.分支的运用
Git里面可以自由的建立分支,运用规则才可以有效利用分支,介绍两种分支:Merge分支,Topic分支的运用规则。
3.1Merge分支
Merge分支为了可以随时发布release而建立的分支,它还能作为Topic分支的源分支使用,保持分支的稳定状态,如果需要进行更改,通常需要先创建Topic分支,针对该分支,可以使用Jenkins类的工具进行自动化编译以及测试。
通常会将master当作Merge分支使用。
3.2 Topic分支
Topic分支是为了开发新功能或修复Bug等任务而建立的分支。
如果需要同时进行多个任务,需要创建多个Topic分支。
Topic分支是从稳定的Merge分支创建的。完成作业后,要把Topic分支合并回Merge分支
4.分支的切换
如果需要进行切换作业的分支,就需要进行checkout操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容,checkout之后的提交记录将被追加到目标分支。
4.1HEAD
HEAD指向的是现在使用的分支的最后一次更新。通常指向master分支的最后一次更新,通过移动HEAD,可以变更使用的分支。
4.2stash
未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他分支,修改内容会从原来的分支移动到目标分支。
如果checkout的目标分支中相同的文件也有修改,checkout会失败的。
可以先提交修改内容,或者使用stash暂时保存工作树和索引里还没提交的修改内容,可以事后再取出暂存的修改,应用到原先的分支或其他的分支上
5.分支的合并
完成作业后的topic分支,最后要合并回merge分支。
合并分支有2种方法
使用merge或rebase,使用这两种方法,合并后的分支的历史记录会有很大的差别。
5.1merge
使用merge可以合并多个历史记录的流程
如bugfix分支是从master分支分叉出来的
合并bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合并是非常简单的。
***bugfix分支的历史记录包含master分支所有的历史记录,所以通过把master分支的位置移动到bugfix的最新分支上,Git就会合并。这样的合并被称为fast-forward(快进)合并
master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。
需要将master分支的修改内容和bugfix分支的修改内容汇合起来。
合并后的两个修改会生成一个提交。master分分支的HEAD会移动到该提交上。
5.2 rebase
跟merge的例子应用,进行bugfix分支是从master分支分叉出来的。
使用rebase方法进行分支合并,出现下面显示的历史记录。
流程:rebase bugfix分支到master分支,bugfix分支的历史记录会添加在master分支的后面,历史记录成一条线。
移动提交X,Y可能会发生冲突,需要修改各自的提交时发生冲突的部分。
rebase后,master的HEAD位置不变,因此,需要合并master分支和bugfix分支,即是将master的HEAD移动到bugfix的HEAD里。
6.topic分支和merge分支的运用实例
实例进行讲解topic分支和merge分支的操作方法
如需要在开发功能的topic分支操作途中,需要修改bug
如果这时候merge分支还是处于开发功能之前的状态,那么在这里新建修改错误用的主题分支,可以从开发功能的作业独立出来,以便于开始新的工作
完成bug修正工作后,把分支导入到原本的merge分支就可以公开了
回到原本的分支继续进行开发功能的操作
如果需要继续进行操作,发现需要之前修正bug时提交X的内容。
可以选择2种导入X内容的方法,一种是直接merge,另一种是和rebase导入提交X的合并分支
rebase合并分支
导入提交X的内容的状态下继续进行开发功能,有效利用了分支同时进行不同的作业
7.操作分支
7.1事前预备
建立一个新的目录 ,并且在里面建立一个空的数据库。这里我们创建一个名为tutorial的目录。
mkdir tutorial
cd tutorial
git init
Initialized empty Git repository in
在tutorial目录创建一个名为myfile.txt的档案,然后提交。
git add myfile.txt
git commit -m "first commit"
[master (root-commit) a73ae49] first commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 myfile.txt
l历史记录
7.2 建立分支
创建名为issue1的分支
通过branch命令来创建分支
git branch <branchname>
创建名为issue1的分支。
git branch issue1
不指定参数直接执行branch命令的话,可以显示分支列表。前面含有*的就是现在的分支。
git branch
issue1
*master
目前的历史记录
7.3 切换分支
如果需要在新建的issue1分支进行提交,我们需要进行切换到issue1分支。
要执行checkout命令以退出分支
git checkout issue1
Switched to branch 'issue1'
目前历史记录
创建分支并且进行切换
git checkout -b <branch>
切换到issue1分支的状态下提交,历史记录会被记录到issue1分支。在myfile.txt
添加add命令的说明后进行提交
add 把变更录入到索引中
git add myfile.txt
git commit -m "添加add的说明"
[issue1 b2b23c4] 添加add的说明
1 files changed, 1 insertions(+), 0 deletions(-)
目前历史记录:
7.4合并分支
向master分支合并issue1分支的修改
执行merge命令以合并分支
git merge <commit>
将指定分支导入到HEAD指定的分支,先切换master分支,然后将issue1分支导入到master分支里面
git checkout master
Switched to branch 'master'
打开myfile.txt档案以确认内容,然后提交。
在issue1分支进行了编辑上一页的档案,所以master分支的myfie.txt的内容没有更改
git merge issue1
Updating 1257027..b2b23c4 Fast-forward myfile.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
master分支指向的提交移动到和issue1同样的位置。属于fast-forward(快进)合并
打开myfile.txt档案,确认内容
add 把变更录入到索引中
7.5删除分支
既然issue1分支的内容已经顺利地合并到了master分支,可以进行删除了
在branch命令指定-d选项执行,以删除分支
git branch -d <branchname>
执行以下命令以删除issue1分支
git branch -d issue1
Deleted branch issue1 (was b2b23c4).
issue1分支被删除了。可以采用branch命令确认分支是否被删除。
git branch
7.6 并行操作
创建2个分支进行并行操作
创建:issue2,issue3分支,并且进行切换 issue2分支
git branch issue2
git branch issue3
git checkout issue2
Switched to branch 'issue2'
$ git branch
* issue2
issue3
master
在issue2分支的myfile.txt添加commit命令的说明后提交。
add 把变更录入到索引里面
commit 记录索引状态
git add myfile.txt
git commit -m "添加commit的说明"
[issue2 8f7aa27] 添加commit的说明
1 files changed, 2 insertions(+), 0 deletions(-)
然后进行切换到issue3分支
git checkout issue3
Switched to branch 'issue3'
打开myfile.txt档案。
由于在issue2分支添加commit命令的说明,所以issue3分支的myfile.txt里只有add命令的说明。
添加pull命令的说明后提交。
add 把变更录入到数据库里面
pull 取得远程数据库的内容
git add myfile.txt
git commit -m "添加pull的说明"
[issue3 e5f91ac] 添加pull的说明
1 files changed, 2 insertions(+), 0 deletions(-)
实现了commit和添加pull的操作并行进行
7.7 解决合并的冲突
将issue2分支和issue3分支的修改合并到master。
切换master分支后,与issue2分支合并
git checkout master
Switched to branch 'master'
git merge issue2
Updating b2b23c4..8f7aa27
Fast-forward myfile.txt | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
继续进行合并issue3分支。
git merge issue3
Auto-merging myfile.txt CONFLICT (content): Merge conflict in myfile.txt Automatic merge failed; fix conflicts and then commit the result.
产生问题:自动合并失败。由于在同一行进行了修改,所以产生了冲突。myfile.txt内容
add 把变更录入到索引中
<<<<<<< HEAD
commit 记录索引的状态
=======
pull 取得远端数据库的内容
>>>>>>> issue3
在发生冲突的地方,Git生成了内容的差异,做出了修改
add 把变更录入到索引中
commit 记录索引的状态
pull 取得远端数据库的内容
修改完冲突的地方后,重新提交
git add myfile.txt
git commit -m "合并issue3分支"
# On branch master
nothing to commit (working directory clean)
历史记录,因为进行了合并修改冲突部分,所以会重新创建合并修改的提交记录。
(non fast -forward)合并
7.8 用rebase合并
合并issue3分支时候,使用rebase可以使提交的历史显得更加的简洁
现在取消刚才的合并
git reset --hard HEAD~
切换到issue3分支后,对master执行rebase
git checkout issue3
Switched to branch 'issue3'
git rebase master
First, rewinding head to replay your work on top of it... Applying: 添加pull的说明 Using index info to reconstruct a base tree... <stdin>:13: new blank line at EOF. + warning: 1 line adds whitespace errors. Falling back to patching base and 3-way merge... Auto-merging myfile.txt CONFLICT (content): Merge conflict in myfile.txt Failed to merge in the changes. Patch failed at 0001 添加pull的说明 When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To check out the original branch and stop rebasing run "git rebase --abort"
和merge时的操作一样,修改在myfile.txt发生冲突的部分
add 把变更录入到索引中
<<<<<<< HEAD
commit 记录索引的状态
=======
pull 取得远端数据库的内容
>>>>>>> issue3
rebase时候,修改冲突后的提交不是使用commit命令,二十执行rebase命令指定 --continue选项 ,如果需要取消rebase,指定 --abort选项。
git add myfile.txt
git rebase --continue
这样,在master分支的issue3分支就可以fast-forward合并了。切换到master分支后进行合并
git checkout master
Switched to branch 'master'
git merge issue3
Updating 8f7aa27..96a0ff0 Fast-forward myfile.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
最后myfile.txt的最终内容和merge是一样的,但是历史记录: