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

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

Git整合分支的两种方法

在这里插入图片描述

1、合并(git merge)

可以先看这篇文章先理解下Git的合并:Git:合并分支----git merge命令应用的三种情景_Samven_7的博客-CSDN博客
按照上图,这里是非快进的合并。
整合分支最容易的方法是 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的博客-CSDN博客
GitHub 解决 Git 变基后的合并冲突_w3cschool

  • 30
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当我们在使用Git进行版本控制时,常常会遇到合并分支的情况。Git提供了两种主要的合并方式:git rebasegit merge。 1. Git Merge合并): - Git merge是将一个分支的更改合并到另一个分支的操作。 - 在合并过程中,Git会创建一个新的提交,将两个分支的更改合并在一起。 - 合并后的提交历史会保留每个分支的提交记录,形成一个新的合并提交。 2. Git Rebase变基): - Git rebase是将一个分支的更改应用到另一个分支上的操作。 - 在变基过程中,Git会将当前分支的提交复制到目标分支上,并且按照提交顺序逐个应用。 - 变基后的提交历史会变得更加线性,看起来更加整洁。 区别: - 合并后的提交历史:使用git merge会创建一个新的合并提交,保留了每个分支的提交记录。而使用git rebase会将当前分支的提交复制到目标分支上,形成一个新的线性提交历史。 - 分支关系:使用git merge会保留原有的分支关系,即保留了被合并分支的独立性。而使用git rebase会将当前分支的提交应用到目标分支上,使得目标分支看起来像是一直在自己的分支上进行开发。 - 提交历史的清晰度:由于git rebase会将提交应用到目标分支上,使得提交历史更加线性和整洁。而git merge会创建一个新的合并提交,可能会导致提交历史变得复杂。 总结: - 使用git merge可以保留分支独立性,适用于公共分支合并。 - 使用git rebase可以使提交历史更加整洁,适用于个人分支合并

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值