热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Git分支管理——创建、合并、删除分支

几乎所有的版本控制都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的分支模型成称为它的“必杀技特性”,也正因为这一特性,使得Git

几乎所有的版本控制都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

Git的分支模型成称为它的“必杀技特性”,也正因为这一特性,使得Git从众多版本控制系统中脱颖而出。Git处理分支的方式是难以置信的轻量,创建新的分支这一操作是秒级完成的,并且在不同分支之间的切换操作也是一样便捷。

Git的分支,其实本质上仅仅是指向提交对象的可变指针。Git的默认分支是master。在多次提交操作之后,其实我们已经有一个指向最后那个提交对象的master分支。他会在每次的提交操作中自动向前移动。


实际工作中我们可能会遇到一个下面这个情况:



  • 开发某个网站。

  • 为实现某个新的需求,创建一个分支。

  • 在这个分支上开展工作。

  • 正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:

  • 切换到你的线上分支(production branch)。

  • 为这个紧急任务新建一个分支,并在其中修复它。

  • 在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。

  • 修改后切换回你最初工作的分支上,继续工作。


1、初始化一个目录并声明用户及邮箱地址

[root@git /]# mkdir /git
[root@git /]# cd git/
[root@git git]# git init
Initialized empty Git repository in /git/.git/
[root@git git]# ls -a
. .. .git
[root@git git]# git config --global user.name admin
[root@git git]# git config --global user.email admin@admin.com

2、创建、快速合并及删除分支

[root@git git]# echo "aaaa" > branch.txt
[root@git git]# git add branch.txt
[root@git git]# git commit -m "第一次提交From master"
[master (root-commit) b9f1465] 第一次提交From master
1 file changed, 1 insertion(+)
create mode 100644 branch.txt
#创建一个分支并进入新建的分支
[root@git git]# git checkout -b dev
Switched to a new branch 'dev'
[root@git git]# git branch #查看当前所在分支
* dev # 星号所在的列就是当前所在分支
master
#在dev分支更新文件并提交
[root@git git]# echo "bbbb" >> branch.txt
[root@git git]# git add *
[root@git git]# git commit -m "commit From dev branch"
[dev e9989ba] commit From dev branch
1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt # 确认当前内容
aaaa
bbbb
[root@git git]# git checkout master # 切换到主分支
Switched to branch 'master'
[root@git git]# cat branch.txt # 查看内容
aaaa
[root@git git]# git merge dev # 合并dev分支
Updating b9f1465..e9989ba
Fast-forward
branch.txt | 1 +
1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt # 再次查看内容
aaaa
bbbb
[root@git git]# git log --graph --pretty=oneline --abbrev-commit #查看提交日志
* e9989ba commit From dev branch
* b9f1465 第一次提交From master
#可以查看到其提交日志前面的星号是在同列的,这是因为采用的是快速合并的方法(默认)
#稍后会写下关闭快速合并,然后可以对比该命令查看的结果
[root@git git]# git branch -d dev # 删除dev分支
Deleted branch dev (was e9989ba).

3、解决分支冲突问题

在我们实际工作中会遇到一个分支冲突的问题,就是当你在工作分支dev下对文件内容进行了修改,然后在你提交到版本库前,master分支下的内容已经发生了改变,此时,你dev分支下的内容是比master下的内容要旧,这种情况下进行分支合并,会有一个分支冲突的概念,例子如下:
[root@git git]# cat branch.txt # 查看当前内容
aaaa
bbbb
[root@git git]# git checkout -b dev # 创建一个分支并切换至自己的工作分支
Switched to a new branch 'dev'
[root@git git]# echo "cccc" >> branch.txt # 写入新数据
[root@git git]# git add branch.txt
[root@git git]# git commit -m "alter from dev"
[dev 051082c] alter from dev
1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt # 查看当前内容
aaaa
bbbb
cccc
[root@git git]# git checkout master # 切换至主分支
Switched to branch 'master'
[root@git git]# cat branch.txt # 查看内容还是之前的
aaaa
bbbb
#修改master下的文件内容并提交
[root@git git]# echo "dddd" >> branch.txt # 写入新数据
[root@git git]# git add branch.txt
[root@git git]# git commit -m "alter from master"
[master 1303111] alter from master
1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt # 确定当前内容
aaaa
bbbb
dddd
#接下来将dev分支进行合并:
[root@git git]# git merge dev
Auto-merging branch.txt
CONFLICT (content): Merge conflict in branch.txt # 合并冲突于 branch.txt
Automatic merge failed; fix conflicts and then commit the result.
#解决合并冲突
#其实有上述报错后,dev分支下的内容已经存在了master目录下的文件中,只是没有提交而已,提交即可
#但是工作中不建议直接提交,因为内容有些特殊的地方
[root@git git]# cat branch.txt # 此时文件的内容如下
aaaa
bbbb
<<<<<=======
cccc
>>>>>>> dev
[root@git git]# cat branch.txt #是用vim命令进入修改,将冲突报错产生的特殊符号删除再提交
aaaa
bbbb
dddd
cccc
[root@git git]# git add branch.txt
[root@git git]# git commit -m "冲突已解决"
[master 26ff6b8] 冲突已解决
[root@git git]# git log --graph --pretty=oneline --abbrev-commit #查看分支合并情况
* 26ff6b8 冲突已解决
|\
| * 051082c alter from dev
* | 1303111 alter from master
|/
* e9989ba commit From dev branch
* b9f1465 第一次提交From master

4、关闭快速合并
在上面说到,在查看git版本的提交历史时,其分支结构表现的不是那么直观,那是因为默认开启了快速合并的选项,这里写下如何关闭快速合并

#进入分支,修改文件内容,并提交
[root@git git]# git checkout -b dev
Switched to a new branch 'dev'
[root@git git]# echo "123" >> branch.txt
[root@git git]# git add branch.txt
[root@git git]# git commit -m "关闭快速合并"
[dev 3d40b6a] 关闭快速合并
1 file changed, 1 insertion(+)
#切换至master分支,进行合并
[root@git git]# git checkout master
Switched to branch 'master'
[root@git git]# git merge --no-ff -m "分支合并说明" dev #选项“--no--ff”就是关闭快速合并
Merge made by the 'recursive' strategy.
branch.txt | 1 +
1 file changed, 1 insertion(+)
[root@git git]# git log --graph --pretty=oneline --abbrev-commit
#再次查看提交日志
* f438cbf 分支合并说明
|\
| * 3d40b6a 关闭快速合并
|/
* 26ff6b8 冲突已解决
|\
| * 051082c alter from dev
* | 1303111 alter from master
|/
#以下是最初没有关闭快速合并的分支合并操作,可以看到只有一列星号,而不显示分支
* e9989ba commit From dev branch
* b9f1465 第一次提交From master

5、Bug分支
开发人员在开发过程中,bug就像家常便饭一样,有了bug就要修复,在git中,由于分支是强大的,所以都可以通过一个新的临时分支来修复bug,修复后,分支合并,然后将临时分支删除。

当我们接到一个修改bug的任务后,很自然的想要创建一个分支来修复它,但是当前正在进行的工作进行到一半,还无法提交,但又需要马上修复bug,此时,可以通过git提供的stash功能,可以把当前工作区“储藏”起来,等以后恢复现场后继续工作。
工作进行到一半时工作区的状态如下:

[root@git git]# cat branch.txt
aaaa
bbbb
dddd
cccc
123
[root@git git]# echo "321321" >> branch.txt
[root@git git]# git status #提示修改但是尚未提交
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: branch.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

将此时的工作区隐藏起来

[root@git git]# git stash # 这条命令,可以将当前工作区隐藏
Saved working directory and index state WIP on master: f438cbf 分支合并说明
HEAD is now at f438cbf 分支合并说明
[root@git git]# git status # 查看状态,现在是干净的
# On branch master
nothing to commit, working directory clean
[root@git git]# cat branch.txt #文件也没有我们新加的内容
aaaa
bbbb
dddd
cccc
123

假设在master分支上修复bug

#切换至master分支并进入bug分支修改
[root@git git]# git checkout master
[root@git git]# git checkout -b bug
Switched to a new branch 'bug'
[root@git git]# echo "eeee" >> branch.txt
[root@git git]# git add branch.txt
[root@git git]# git commit -m "alter from bug"
[bug 1cdff4b] alter from bug
1 file changed, 1 insertion(+)
#切换至master分支合并修改后的bug分支
[root@git git]# git checkout master
Switched to branch 'master'
[root@git git]# git merge bug
Updating f438cbf..1cdff4b
Fast-forward
branch.txt | 1 +
1 file changed, 1 insertion(+)
[root@git git]# cat branch.txt #合并后的文件内容如下
aaaa
bbbb
dddd
cccc
123
eeee
[root@git git]# git branch -d bug # 删除bug分支
Deleted branch bug (was 1cdff4b).
#回到dev分支恢复之前修改的内容继续自己的工作
#有两种恢复方法:
#一是使用 git stash apply 恢复,但是恢复后,stash 内容并不删除,需要用 git stash drop 来删除;
#另一种方式是用 git stash pop,恢复的同时把 stash 内容也删了;这里我采用第二种方法
[root@git git]# git stash pop #恢复存储区的内容
Auto-merging branch.txt
CONFLICT (content): Merge conflict in branch.txt
[root@git git]# cat branch.txt #我们之前的内容又回来了
aaaa
bbbb
dddd
cccc
123
<<<<<<eeee
=======
321321
>>>>>>> Stashed changes
#最后工作完成,在合并dev分支的时候,也会有分支冲突,可以参考前面解决分支冲突的方法

6、Git分支管理相关命令

[root@git ll]# git checkout -b ops #创建ops分支并切换到ops分支
[root@git ll]# git checkout master #切换至master分支
[root@git ll]# git merge dev #快速合并dev分区到当前分支
[root@git ll]# git branch -d ui #删除ui分支
[root@git ll]# git branch #查看所在分支(用星号表示所在分支)
[root@git ll]# git log --graph --pretty=oneline --abbrev-commit
#查看分支合并图
[root@git ll]# git merge --no-ff -m "合并时提交信息" dev #不使用快速合并分支
[root@git ll]# git stash #将当前版本库的状态临时存储
[root@git ll]# git stash pop #恢复并删除临时存储的信息
[root@git ll]# git stash apply #恢复临时存储信息,但不删除信息
[root@git ll]# git stash drop #删除临时存储中的信息
[root@git ll]# git stash show #查看临时存储的信息
[root@git ll]# git branch -D dev #强制删除一个分支
[root@git ll]# git remote #查看当前版本库是否属于远程版本库
[root@git ll]# git remote -v #查看远程版本库的详细信息
[root@git ll]# git push origin dev #将本地dev分支推送到远程仓库
[root@git ll]# git checkout -b dev origin/dev #创建本地dev分支并关联到远程仓库的dev分支
[root@git ll]# git pull #抓取远程分支,一般用于解决冲突
[root@git ll]# git branch --set-upstream-to=origin/dev dev #将本地分支dev关联到远程仓库的dev分支

推荐阅读
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • git向远程仓库提交遇到的各种坑
    **码云***gitinit初始化本地仓库gitinit*gitremoteaddorigingitgithub.com:xueqinngchennLocal-agent.git将 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • 如何在vscode中使用GitLab我同广大码友们一样,好不容易赶上了个节假日,回到家一顿安排,可屁股还没坐热就接到线上紧急BUG需要修复 ... [详细]
  • 本文介绍了在git中如何对指定的commit id打标签,并解决了忘记打标签的问题。通过查找历史提交的commit id,可以在任意时间点打上标签。同时,还介绍了git中的一些常用命令和操作。 ... [详细]
  • 修正我的GitHub commit 数据
    早晨上班,滴滴搭车里,我在掘金这个帖子看到大家晒自己的Github活跃记录,我也晒了下自己的记录。不过太少了。有遗漏的commits状况这也让我知道,自己觉得自己很忙的,实际上提交 ... [详细]
  • Git GitHub多人协作
    在学校做一个小项目需要多人协作,就用到了gitHub,百度了一下多数写得乱七八糟或者支离破碎,于是总结了一下自己的步骤如下,第一次使用GitHUb,哪里不对望大神指出一.前期准备: ... [详细]
  • 双十一在家学用 Git
    对于所有的开发者来说,掌握一门代码版本控制系统都是必须的,无论是自己做项目,团队合作,工作中的合作,都离不开版 ... [详细]
  • 前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 补丁是一个文本文件,其内容类似于gitdiff,但与代码一样,它也有关于提交的元数据;例如提交ID,日期,提交消息等。我们可以从提交创建一个补丁,而其他人可以将它们 ... [详细]
  • 1、获取远程供应商的repo镜像repoinit--mirror-ussh:$username$host_name:29418manifests-bxx_branch--repo ... [详细]
author-avatar
随便他们好了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有