Git整合分支的两种方法——合并(git merge)与变基(git rebase)的区别

本文介绍了Git中两种常见的分支整合方法:合并(merge)与变基(rebase)。通过实例演示了如何使用这两种方法来整合分支,并详细解释了它们之间的区别。此外,还探讨了在什么情况下更适合使用变基而非合并。

转载者总结了下原文的关键句,补充了几个相关链接,得到本文。

Git整合分支的两种方法

在这里插入图片描述

1、合并(git merge)

可以先看这篇文章先理解下Git的合并:Git:合并分支----git merge命令应用的三种情景_Samven_7的博客-优快云博客
按照上图,这里是非快进的合并。
整合分支最容易的方法是 merge 命令。 它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。

命令:

# 合并指定分支到当前分支
$ git merge <branch>

2、变基(git rebase)

其实,还有一种方法:你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

命令:

# 将主题分支<topicbranch>变基到目标分支<basebranch>上。
# 即提取在<topicbranch>上的补丁和修改,然后在<basebranch>的基础上应用一次。
$ git rebase <basebranch> <topicbranch>
或者
$ git switch <topicbranch>
$ git rebase <basebranch>

用例子理解 合并(git merge)与变基(git rebase)的区别

在这里插入图片描述

合并(git merge)

$ git switch master
$ git merge experiment

# 没有冲突时不需要下方的命令。有冲突时,就修改冲突文件,再add然后commit该文件,如下:
$ git add readme.txt 
$ git commit -m "conflict fixed"

执行完上方的命令,达到下图效果:
在这里插入图片描述
此时可以删除dev分支:

$ git branch -d dev

变基(git rebase)

1、执行变基命令

# 提取在 experiment分支 中引入的补丁和修改,然后在 master分支 的基础上应用一次。
$ git rebase master experiment	
或者
$ git switch experiment
$ git rebase master

GitHub 解决 Git 变基后的合并冲突_w3cschool

变基的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

执行完上方的命令,达到下图效果:
在这里插入图片描述
2、“快进”(无冲突)的合并

$ git switch master
$ git merge experiment

执行完上方的命令,达到下图效果:
在这里插入图片描述
3、此时可以删除dev分支:

$ git branch -d dev

要用变基得遵守一条准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
也就是说,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式(变基 、 合并)带来的便利。

总结

这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的, 但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

参考

转载自:Git - 变基

上文的两个链接:
Git:合并分支----git merge命令应用的三种情景_Samven_7的博客-优快云博客
GitHub 解决 Git 变基后的合并冲突_w3cschool

在IntelliJ IDEA中,GitRebase合并Merge)是两种常见的处理分支合并的方式,以下是它们的使用方法及相关知识: ### Git合并Merge) - **原理**:合并操作是将一个分支的修改整合到另一个分支上。合并操作会创建一个新的提交节点,这个节点包含了两个分支的修改内容。 - **使用方法**: 1. **切换到目标分支**:在IDEA右下角的分支选择器中,选择要将其他分支合并进来的目标分支。 2. **执行合并操作**:选择`VCS` -> `Git` -> `Merge Changes`,在弹出的窗口中选择要合并分支,点击`Merge`按钮即可完成合并。 - **适用场景**:适用于需要保留分支历史记录,并且希望清晰展示合并操作的场景。 ### GitRebase) - **原理**:操作是将一个分支的修改应用到另一个分支的末尾,看起来就像是这些修改是在目标分支上直接进行的一样。操作不会创建新的合并提交,而是将提交记录线性化。 - **使用方法**: 1. **切换到要分支**:在IDEA右下角的分支选择器中,选择要进行操作的分支。 2. **执行操作**:选择`VCS` -> `Git` -> `Rebase`,在弹出的窗口中选择目标分支,点击`Rebase`按钮即可开始。 - **适用场景**:适用于需要保持提交历史记录的线性,使代码历史更加清晰的场景。 ### 冲突处理 无论是合并还是操作,都可能会遇到冲突。当发生冲突时,IDEA会在编辑器中标记出冲突的部分。可以手动编辑文件解决冲突,解决完成后,选择`VCS` -> `Git` -> `Resolve Conflicts`,在弹出的窗口中选择`Mark as Resolved`,然后继续完成合并操作。 ### 示例代码 以下是在命令行中进行合并操作的示例代码,在IDEA中执行的操作本质上也是调用了这些Git命令: **合并操作** ```bash # 切换到目标分支 git checkout master # 合并指定分支 git merge feature-branch ``` **操作** ```bash # 切换到要分支 git checkout feature-branch # 执行操作 git rebase master ```
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值