0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

git rebase与相关git merge命令比较

马哥Linux运维 来源:马哥Linux运维 2023-05-26 16:22 次阅读

#前言

git rebase命令经常被认为是Git的巫术,初学者应该远离它,但它实际上可以让开发团队在使用时更加轻松。今天,我们将git rebase与相关git merge命令进行比较。

#概念

首先要理解的是git rebase和git merge解决了同样的问题。这两个命令都旨在将更改从一个分支集成到另一个分支 - 它们只是以不同的方式进行。试想一下当你开始在专用分支中开发新功能时另一个团队成员以新提交更新master分支会发生什么。这会出现分叉历史记录,对于使用Git作为协作工具的任何人来说都应该很熟悉。

1d6a3248-fae1-11ed-90ce-dac502259ad0.jpg


当合并master分支到你的feature分支时,你有两个选择:merge或rebase。

#Merge

最简单最常用的是将master分支合并到feature分支中:

git checkout feature
git merge master
或者,你可以简化为一行:
git merge master feature

这会在feature分支中创建一个新的“merge commit”,它将两个分支的历史联系在一起,为你生成如下所示的分支结构:

1d7a38b4-fae1-11ed-90ce-dac502259ad0.jpg



合并很好,因为它是一种非破坏性的操作。现有分支结构不会以任何方式更改。这避免了rebase的所有潜在缺陷(下面细说)。另一方面,这也意味着每次上游更改时feature都需要合并,且有无关的合并提交。如果master改动非常频繁,这可能会严重污染你分支的历史记录。尽管可以使用高级git log选项减轻此问题的影响,但它可能使其他开发人员难以理解项目的历史更改记录。

#Rebase

作为merge的替代方法,你可以使用以下命令将feature分支rebase到master分支上:

git checkout feature
git rebase master

这会将整个feature分支移动到master分支的顶端,从而有效地整合了所有master的新提交。但是,rebase不是使用merge commit,而是通过为原始分支中的每个提交创建全新的提交来重写项目历史记录。

1d8a3476-fae1-11ed-90ce-dac502259ad0.jpg



rebase的主要好处是可以获得更清晰的项目历史记录。首先,它消除了不必要的git merge产生的merge commit。其次,正如在上图中所看到的,rebase也会产生完美线性的项目历史记录 - 你可以从feature分支顶端一直跟随到项目的开始而没有任何的分叉。

这使得它比命令git log,git bisect和gitk更容易浏览项目。但是,对这个原始的提交历史记录有两个权衡:安全性和可追溯性。如果你不遵循rebase的黄金法则,重写项目历史记录可能会对你的协作工作流程造成灾难性后果。其次rebase会丢失merge commit提供的上下文 - 你无法看到上游更改何时合并到功能中。

#Interactive Rebase

Interactive rebase使你有机会在将提交移动到新分支时更改提交。这比自动rebase更强大,因为它提供了对分支提交历史的完全控制。通常,这用于在合并特征分支到master分支之前清理杂乱的历史记录。要开始基于交互式会话,请将i选项传递给git rebase命令:

git checkout feature
git rebase -i master

这将打开一个文本编辑器,列出即将移动的所有提交:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

列表准确给出了执行rebase后分支的概况。通过更改pick命令和(或)重新排序,可以使分支的历史记录成为你想要的内容。例如,如果第二次提交修复了第一次提交中的一个小问题,你可以使用以下fixup命令将它们压缩为单个提交:

pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

保存并关闭文件时,Git将根据你的指令执行rebase,从而产生如下所示的项目历史记录:

1d95fcf2-fae1-11ed-90ce-dac502259ad0.jpg


消除这种无意义的提交使你的历史记录更可读。这是git merge无法做到的事情。


rebase的黄金法则

一旦你理解了什么是rebase,最重要的是了解什么时候不使用它。git rebase的黄金法则是永远不要在公共分支使用它。例如,想想如果你把master分支rebase到你的feature分支会发生什么:

1da1d8b0-fae1-11ed-90ce-dac502259ad0.jpg


rebase将master所有提交移动到feature顶端。问题是这只发生在你的仓库中。所有其他开发人员仍在使用原始版本master。由于rebase导致全新的提交,

Git会认为你的master分支的历史与其他人的历史不同。同步两个master分支的唯一方法是将它们合并在一起,从而产生额外的合并提交和两组包含相同更改的提交(原始提交和来自rebase分支的更改)。

这将是一个非常令人困惑的情况。因此,在你运行git rebase之前,总是问自己,“还有其他人在用这个分支吗?”如果答案是肯定的,那就把你的手从键盘上移开,考虑使用非破坏性的方式进行(例如,git revert命令)。否则,你可以随心所欲地重写历史记录。


强制推


如果你尝试将rebase过的master分支推到远程仓库,Git将阻止你这样做,因为它与远程master分支冲突。但是,你可以通过传递--force标志来强制推送,如下所示:

#这个命令要非常小心!
git push --force

这将覆盖远程master分支以匹配rebase过的分支,并使团队的其他成员感到困惑。因此,只有在确切知道自己在做什么时才能非常小心地使用此命令。

工作流rebase可以根据你团队的需要尽多地或少量地整合到你现有的Git工作流程中。在本节中,我们将了解rebase在功能开发的各个阶段的好处。任何工作流程git rebase的第一步是为每个功能创建专用分支。这为你提供了必要的分支结构,以安全地利用rebase:

1db1759a-fae1-11ed-90ce-dac502259ad0.jpg



本地清理

将rebase加入工作流程的最佳方法之一是清理本地正在进行的功能。通过定期执行交互式rebase,你可以确保功能中的每个提交都具有针对性和意义。这使你可以写代码而无需担心将其分解为隔离多个的提交 - 你可以在事后修复它。

调用git rebase时,有两个基(base)选项:feature的父分支(例如master),或feature中的历史提交。我们在Interactive Rebasing部分看到了第一个选项的示例。当你只需要修复最后几次提交时,后一种选择很好。例如,以下命令仅针对最后3次提交的交互式rebase。

git checkout feature
git rebase -i HEAD~3

通过指定HEAD~3为新的基,你实际上并没有移动分支 - 你只是交互式地重写其后的3个提交。请注意,这不会将上游更改合并到feature分支中。

1dc2fc34-fae1-11ed-90ce-dac502259ad0.jpg

如果要使用此方法重写整个功能,git merge-base命令可用于查找feature分支的原始基。以下内容返回原始基础的提交ID,然后你可以将其传递给

git rebase:
git merge-base feature master

交互式rebase的使用是引入git rebase工作流的好方法,因为它只影响本地分支。其他开发人员唯一能看到的就是你的成品,这应该是一个简洁易懂的分支历史记录。
但同样,这仅适用于私有功能分支。如果你通过相同的分支与其他开发人员协作,则该分支是公共的,并且你能重写其历史记录。

#总结

这就是你需要知道的关于rebase你的分支。如果你更喜欢提交的干净,消除不必要合并的线性历史记录,那么你在继承另一分支的更改时应该使用git rebase 而不是git merge。

另一方面,如果你想保留项目的完整历史记录并避免重写公共提交的风险,你可以仍然使用git merge。这两种选择都是完全可以的,但至少可以选择利用git rebase有它的好处。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Git
    Git
    +关注

    关注

    0

    文章

    193

    浏览量

    15420
  • Feature
    +关注

    关注

    1

    文章

    80

    浏览量

    7804

原文标题:git只知道merge,试试rebase!

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Git常用命令总结

    在之前的文章中,我们讨论了一些初学者必备的 Git 命令。然而,这些命令仅仅触及了 Git 功能的皮毛。
    发表于 07-21 10:30 225次阅读

    Git常用的超级实用命令

    的一些Git工作流。 1 Git 常用的超级实用命令 1.1 与仓库相关的操作 克隆代码仓库到本地,开发必用 git clone 查看本地仓
    的头像 发表于 10-09 17:19 919次阅读
    <b class='flag-5'>Git</b>常用的超级实用<b class='flag-5'>命令</b>

    git命令的基本使用

    git config 第一次使用git或者刚安装的git时,使用此命令设置身份Name 和 Eamail 地址。并且每次提交时会使用此信息。
    的头像 发表于 12-11 13:53 577次阅读

    Git 常用命令大全

    。下面分享下常用的命令1) 远程仓库相关命令检出仓库:$ git clone git://github.com/jquery/jquery.
    发表于 10-11 17:23

    开发人员在使用Git时几种常见错误

    如果你想把一个分支的修改合并到当前分支,你可以用git rebase。它和git merge的区别是merge有一个合并commit的步骤,
    的头像 发表于 11-08 09:17 2635次阅读

    Git命令解析-mergerebase

    同步,并形成无分支记录的提交链。执行时在控制台输出Fast-forward标识。这种merge方式下不会产生冲突,git log命令会看到如下记录:但在团队合作开发时,通常会多人修改同一远程分支。其中
    的头像 发表于 07-29 18:21 903次阅读
    <b class='flag-5'>Git</b><b class='flag-5'>命令</b>解析-<b class='flag-5'>merge</b>、<b class='flag-5'>rebase</b>

    Git命令解析-patch、apply、diff

    无论是merge还是rebase,都是在同一个工作目录中协调差异,处理变更历史。而git的另一些命令,允许开发者单独保存,或者通过文件或邮件的方式与别人分享这些差异。
    的头像 发表于 06-15 09:28 2635次阅读

    第一本Git命令教程(六) - 日志

    。有三种 Git 命令可以帮我们查看记录,痞子衡为大家一一讲解: 1. 查看本地历史提交 git log git log 是最直接的查看历史提交的
    的头像 发表于 12-05 17:22 603次阅读

    Git 命令+原理 程序员必备的基础

    是什么? Git相关理论基础 日常开发中,Git的基本常用命令 Git进阶之分支处理 Git
    的头像 发表于 11-14 10:01 1526次阅读
    <b class='flag-5'>Git</b> <b class='flag-5'>命令</b>+原理 程序员必备的基础

    Git引出一个经典的算法问题:最近公共祖先

    这二者最直观的区别就是:merge 方式合并的分支会看到很多「分叉」,而 rebase 方式合并的分支就是一条直线。但无论哪种方式,如果存在冲突,Git 都会检测出来并让你手动解决冲突。
    的头像 发表于 04-21 15:28 1087次阅读

    Git高效命令的使用技巧

    今天浩道跟大家分享关于Git高效命令的硬核干货,掌握这些技巧,使你事半功倍!
    的头像 发表于 02-28 16:41 731次阅读

    git命令和参数

        不知道大家平时都是怎么去学习git的,要记忆那么多的命令和参数,我个人是不推荐死记硬背的,以往经验证明卷的越疯狂忘的也越快! 其实简单的理解工作原理和熟练运用少部分常用命令,日常开发问题不大
    的头像 发表于 05-31 14:22 373次阅读

    git rebasegit merge的区别

      解决冲突 git rebasegit merge的区别 分支合并 git merge是用来
    的头像 发表于 07-05 09:54 402次阅读
    <b class='flag-5'>git</b> <b class='flag-5'>rebase</b>和<b class='flag-5'>git</b> <b class='flag-5'>merge</b>的区别

    Git命令的综合手册怎么找

    若你使用 Git 时需要获取帮助,有三种等价的方法可以找到 Git 命令的综合手册(manpage): $ git help $ git -
    的头像 发表于 07-22 11:02 432次阅读

    git基本操作命令用法

    基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git add files把当前文件放入暂存区域。 git commit给暂存区域生成快照并提交。 git
    的头像 发表于 09-13 16:29 574次阅读
    <b class='flag-5'>git</b>基本操作<b class='flag-5'>命令</b>用法