Git代码合并之使用 rebase 整理提交历史

这篇具有很好参考价值的文章主要介绍了Git代码合并之使用 rebase 整理提交历史。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

​以面试题为目标来进行学习,不定期推出前端高频面试题及其解析,题无简难,重在积累,欢迎wx关注西西星球

Git 中整合来自不同分支的修改有两种方式:git mergegit rebase。本文主要介绍 rebase 的3种使用场景:

  1. 场景1: 使用 rebase 合并分支–整合分叉的提交历史
  2. 使用 交互式的 rebase
    • 场景2: 压缩提交历史
    • 场景3: 修改多个提交信息

1 使用 rebase 合并分支

1.1 场景描述

我们在 feature 分支开发完新的功能后,通常会通过 merge 操作将代码合并到 master 分支,这样会产生一条分叉。这时可以通过变基使得提交历史更加整洁,看上去就像是串行的一样,提交历史是一条直线没有分叉。

1.2 操作命令

首先在自己的 feature 分支里进行开发,当开发完成时你需要先将你的代码变基到 master 上,然后再向 master 分支提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。具体操作如下:

# 1 变基到 master
git checkout feature
git rebase master

# 2 回到 master 分支,进行一次快进合并。
git checkout master
git merge feature

1.3 原理图解

假设在你的项目上 master 分支的提交为 C0、C1、C2、C3,基于 masterC2 节点拉出了一个 feature 分支,并产生了新的提交C4,如下图:

Git代码合并之使用 rebase 整理提交历史

整个变基操作的过程如下图所示,首先找到这两个分支(即当前分支 feature、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支(feature)指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用,此时 feature 指向 C4',如下图:
Git代码合并之使用 rebase 整理提交历史

最后回到 master 分支,进行一次快进合并,完成后 featuremaster 分支均指向 C4',如下图:

Git代码合并之使用 rebase 整理提交历史

至此合并分支操作完成,master 的提交历史是一条干净的、没有分叉的直线。

2 使用 交互式的 rebase

通过给 git rebase 增加 -i 选项来交互式地运行变基。 一般被用于将 feature 分支并入 master 分支之前,清理混乱的提交历史。

2.1 压缩提交历史

2.1.1 场景描述

觉得 commit 太小太散,将多个 commit 压缩成一个单独的提交。

2.1.2 操作命令

假设将 feature 分支当前最近的3个提交变为一个提交,操作如下:

# 1.执行交互式 rebase
git rebase -i HEAD~3
# 或使用如下命令
git rebase -i dbcc8dd # dbcc8dd 为与 HEAD~3 对应的 commitid

# 2.进入编辑器,将16.md-2、16.md-3 的 pick 改为 squash,代表想要把它们跟上一个 commit(16.md-1)合并 
pick fe08362 feat: update 16.md-1
squash 72a7fae feat: update 16.md-2
squash f606aec feat: update 16.md-3

# 3.第2步保存并退出编辑器后看到如下画面
feat: add file 16.md # 删除原本的 commit message, 改为自己想要的提交信息
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Aug 3 20:00:18 2022 +0800
#
# interactive rebase in progress; onto dbcc8dd
# Last commands done (3 commands done):
#    squash 72a7fae feat: update 16.md-2
#    squash f606aec feat: update 16.md-3
# No commands remaining.
# You are currently rebasing branch 'master' on 'dbcc8dd'.

# 4.操作完成,验证结果
git log

注意上述第2步中的反序显示。 交互式变基给你一个它将会运行的脚本。 它将会从你在命令行中指定的提交(HEAD~3)开始,从上到下的依次重演每一个提交引入的修改。 它将最旧的而不是最新的列在上面,因为那会是第一个将要重演的。

2.2 修改多个提交信息

2.2.1 场景描述

修改在提交历史中的提交信息。

2.2.2 操作命令

例如要修改 feature 分支最近三次的提交中的任意一个提交信息。

# 1.执行交互式 rebase
git rebase -i HEAD~3

# 2.进入编辑器,将要被修改信息的提交由 pick 改为 reword,代表要修改16.md-1的提交信息
reword fe08362 feat: update 16.md-1
pick 72a7fae feat: update 16.md-2
pick f606aec feat: update 16.md-3

# 3.第2步保存并退出编辑器后看到如下画面
修改后的提交信息feat: update 16.md-1 # 删除原本的 commit message, 改为自己想要的提交信息
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Aug 18 16:34:55 2022 +0800
#
# interactive rebase in progress; onto dbcc8dd
#...

# 4.操作完成,验证修改结果
git log

2.3 其它的一些操作

除了2.1、2.2的使用场景外,交互式的 rebase 还可以 调整commit顺序删除 commit 等,操作过程与2.1、2.2大同小异,具体可参考如下指令:

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.

3 注意事项

使用 rebase 得遵守一条准则:

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

换句话说,因为 rebase变更历史记录,所以最好是在 push 之前就做好 rebase,不然就是确保要这个 branch 只有你自己在修改,否则你也 rebase、他也 rebase,最后只会把历史记录搞得一团糟。文章来源地址https://www.toymoban.com/news/detail-413949.html

4 参考资料

  1. Git 官方文档
  2. 送 PR 前,使用 Git rebase 來整理你的 commit 吧!

到了这里,关于Git代码合并之使用 rebase 整理提交历史的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

    B站视频地址: https://www.bilibili.com/video/BV1KX4y1a7N9 Git学习文档:https://d9bp4nr5ye.feishu.cn/wiki/PeDPw3mm3iFA36k9td9cVeignsZ 在很长一段时间里,我对Git的操作只限于:提交代码,拉取代码,合并代码。 虽然上面这些操作在日常工作中也足够了,但不会点高级知识不利于装X,今天我们来学

    2024年02月08日
    浏览(35)
  • git rebase 合并提交

    git log --oneline 查看当前提交记录 git rebase -i HEAD~2 选择最后提交的2条记录进行合并 进入编辑界面,将c865404的 pick 改为 f , 表示向前合并也就是向cc5a54合并 编辑完之后 :wq 保存并退出 git rebase --continue git push --force origin feature/v1.2 推送到仓库 git rebase --abort 取消变基

    2024年02月16日
    浏览(19)
  • git rebase 合并多个提交

    开发过程中,本地通常会有无数次 commit ,可以合并相同功能的多个 commit,以保持历史的简洁。 命令使用 说明: -i(–interactive):弹出交互式的界面进行编辑合并 [commitid]:要合并多个版本之前的版本号,注意:[commitid] 本身不参与合并 例如,如下例子中你想合并前 5 个

    2024年02月07日
    浏览(21)
  • git rebase 合并提交与避免分叉合并

    本文让你熟练使用 rebase,学会以下两种操作,从此拒绝杂乱无章的 git 提交。 你可能出现过对同一处代码进行多次处理的场景。这会导致如下提交记录: 其实,中间的对 b 的3次提交完全可以合并成一次 commit,这个时候 rebase 就很有用了。 step1. 找到想要合并的 commit, 使用 re

    2024年02月15日
    浏览(25)
  • git使用常见问题(提交代码,合并冲突)

    git fetch 获取远程分支更新 git branch 查看本地分支 git branch -r 查看远程分支 git branch -a 查看所有分支(本地分支和远程分支) git clone 地址 克隆代码 git checkout 切换分支 git pull 同步到本地(拉) git push 推送至服务器 git checkout -b dev origin/master 基于主分支创建dev分支 git add . 添加

    2024年02月03日
    浏览(18)
  • IDEA中使用Git提交代码(包括合并分支)

    在IDEA中使用git提交代码到远程仓库,整体可分为如下几个步骤: 后面会介绍合并分支。 前提: 1.注册有GitHub或者Gitee账号;本地安装有git; 2.在Github和Gitee用户中心配置SSH公钥。(设置–SSH公钥)处有生成公钥教程。 步骤: 1.创建远程仓库(github或者gitee); 2.创建本地仓库

    2024年02月04日
    浏览(49)
  • 【git merge/rebase】详解合并代码、解决冲突

    目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 在实际开发中,一个项目往往是多个人一起协作的,头天下班前大家把代码交到远端仓库,第二天工作的第一件事情都是从服务器上拉最新的代码,保证代码版本的一致性。在这种团队协作中大家修改到同一份文件是难

    2024年02月08日
    浏览(26)
  • git必备知识 git使用常见问题(提交代码,合并冲突)

    git fetch 获取远程分支更新 git branch 查看本地分支 git branch -r 查看远程分支 git branch -a 查看所有分支(本地分支和远程分支) git clone 地址 克隆代码 git checkout 切换分支 git pull 同步到本地(拉) git push 推送至服务器 git checkout -b dev origin/master 基于主分支创建dev分支 git add . 添加

    2024年02月16日
    浏览(26)
  • git合并代码命令 分支合并代码 cherry-pick merge rebase区别

    1.cherry-pick 需要注意 暂存未提交的更改 暂存更改: 使用git stash或git stash push命令暂存当前工作目录和暂存区的更改。你可以提供一个消息作为参数,以便更容易地识别stash项: 执行cherry-pick: 现在,你的工作目录是干净的,可以安全地执行cherry-pick操作了。找到你想要cherry

    2024年04月12日
    浏览(25)
  • 使用 git rebase 合并多个 commit

    首先我们查看一下当前提交历史: 我们通过 git rebase -i 61e7d87 将 44f23cb 、 9d2725f 和 da3ba01 这三个提交合并,这里的 61e7d87 为 待合并的提交区间的前一个提交的哈希值 。 执行之后会进入到 vim 编辑器中,每一行代表一个 todo 项。我们这里需要 pick 第一个提交并将后面两个提交

    2024年01月25日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包