当前位置: 首页 > news >正文

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录

  • 1. 场景描述
    • 1.1 分支状态
  • 2. 推荐的操作方式
    • 方法 1:git merge(保留分支结构)
    • 方法 2:git rebase(线性合并提交历史)
      • 直接在master分支执行git merge br_feature,再 执行 `git pull --rebase
    • 方法 3:git cherry-pick(选择性合并提交)
  • 最佳操作建议
  • F3 和 F3' 的定义

我有一个br_master分支,后来在1.1号建了一个特性分支 br_feature,在br_feature上有3个新提交 ,分别1.2 1.4 1.6号的提交,然后在br_master有2个提交,分别是1.3 1.5,现在我要把br_feature上的3个提交 合并到 br_master上,好的操作是什么?

1. 场景描述

1.1 分支状态

【主分支 br_master:】

  • 1月1日创建,包含以下提交:

    • C1 (1.1 初始提交)
  • 在 1月3日和 1月5日,有两次新增提交:

    • C2 (1.3 提交 2)
    • C3 (1.5 提交 3)

当前状态:

C3 (1.5) -> br_master 提交 3
C2 (1.3) -> br_master 提交 2
C1 (1.1) -> 公共祖先

【特性分支 br_feature】

  • 于 1月1日从 br_master 分支创建。
  • 在 1月2日、1月4日、1月6日,有 3 次提交:
    • F1 (1.2 提交 1)
    • F2 (1.4 提交 2)
    • F3 (1.6 提交 3)

当前状态:

F3 (1.6) -> br_feature 提交 3
F2 (1.4) -> br_feature 提交 2
F1 (1.2) -> br_feature 提交 1
C1 (1.1) -> 公共祖先

2. 推荐的操作方式

方法 1:git merge(保留分支结构)

【切换到 br_master 分支】:

git checkout br_master

【合并 br_feature】:

git merge br_feature

【结果】:
提交历史中会生成一个合并提交:

*   M  -> 合并提交                 //merge提示
|\
| * F3 (1.6) -> br_feature 提交 3    //有分叉记录
| * F2 (1.4) -> br_feature 提交 2
| * F1 (1.2) -> br_feature 提交 1
* | C3 (1.5) -> br_master 提交 3
* | C2 (1.3) -> br_master 提交 2
* C1 (1.1) -> 公共祖先

【优点】:

  • 保留特性分支的独立开发历史。
  • 生成一个清晰的分支合并点,方便回溯。

【适用场景】:
团队协作中,适合需要完整历史记录的项目。

【操作安全性】:

特性分支和主分支的历史均未被修改,适合已经推送到远程仓库的分支。

方法 2:git rebase(线性合并提交历史)

【切换到 br_feature 分支】:

git checkout br_feature

【将 br_feature 的提交重新应用到 br_master 最新提交之后】:

git rebase br_master

【切换回 br_master 分支并快进合并】:

git checkout br_master
git merge br_feature

【结果】:

提交历史变为线性,按时间顺序排列:

* F3' -> br_feature 提交 3(重新生成的提交)
* F2' -> br_feature 提交 2
* F1' -> br_feature 提交 1
* C3  -> br_master 提交 3
* C2  -> br_master 提交 2
* C1  -> 公共祖先

【优点】:

  • 提交历史变得干净和线性,适合需要简单提交记录的项目。
  • 易于代码审查。

【适用场景】:

单人开发,或者特性分支尚未推送到远程仓库。

【注意事项】:

如果 br_feature 已经推送到远程仓库,执行 rebase 后可能需要强制推送(git push --force)。

直接在master分支执行git merge br_feature,再 执行 `git pull --rebase

有什么区别?

有区别,区别在于 此时merge记录是仍存在的。
相同点是都提交到了master最新提交之后
在这里插入图片描述

方法 3:git cherry-pick(选择性合并提交)

【切换到 br_master 分支】:

git checkout br_master

【逐一挑选 br_feature 的提交】:

git cherry-pick <commit_hash_F1>
git cherry-pick <commit_hash_F2>
git cherry-pick <commit_hash_F3>

【结果】:

提交历史保留了主分支的连续性,br_feature 的提交被以新的哈希值添加到 br_master 上:

* F3' (1.6) -> br_feature 提交 3
* F2' (1.4) -> br_feature 提交 2
* F1' (1.2) -> br_feature 提交 1
* C3 (1.5) -> br_master 提交 3
* C2 (1.3) -> br_master 提交 2
* C1 (1.1) -> 公共祖先

【优点】:

  • 可以选择性合并部分提交,而无需整合完整的特性分支。
  • 不会引入额外的合并提交或分支上下文。

【适用场景】:

需要调整或精简 br_feature 的提交内容时。

【注意事项】:

  • 原始分支历史(br_feature 的上下文)会丢失。
  • 如果提交较多,操作可能会比较繁琐。

最佳操作建议

【优先使用 git merge】:

  • 保留特性分支的独立性,历史记录清晰。
  • 不会修改提交哈希值,适合团队协作。

【在单人开发或对提交历史有严格要求时,使用 git rebase】:

  • 线性合并提交,更加简洁。
  • 避免生成额外的合并提交。

【在只需部分合并时,使用 git cherry-pick】:

灵活选择提交,适用于特定需求。

F3 和 F3’ 的定义

【F】3:

  • 原始提交的标识符。
  • 哈希值(commit hash)是在分支 br_feature 上创建时生成的,具体由提交的内容、父提交的哈希值、提交作者和时间等因素决定。
  • 它代表了特性分支上特定的提交。

【F3’(带撇号的 F3)】:

  • 是原始提交 F3 的一个“重新生成”版本。
  • 发生这种情况时,提交的内容可能相同,但父提交的哈希值已改变,从而导致新的提交哈希值(即 F3’)与 F3 不同。

F3’ 通常出现在以下场景:

  • git cherry-pick:将 F3 应用到另一个分支上,生成新的提交。
  • git rebase:将 F3 的提交内容重新应用到另一分支的最新提交之后,也会生成一个新的提交。
http://www.lryc.cn/news/504722.html

相关文章:

  • WPF 相比 winform 的优势
  • PYQT5程序框架
  • Linux 中的 mkdir 命令:深入解析
  • 【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
  • Linux栈帧
  • leetcode刷题——回溯算法(1)
  • 3D相框案例讲解(详细)
  • 制作安装包
  • P8615 拼接平方数 P8699 排列数
  • 【C语言】拆解C语言的编译过程
  • 【C++】青蛙跳跃问题解析与解法
  • 自动驾驶AVM环视算法--python版本的俯视TOP投影模式
  • Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅
  • Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo
  • ElasticSearch 常见故障解析与修复秘籍
  • 序列模型的使用示例
  • 对rust的全局变量使用drop方法
  • Node.js教程入门第一课:环境安装
  • Visual Studio 使用 GitHub Copilot 扩展
  • 【Qualcomm】IPQ5018获取TR069 WiFi 接口Stats状态方法
  • 数字营销咨询,照亮企业营销数字化每一步
  • 修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号
  • 【Cmake】
  • Flutter 内嵌 unity3d for android
  • sqlite加密-QtCipherSqlitePlugin 上
  • 正交投影 (Orthographic Projection) 详解
  • 盛元广通畜牧与水产品检验技术研究所LIMS系统
  • 三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇)
  • PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序
  • 【Unity3D】报错libil2cpp.so找不到问题