Git学习笔记(五)——分支

news2024/11/15 9:00:21

一、创建与合并分支

创建分支:Git创建一个分支很快,因为除了增加一个指针,改改HEAD的指向,工作区的文件都没有任何变化。

合并分支:就是直接把master(其中一条分支)指向dev(另一条分支)的当前提交,就完成了合并。Git合并分支也很快!就改改指针,工作区内容也不变。合并完分支后,甚至可以删除dev分支,内容也不会发生变化。

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

1、创建分支

(1)命令git checkout -b dev(新分支名称)

创建分支dev,且切换到分支dev(自定义新分支名称)。

$ git checkout -b dev #创建并切换到分支dev
Switched to a new branch 'dev'

相当于:

$ git branch dev #创建新分支dev
$ git checkout dev  #切换到分支dev

(2)命令git switch -c dev(新分支名称)

创建分支并切换到分支,作用与git checkout -b dev相同,是新版本的Git提供了新的命令来切换分支,相比较不容易与撤销修改的git checkout -- <file>命令弄混。

(3)命令git branch dev(新分支名称)

创建新分支

(4)命令git checkout dev(分支名称)

切换到分支dev

(5)命令 git switch dev(分支名称)

作用同git checkout dev,切换到分支dev,相对更好理解。

(6)命令 git branch

查看当前分支,列出所有分支,当前分支前面会标一个*号。

$ git branch
* dev
  master

2、合并分支

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

(1)命令git merge dev(指定分支)

用于合并指定分支到当前分支。例如,把dev分支的工作成果合并到master分支上

$ git merge dev  #将dev分支合并到master分支上
Updating 53e89d7..ea4444f
Fast-forward
 readme.txt | 1 +
 test.txt   | 0
 2 files changed, 1 insertion(+)
 create mode 100644 test.txt

上面的Fast-forward信息是指这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。也不是每次合并都能Fast-forward。

3、删除分支

(1)命令git branch -d dev(指定分支)

删除指定的分支。可在合并完成分支后,就可以放心地删除dev分支。

$ git branch -d dev
Deleted branch dev (was ea4444f).

在查看分支会发现,dev分支已被删除。

$ git branch
* master

二、解决冲突

当两个不同分支各自分别都有新的提交的时候,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,结果如下:

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。

1、查看分支冲突方法如下:

(1)查看状态Git status,能够发现冲突的文件。

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

(2)命令 cat readme.txt(文件名)

直接查看该冲突文件(readme.txt)的内容.

$ cat readme.txt  #查看文件内容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick.
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容。

2、解决分支冲突

(1)命令vi readme.txt

——用vi 文件路径或者文件名,打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件,并在终端最下面一行显示打开的是一个新文件。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick.
Creating a new branch is quick AND simple.
>>>>>>> feature1
~
~
~
~
~
~
~
~
~
~
~
~
readme.txt [dos] (22:58 07/03/2023)                                      1,1 All
"readme.txt" [dos] 10L, 324B

——键盘输入字母 “i”或“Insert”键进入最常用的插入编辑模式。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick.
Creating a new branch is quick AND simple.
>>>>>>> feature1
~
~
~
~
~
readme.txt[+] [dos] (22:58 07/03/2023)                                   1,1 All
-- INSERT --

——按下 “ESC” 键,退出编辑模式,切换到命令模式。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick and simple.
~
~
~
~
readme.txt [dos] (23:27 07/03/2023)    

——在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vi 。终端会回到命令行

li***@LAPTOP-MUI**V M**** ~/learngit (master|MERGING)
$ vi readme.txt

(2)修改readme.txt文件的内容。

修改如下后保存:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick and simple.
~
~
~
readme.txt[+] [dos] (22:58 07/03/2023)                                  5,43 All
-- INSERT --

再使用git add <file> 和 git commit -m "***"命令将修改的结果传递到版本库。

(3)命令 git log --graph --pretty=oneline --abbrev-commit

用带参数的git log也可以看到分支的合并情况。可以看见两个分支已经合并在一起。

$ git log --graph --pretty=oneline --abbrev-commit
*   47e9b49 (HEAD -> master) conflict fixed
|\
| * cd8fa2d (feature1) AND simple
* | 6f306dd &simple
|/
* ea4444f branch text
* 53e89d7 remove test.txt
* ed0dc67 add test.txt
* e87225d git tracks changes 1
* fe8a3cb git tracks changes
* 52edc0e understand how stage works
* 9178f48 append GPL
* 84cca88 add distributed
* bdcbe49 wrote a readme file

(4)删除feature1分支

$ git branch -d feature1
Deleted branch feature1 (was cd8fa2d).

(5)命令git log --graph

可以看到分支合并图

$ git log --graph
*   commit 47e9b49ea475102cdd81144b2cb7f424974f7962 (HEAD -> master)
|\  Merge: 6f306dd cd8fa2d
| | Author: Li*** <85077**5@qq.com>
| | Date:   Tue Mar 7 23:34:39 2023 +0800
| |
| |     conflict fixed
| |
| * commit cd8fa2dfc14b5fb4a198335a3b58d5c86f939e11
| | Author: Li** <8507**5@qq.com>
| | Date:   Tue Mar 7 22:56:24 2023 +0800
| |
| |     AND simple
| |
* | commit 6f306dd4b51387d266750c48db4cf962e2021f61
|/  Author: Li** <8507***@qq.com>
|   Date:   Tue Mar 7 22:58:03 2023 +0800
|
|       &simple
|
* commit ea4444f2e72b57d5b2711e770304c9aced4de436
| Author: Li** <8507***@qq.com>
| Date:   Tue Mar 7 17:25:26 2023 +0800
|
:

注意:终端不会自动退出graph命令,需要手动输入q,才能结束。

三、分支管理策略

1、强制禁止用Fast forward模式合并分支

因为Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

(1)命令git merge --no-ff -m "merge with no-ff" dev

合并dev分支,其中--no-ff参数,表示禁用Fast forward合并。本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

$ git merge --no-ff -m"merge with no-ff" dev
Merge made by the 'ort' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

使用命令git log --graph --pretty=oneline --abbrev-commit 查看分支记录

不用Fast forward模式合并分支,得到的分支合并如下图:

2、分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

(1)master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

(2)平时的工作都在新建的dev上修改,再合并到master分支上。

(3)另外每个项目小伙伴又有自己的分支,时不时的合并到分支dev上。

四、Bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

1、暂时存储还未完成的工作

工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug。

(1)命令git stash

把当前工作现场“储藏”起来,等以后恢复现场后继续工作

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

(2)命令 git stash list

查看保存的工作现场

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

当看不到stash@{0}: WIP on dev: f52c633 add merge时,说明stash被删除。

(3)命令git stash pop

恢复工作现场,恢复的同时把stash内容也删了。

$ git stash pop
On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.py

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:   readme.txt

Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)

(4)命令git stash apply stash@{0}(指定的stash)

恢复指定的stash,可以通过命令git stash list命令查看stash内容。

$ git stash apply stash@{0}

(5)命令git stash drop

删除stash的内容。

2、修复其他分支的Bug

(1)git cherry-pick commit_id

复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。可以不用单独在另一个分支再做一次bug修改。

$ git cherry-pick 91a4683
[dev c2e6bc1] fix bug 101
 Date: Wed Mar 8 17:13:16 2023 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)

小结

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

五、Feature分支-删除未合并的分支

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

(1)常规删除未合并的分支

使用git branch -d 分支名,无法删除分支

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.

(2)命令git branch -D 分支名

feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。

$ git branch -D feature-vulcan #删除未合并的分支
Deleted branch feature-vulcan (was f4c738d).

六、多人协作

1、抓取分支

多人协作时,大家都会往masterdev分支上推送各自的修改。

$ git clone git@github.com:lily-wang0524/learngit.git
Cloning into 'learngit'...
remote: Enumerating objects: 44, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 44 (delta 14), reused 43 (delta 13), pack-reused 0
Receiving objects: 100% (44/44), done.
Resolving deltas: 100% (14/14), done.

$ git branch
* main

当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。

(1)命令git checkout -b dev origin/dev

创建远程origindev分支到本地,才能在dev分支上开发。

(2)命令 git branch --set-upstream-to=origin/dev dev

指定本地dev分支与远程origin/dev分支的链接。

(3)命令git pull

把最新的提交从分支上抓下来,然后本地合并。

多人协作总结:

多人协作的工作模式:

(1)首先,可以试图用git push origin <branch-name>推送自己的修改。

(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull从分支上把最新提交的内容抓取下来并试图本地合并;

(3)如果合并有冲突,则解决冲突,并在本地提交;

(4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

(5)如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

七、分支合并-rebase

(1)命令git rebase

rebase命令也是合并分支的一种方式,但其与merge有所不同,rebase操作可以把本地未push的分叉提交历史整理成直线,使得我们在查看历史提交的变化时更容易,但是无法跟踪在目标分支上合并的时间和方式。而merge的记录是完整的。

1)下图为使用rebase命令

2)下图为使用merge命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基础条件循环语句

1、编写代码完成一个名片显示,要求使用取消换行和格式化操作符 # 编写代码完成一个名片显示,要求使用取消换行和格式化操作符name 张三 qq 1234567 phone_num 1234567 com_address 北京print(\n 姓名:%s\n qq:%d\n 手机号:%d\n 公司地址:%s\n %(name ,qq ,phone_num, com_…

忆享科技优化入职培训加强人效管理全面迎接新挑战

-优化入职培训-忆享科技加强人效管理入职培训课程 ✦ KPI系统上线 ✦ 砥砺前行前言许多企业随着自身的不断发展&#xff0c;对于各类人才引进需求也越来越迫切&#xff0c;一批批新员工的加入&#xff0c;公司规模逐渐扩大&#xff0c;给公司带来了全新的血液。但在大量新员工加…

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2&#xff0c;所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件&#xff0c;可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…

lesson8-Linux多线程

Linux线程概念 线程在进程内部执行,是OS调度的基本单位OS是可以做到让进程进行资源的细粒度划分的物理内存是以4kb为单位的我们的.exe可执行程序本来就是按照地址空间的方式进行编译的页表映射 - 详细图 理解线程 线程在进程的地址空间内运行, 进程内部具有多个执行流的,而线程…

【java基础】集合基础说明

文章目录基本介绍Collection接口Iterator和Iterable接口Map接口关于Iterator接口的一些说明框架中的接口具体集合总结基本介绍 集合就是存储用来存储一系列数据的一种数据结构。在这篇文章中会介绍集合的一些基本概念。 Collection接口 集合的基本接口是Collection接口&…

Metabase和Superset 对比分析

Metabse中文社区Metabase和Superset都是排名靠前的开源的数据可视化软件&#xff0c;在技术上有许多相似之处。他们的比较可以帮助用户选择更好的开源平台进行数据可视化。关于Superset 编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;Super…

Golang反射源码分析

在go的源码包及一些开源组件中&#xff0c;经常可以看到reflect反射包的使用&#xff0c;本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先&#xff0c;了解一下反射的定义&#xff1a; 反射是指计算机程序能够在运行时&#xff0c;能够描述其自身状态或行为、调整…

智慧赋能,聚力开源——第四届OpenI/O 启智开发者大会开源治理专场顺利举办!

为汇聚国内外知名开源组织共同探讨中国开源生态建设及开源治理相关议题&#xff0c;推进产学研用开源合作&#xff0c;2月24日下午&#xff0c;第四届OpenI/O启智开发者大会在深圳人才研修院智汇中心举办以“构建开源联合体&#xff0c;共建开源生态”为主题的开源治理专场分论…

C++基础了解-17-C++日期 时间

C日期 & 时间 一、C日期 & 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构&#xff0c;需要在 C 程序中引用 头文件。 有四个与时间相关的类型&#xff1a;clock_t、time_t、size_t 和 …

opencv识别车道线(霍夫线变换)

目录1、前言2、霍夫线变换2.1、霍夫线变换是什么&#xff1f;2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.1.4、测试其它图片图片1图片2图片31、前言 最近学习opencv学到了霍夫线变换&am…

ruoyi对接CAS统一身份认证

暂定逻辑如下&#xff1a;搭建CAS服务器端&#xff1a;项目地址&#xff1a;https://gitee.com/weigang_wu/cas-server-webapp.git项目里有二开的说明文档&#xff0c;如&#xff1a;按照自定义的数据库校验修改如下&#xff1a;首先&#xff1a;修改数据库连接以及查询数据这里…

博客系统(前后端分离版)

博客系统的具体实现 文章目录博客系统的具体实现软件开发的基本流程具体实现的八大功能数据库设计创建数据库操作数据库引入依赖封装DataSource创建实体类将JDBC增删改查封装起来实现博客列表页web.xml的配置文件实现博客系统的展示功能登录功能强制要求用户登录显示用户信息退…

求职复盘:干了四年外包出来,面试5次全挂

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

为什么做知识管理,就想选择Baklib呢?

随着科技的不断发展&#xff0c;知识管理已经成为现代企业不可或缺的一个重要组成部分。由于信息化快速发展&#xff0c;企业每天都会产生大量的数据和信息&#xff0c;如何高效地获取、整理和利用这些信息已经成为了企业成功的关键因素之一。为了更好地管理企业知识&#xff0…

利用Iptables构建虚拟路由器

利用Iptables构建虚拟路由器 &#xff08;1&#xff09;修改网络类型 在VMware Workstation软件中选择“编辑→虚拟网络编辑器”菜单命令&#xff0c;在虚拟网络列表中选中VMnet1&#xff0c;将其配置为“仅主机模式&#xff08;在专用网络内连接虚拟机&#xff09;”&#x…

模板进阶(仿函数,特化等介绍)

非类型模板参数 模板参数有类型形参和非类型形参&#xff1b; 类型形参&#xff1a;使用typename或者class修饰的参数类型名称 非类型形参&#xff1a;一个普通常量作为模板参数形参&#xff0c;不能为浮点数&#xff0c;字符类型以及类对象&#xff1b; #include<iostrea…

虹科新品| HK-TrueNAS企业存储

一、HK-TrueNAS概述HK-TrueNAS 是一种统一存储阵列&#xff0c;提供混合和全闪存配置&#xff0c;以前所未有的价格提供全面的功能集和高达 10.5PB 的容量。TrueNAS 全闪存存储阵列为以闪存为中心的数据中心提供了理想的统一数据存储。每个混合和全闪存 TrueNAS 系统都使用 Tru…

VSCode 开发配置,一文搞定(持续更新中...)

一、快速生成页面骨架 文件 > 首选项 > 配置用户代码片段 选择需要的代码片段或者创建一个新的&#xff0c;这里以 vue.json 举例&#xff1a; 下面为我配置的代码片段&#xff0c;仅供参考&#xff1a; {"Print to console": {"prefix": "…

Mac系统配置java、Android_sdk、gradle、maven、ndk、flutter、tomcat环境变量

搞了三天&#xff0c;终于搞定MAC系统下的各种环境变量了…… 旧版本10.13.6或者更老的MAC系统&#xff0c;只用在.bash_profile文件编辑就行了&#xff1b;新版本10.14.2、10.15.7或者更高的&#xff0c;还要去.zshrc文件加一句source ~/.bash_profile&#xff0c;才能使所有…

java明文数据加密、脱敏方法总结

前言 在一些安全性要求比较高的项目里&#xff0c;避免不了要对敏感信息进行加解密&#xff0c;比如配置文件中的敏感信息。 第一种方法&#xff08;自定义加解密&#xff09; 加解密工具类&#xff1a; public class SecurityTools {public static final String ALGORITHM…