`

聊聊merge和rebase

 
阅读更多



合并代码的两大工具

把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase。

merge

merge是比较常见的使用方法,它会把两个分支最新的快照以及二者最新的共同祖先进行三方合并,合并的结果是产生一个新的提交对象。这种合并分支的好处是带有时间线,显示说明各个分支的前后关系。操作命令:

git checkout feature

git merge master

或者合并为一句: git merge master feature

feature分支中新的合并提交(merge commit)将两个分支的历史连在了一起。你会得到下面这样的分支结构:



merge的缺点也很明显,每次合并上游更改时feature分支都会引入一个外来的合并提交。如果master非常活跃的话,这或多或少会污染你的分支历史。我们在参与一个比较大的项目开发时,就会增加理解项目历史的难度。如下图,你很难找的清各个分支的关系了。



rebase

rebase操作翻译为衍合,我语文不太好,不是非常理解这个含义。rebase的价值在于你可以把当前分支中提交的改变移到另一个分支里重放一遍。为原分支上每一个提交创建一个新的提交,重写了项目历史,并且不会带来合并提交。操作命令:

git checkout feature

git rebase master

rebase的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment)后续的历次提交对象,生成一系列文件补丁,然后以基底分支(也就是主干分支 master)最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象,从而改写 experiment 的提交历史,使它成为 master 分支的直接下游。视图如下:



rebase最大的好处是你的项目历史会非常整洁。它不像git merge 那样引入不必要的合并提交,导致看起来眼花缭乱。相反,rebase会让目历史呈现出完美的线性——你可以从项目终点到起点浏览而不需要任何的Fork。这让你更容易使用git log 、git bisect 和gitk 来查看项目历史。

不过,这种简单的提交历史会带来两个后果:安全性和可跟踪性。如果你违反了Rebase黄金法则,重写项目历史可能会给你的协作工作流带来灾难性的影响。此外,rebase不会有合并提交中附带的信息,所以你看不到feature分支中并入了上游的哪些更改。这可能不方便确认之前代码变更的背景和原因。

Rebase的黄金法则

一句话:绝不要在公共的分支上使用它。

比如说,如果你把master分支rebase到你的feature分支上会发生什么:



这次rebase将master分支上的所有提交都移到了feature分支后面。问题是它只发生在你的代码仓库中,其他所有的开发者还在原来的master上工作。因为rebase引起了新的提交,Git会认为你的master分支和其他人的master已经分叉了。

同步两个master分支的唯一办法是把它们merge到一起,导致一个额外的合并提交和两堆包含同样更改的提交。不用说,这会让人非常困惑。

总结:如果把rebase当成一种在推送之前清理提交历史的手段,而且仅仅rebase那些尚未公开的提交对象,就没问题。如果rebase那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦。多人协作的项目,估计还是要继续老老实实的merge代码

分享到:
评论

相关推荐

    Git的merge和rebase你真的了解吗?

    本文将深入探讨Git的两个关键功能——`merge`和`rebase`,以及它们在日常开发中的应用。 1. **Git的版本控制**:Git的核心功能是版本控制,它能够记录文件的每一次修改,包括修改的内容、作者和时间。这使得开发者...

    前端大厂最新面试题-git rebase_ git merge.docx

    git rebase 和 git merge 的理解与区别 Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git...

    11. 高级 1: 不喜欢 merge 的分叉? 用 rebase 吧1

    Git 高级使用指南 - merge 和 rebase 的区别 在 Git 中,我们经常会遇到分叉的情况,特别是在多人协作时。当我们执行 `git merge` 命令时,commit 历史就会出现分叉,这种分叉再汇合的结构会让一些人觉得混乱而难以...

    详解git merge 与 git rebase的区别

    Git 是一个分布式版本控制系统,它提供了两种合并分支的策略:`git merge` 和 `git rebase`。两者都是为了整合不同分支的更改,但它们在处理合并的方式上有显著的差异。 ## Git Merge `git merge` 是最常见的合并...

    Sungq1990#blog#git rebase操作1

    merge主要发生在这样几个地方1 两个人同时开发一个分支,在拉取对方代码的时候2 要将代码合并到master的时候git pull origin master

    ZhongJinHacker#notes#git_merge和git_rebase总结1

    文件可能会发生冲突,需要解决一下最后结果* 85ef130 (HEAD -> master) Merge branch 'dev'可以看出,merge 有保留d

    Araxis Merge v6.5/Araxis Merge 2017比对工具

    里面给大家内嵌了Araxis Merge v6.5和Araxis Merge 2017两个版本,并配备了使用说明。 Araxis Merge v6.5:免安装版本,解压直接运行merge.exe即可正常使用(目前好像不支持Win10系统了,但是我同事的win10可以用,...

    WinMerge WinMerge WinMerge

    WinMerge是一款强大的文本和文件比较工具,尤其在IT行业中,它是开发者和版本控制使用者的得力助手。这个软件能够帮助用户高效地对比不同版本的代码或者其他文本文件,从而快速定位和理解版本之间的差异。 首先,...

    android merge和include简单使用

    在Android开发中,`merge`和`include`是两种非常重要的布局管理工具,它们能够帮助开发者更有效地管理和优化布局文件,提高代码的可维护性和性能。这篇博客将深入讲解这两个概念,以及它们如何在实际项目中应用。 ...

    winmerge代码比较工具

    WinMerge是一款高效且易用的代码比较工具,类似于知名的Beyond Compare,但它提供了一种免注册码的使用体验,对于开发者和日常文件管理用户来说,它是一个非常实用的选择。这款软件的核心功能是帮助用户进行文件和...

    AraxisMerge绿色版

    Araxis Merge的核心功能在于其文本和文件夹的对比能力。它能够精准地检测并显示两个或多个文本文件之间的差异,无论是代码文件、文档还是其他类型的文本,都能进行逐行甚至逐字符的比较。这对于开发者来说尤其重要,...

    WinMerge.zip

    WinMerge是一款强大的文本比较工具,尤其在IT行业中,它被广泛用于代码的差异对比和版本控制。这款软件能够帮助开发者迅速地找出两个文件或者目录之间的差异,并提供方便的合并功能,极大地提升了工作效率。 标题...

    Merge工具 win Merge

    Win Merge是一款深受开发者和普通用户喜爱的免费文件和文件夹比较工具,尤其适用于Windows操作系统。它的主要功能是帮助用户识别并合并两个或更多文件或目录之间的差异,极大地提高了工作效率。 ### 1. **Win Merge...

    P4Merge, Linux上最好用的merge工具,附git集成

    1. **三向合并**:P4Merge能显示三个版本的文件,包括基线(base)、本地(local)和远程(remote)版本,帮助用户直观地比较和合并差异。 2. **冲突解决**:在发生冲突时,P4Merge能清晰标记出冲突区域,并提供...

    Araxis Merge v6.5(含破解补丁)

    Araxis Merge是一款在Windows操作系统中广泛使用的专业级文件比较与合并工具,尤其受到程序员和IT专业人士的青睐。这款软件能够帮助用户快速识别并解决代码冲突,对比文本文件、目录和版本控制系统中的差异,极大地...

    WinMerge文件比较工具

    WinMerge是一款功能强大的文件和目录比较工具,尤其在IT领域中,它被广泛用于代码版本控制、合并代码差异以及同步不同计算机之间的文件。WinMerge以其直观的用户界面和高效的对比功能,使得文件比较和合并变得轻松...

    合并后安装:运行NPM安装后mergerebase-沙哑的挂钩

    合并后安装 运行 :person_running: npm install后合并/变基,以及package.json或package-lock.json更改时。... "post-rebase" : "post-merge-install" } } 选件 旗 描述 细节 --prompt 如果检测

    merge01 merge 比较工具1

    merge 比较工具 merge 比较工具merge 比较工具

    sourceThree的使用-rebase的整个过程

    rebasee(变基)的上存方式是比较冷门的,用的人比较少,开发过程中用merge [mɜːdʒ] (融合)的方式比较多。 我从网上查了很多资料,都没有记载很详细rebase在sourceThree是怎么用的一个过程,花了两天的时间研究一下...

    WinMerge文件diff工具

    WinMerge的核心功能是对两个文本文件进行逐行比较,它可以突出显示两份文件中的不同之处,包括插入、删除和修改的行。这对于代码审查、版本控制以及文档同步等任务非常有用。同时,WinMerge还支持二进制文件的比较,...

Global site tag (gtag.js) - Google Analytics