Git分支—分支简介、分支的新建与合并

本文深入解析Git如何通过快照方式保存数据,详细介绍了分支创建、检出及合并的过程,包括解决冲突的手动合并与快进合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

本篇文章是对Pro Git一书中 3.1 分支简介3.2 分支的新建与合并 章节的总结。

1,Git保存数据到文件数据库的方式

1.1 添加a.txt、b.txt到仓库中

新建a.txt、b.txt文件,将这两个文件添加到暂存区(git add a.txt b.txt)
存储到暂存区后会生产两个blob对象(分别存储的是a和b文件内容),并会生成两个SHA-1(效验码)来指向这两个blob对象。
在将这两个文件提交到本地仓库(git commit a.txt b.txt -m "新建文件a.txt和b.txt"),提交本地仓库后会产生一个commit对象,一个tree对象。commit对象包含了作者、提交人、提交时间、一个tree对象和parent对象等信息,如果是首次提交将不会产生parent信息。tree对象包含了指向blob对象的SHA-1、文件名和文件模式。这一步操作后master分支指向SHA-1为5f19dbf6的commit对象,HEAD指向master。

1.2 修改a.txt文件并提交到仓库

对a.txt进行修改并提交到仓库(git commit -a -m "添加文件类型说明")。添加到暂存区后会产出一个blob对象(存储a文件修改后的内容),并产生一个SHA-1(效验码)来指向这个对象。
提交到仓库后会产生一个commit,一个tree对象。注意:1,这次提交产生的commit对象包含了parent信息。2,我们并没有修改b.txt所以tree对象还是保存上次b文件的SHA-1。这一步操作后master分支指向SHA-1为501833f9的commit对象,HEAD指向master。
从1.1和1.2可以看出:
1,每一次commit产生的对象都会对整个项目做一次快照。
2,Git不保存文件之间的差异,而是保存快照。
这里写图片描述

2,创建分支与检出分支原理

2.1 创建dev分支

创建dev分支(git branch dev)会产生一个指向SHA-1为01833f9的commit对象的分支,现在master和dev分支都指向同一次提交对象。

2.2 捡出dev分支

检出dev分支(git checkout dev)会使HEAD分支指向dev分支。
从2.1和2.2可以看出:1,master和dev分支只不过是指向了某个提交对象的引用,创建一个分支就是将分支引用指向某次提交。2,HEAD是一个特殊引用,表示当前分支。
这里写图片描述

3,在不同branch提交的分叉历史

在dev分支修改a.txt并提交

在dev分支修改a.txt并提交(git commit -a -m "介绍你可以向文件写入什么内容"),可以看到dev指向了新的commit对象。

切换到master分支,对a.txt修改并提交

切换到master分支,对a.txt修改并提交(git checkout master,git commit -a -m "添加介绍说明"),可以看到master也指向了一个新的提交对象。
从3.1和3.2可以看出:1,怎么知道我的提交是在那个分支上是通过HEAD引用,将HEAD引用指向的分支引用指向的commit对象的SHA-1值作为新commit对象的parent。2,分叉历史产生是因为有两个commit对象的parent指向了同一个commit对象,如果产生了历史分叉就不能使用"快进"进行合并。
这里写图片描述

4,merge dev分支到master分支

merge dev分支到master分支(git checkout mastergit merge dev)。在检出dev分支对其a.txt文件进行修并提交到仓库未合并到master之前,我又切换到master对a.txt文件进行了修改并提交到了仓库,导致了产分叉历史。在这种情况下将dev合并到master分支是就会产生冲突,需要我们手工对a.txt进行合并,合并的版本是SHA-1为bd61a96的commit对象和SHA-1为89a6a5的acommit对象以及这两对象的共同父commit对象(01833f9)做一个三方合并————红色边框的三个commit对象。手工合并(手工修改那个版本是你需要的,那个版本是你不需要的,或两者都需要)a.txt文件后执行git add a.txtgit commit将会产生一个SHA-1为d44c096的commit对象,这个commit对象有两个父commit对象(bd61a96、89a6a5a)。
从4可以看出:1,产生分叉的历史提交不能进行"快进"合并,需要我们手工解决冲突才能合并。2,三方合并产生新的的commit对象,这个commit对象有两个paretn commit对象。
这里写图片描述

5,merge iss11分到到master分支-快进(fast-forward)

5.1,在iss11分支进行2次提交

我们现在有个紧急bug需要修复,我们根据master分支检出一个iss11分支用来修复bug。我们在iss11分支上提交了两次完成了bug的修复,并决定将iss11合并到master。

5.2,merge iss11分支到master分支

在iss11分支修复bug期间master分支没有发任何修改,我们在将iss11合并到master分支是就可以使用快进(fast-forward)合并。由于当前 master 分支所指向的提交(d44c096)是你iss11当前提交(34af7c6)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支(分支的最后一次提交),那么 Git 在合并两者的时候,只会简单的将指针向前推进,因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
这里写图片描述
最后附一张总图
这里写图片描述

<think>好的,我需要回答用户关于Git合并分支的问题。首先,用户提供的引用内容中有四个引用,我需要仔细查看这些引用来确保回答正确。引用1提到git rebase合并分支的步骤,但指出不推荐使用。引用2介绍了git merge的基本用法,说明合并后当前分支会包含另一个分支的提交。引用3解释了三方合并的概念,提到当分支历史分叉时,Git创建新的合并提交,并提到冲突处理。引用4则涉及git pull来拉取远程分支的内容。 用户的问题是关于Git合并分支的教程,或者如何在Git合并分支。根据这些引用,我需要整理出合并分支的步骤,包括常用的方法和注意事项。首先,应该介绍git merge,因为这是最常用的合并方式,引用2和引用3都提到了。然后,虽然引用1不推荐使用git rebase,但可能还是需要简要说明其用法,并指出潜在的风险。此外,冲突处理也是关键部分,引用3提到了冲突时的处理方法,需要包含在回答中。 接下来,我需要确保回答符合用户的要求:结构清晰,分步骤解决问题,真实可靠。同时,用户希望生成相关问题,我需要根据内容提出相关的问题,比如比较merge和rebase,解决冲突的步骤,或合并的最佳实践。 在组织内容时,首先介绍git merge的基本步骤,包括切换到目标分支,执行合并命令,处理冲突。然后,简要说明git rebase的用法,但提醒谨慎使用。接下来详细说明冲突处理的步骤,如手动修改文件、添加修改、提交。可能还需要提到远程分支合并,比如使用git pull来拉取并合并,如引用4提到的git pull origin dev。 需要确保所有Git命令格式正确,比如使用代码块包裹命令,保持格式一致。同时,引用标记要正确对应,例如引用2对应git merge,引用3对应三方合并和冲突处理,引用1对应rebase的注意事项。 最后,生成相关问题时要围绕合并分支的不同方法、冲突解决、最佳实践等,确保问题回答内容紧密相关,帮助用户进一步学习。需要检查所有引用是否恰当,并正确标注在回答的末尾。</think># Git合并分支操作指南 ## 一、基础合并方法 ### 1. 使用`git merge`合并(推荐) ```bash # 步骤1:切换到要合并的目标分支(如main) git checkout main # 步骤2:执行合并操作(将dev分支合并到当前分支git merge dev ``` - **快进合并(Fast-forward)**:当目标分支没有新提交时直接移动指针[^2] - **三方合并(Three-way merge)**:当分支历史分叉时,Git创建新的合并提交,包含多个父提交[^3] ### 2. 使用`git rebase`合并(不推荐) ```bash git checkout dev git rebase main # 将dev的提交变基到main分支最新提交之后 git checkout main git merge dev # 此时会触发快进合并 ``` ⚠️注意:这会改写提交历史,可能导致协作问题,建议仅在个人分支使用[^1] ## 二、冲突处理流程 当不同分支修改了同一文件的相同位置时: 1. 手动编辑冲突文件(Git会用`<<<<<<<`标记冲突区域) 2. 执行`git add <文件名>`标记已解决冲突 3. 完成合并提交`git commit -m "merge message"`[^3] ## 三、远程分支合并 ```bash # 拉取远程dev分支合并到当前分支 git pull origin dev # 相当于 git fetch + git merge[^4] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值