[Git]升级合并两个Git库

本文详细介绍了如何在GitHub上将官方代码库的更新合并到个人fork的代码库中,以Apache NiFi项目为例,演示了从克隆仓库、添加远程源、拉取更新到解决合并冲突的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   对于Github上的开源代码,一般都采用fork方式到自己账户下,进行二次开发定制或增强修正一些功能,久而久之,你fork的代码已经与官方代码有了很大的差别,尤其是当官方升级版本后,也想升级自己fork库的代码,那么就需要涉及升级合并两个库。

 

   以Apache 的NiFi项目为例说明,Github库为

 https://github.com/apache/nifi.git

 自己fork的库地址为

https://github.com/kemixkoo/nifi.git

 

    自该文时,Apache已发布正式版1.7.1, 假设自己fork的master是基于1.7.0-SNAPSHOT,现在需要将Apache官方发布版本的tag "rel/nifi-1.7.1"合并到自己开发分支的master上。

升级合并

 

为了达到升级合并release tag的目的,首先需要clone自己fork的库:

git clone https://github.com/kemixkoo/nifi.git

然后进入本地的nifi目录(即库工作目录),添加Apache官方NiFi库:

git remote add official https://github.com/apache/nifi.git

然后拉取最新的官方代码:

git fetch official

fetch之后,.git/config里的内容如下:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/kemixkoo/nifi.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

[remote "offical"]
    url = https://github.com/apache/nifi.git
    fetch = +refs/heads/*:refs/remotes/offical/*

准备工作已经就绪了,现在就开始正式的代码升级合并,为了保证不破坏原master分支,可临时创建一基于master的升级分支upgrade。

git co -b upgrade origin/master

由于先clone的是自己的fork库,所以默认的origin/master是自己fork的master远程分支,而经过fetch之后official/master是官方的master远程分支。

 

由于官方的release Tag是以rel开头的,比如rel/nifi-1.7.1,合并升级执行:

git merge rel/nifi-1.7.1

如果有合并冲突,可能有“CONFLICT (content)”之类的信息。可通过执行git status查看具体的冲突文件,在“Unmerged paths”列表下有both开头的,均为冲突文件,具体说明见下表:

状态操作说明

both modified

手动解决冲突文件冲突,需手动解决每一个文件的冲突
both deleted不做操作同时都删除,无需做任何操作,也许拉取了官方的单个提交导致

both added

不做操作同时都添加而无冲突,无需做任何操作,也许拉取了官方的单个新功能提交导致

deleted by us

检查被我们删除,可能无需做任何操作,需检查依赖
deleted by them检查被官方删除,需检查是否有依赖,如果也不需要,可不做任何操作

added by us

不做操作

 由我们新添加,无需做任何操作

added by them不做操作由官方新添加,可能是新功能,无需做任何操作

因此主要关注“both modified”状态的文件,需要手动一个一个仔细的解决冲突,否则将导致比较严重的后果。

解决完冲突后,即可执行添加index操作,并提交

git add .
git ci -m "Upgrade to 1.7.1"

至此,升级合并操作已完成,实际上如果想合并最新的master,也是类似操作,只是将release tag “rel/nifi-1.7.1”替换为官方的master,即

git merge official/master

 

但是为了保证升级成功,可执行相应CI程序,比如打包,测试等等后继验证流程。

 

最后说明几点:

  1. 为何用merge而不用rebase?这是因为,rebase解决冲突是每个提交解决一次,如果有比较多的提交有冲突,那么需要解决n次,这是比较烦恼的,采用merge只需一次即可解决所有的冲突。
  2. 为何merge没有策略选项,这是因为需要保证所有文件状态都可见,而不采用策略而自动处理,势必导致后期查找问题比较困难。

 

<think>好的,我现在需要回答用户的问题:“如何在Git合并两个分支的提交记录”。首先,我需要回顾用户提供的引用资料和之前的对话历史,确保回答准确且符合用户需求。 用户之前询问的是如何将两次提交合并为一次,我详细讲解了使用`git rebase`和`git reset`的方法。现在,用户的问题转向合并两个分支的提交记录。根据引用内容,用户提供的资料中提到了使用`git merge`和`git rebase`来合并分支,并提到了合并后的处理步骤,比如解决冲突和推送代码。 首先,我需要明确用户的问题:合并两个分支的提交记录。这可能有两种理解:一是将两个分支的提交历史合并成一个线性的历史记录(比如使用rebase),二是将两个分支的内容合并,但保持各自的提交记录(比如使用merge)。需要根据引用资料中的信息来判断正确的方法。 引用[2]提到,`git pull --rebase`会将两个分支融合成一个线性的提交,而`merge`会生成新的节点。这说明用户可能希望将两个分支的提交记录合并成线性历史,而不是保留分叉。因此,使用`rebase`可能更符合用户需求,或者使用`merge`的不同选项。 引用[3]和[4]详细描述了使用`git merge`的步骤,包括切换分支、拉取代码、合并、解决冲突和推送。引用[5]则提到了在rebase成功后,将分支合并到主分支。这说明合并两个分支的提交记录可能涉及到两种方法:合并(merge)和变基(rebase)。 接下来,我需要整理这两种方法的步骤,并说明它们的区别和适用场景。用户可能需要了解如何选择合适的方法,以及操作后的结果是什么。同时,需要提醒用户注意冲突解决和强制推送的风险,尤其是当分支已经推送到远程仓时。 另外,用户之前的问题是关于合并两次提交,而现在是合并两个分支的提交记录,虽然都是合并,但操作对象不同,一个是同一分支的提交,另一个是不同分支。需要明确区分这两者的不同步骤。 在回答结构上,应该分步骤说明两种方法:使用merge和使用rebase。同时,对比它们的优缺点,帮助用户根据需求选择。此外,需要包含验证结果和特殊情况处理,如冲突解决和强制推送的注意事项。 还需要参考之前的回答,保持一致性,比如之前提到的交互式变基和软重置,但这次是针对分支的合并,所以可能需要不同的命令。同时,确保引用正确的引用来源,如引用[1]、[3]、[4]关于merge的步骤,引用[2]、[5]关于rebase的应用。 最后,生成相关问题,帮助用户进一步了解相关操作,比如如何解决合并冲突,或者选择merge和rebase的场景区别。</think>### 如何合并两个分支的提交记录?Git 核心方法详解 在Git合并两个分支的提交记录主要有两种方式:**合并提交(Merge)**和**变基整合(Rebase)**。以下是具体操作方法与核心区别: --- #### 一、方法1:合并提交(`git merge`)——保留完整历史 适用于需要**保留分支独立演进历史**的场景(例如团队协作开发) **操作步骤:** 1. **切换到目标分支** ```bash git checkout master # 准备将dev分支合并到master git pull origin master # 更新目标分支代码[^3] ``` 2. **执行合并操作** ```bash git merge dev # 将dev分支合并到当前分支(master) ``` - 添加`--no-ff`参数强制保留合并记录: ```bash git merge --no-ff dev # 生成明确的合并节点[^4] ``` 3. **处理合并冲突**(若存在) - 手动编辑冲突文件(文件中会用`<<<<<<<`标记冲突位置) - 标记已解决文件: ```bash git add [冲突文件路径] # 例如:git add src/index.js ``` - 完成合并: ```bash git commit -m "合并dev分支到master" ``` 4. **推送变更** ```bash git push origin master # 将合并结果推送到远程仓[^1] ``` **结果特征:** - 提交历史会显示分叉与合并节点 - 保留两个分支原有的所有提交记录 --- #### 二、方法2:变基整合(`git rebase`)——线性化历史 适用于**整理提交记录为直线**(例如个人分支整理) **操作步骤:** 1. **切换到待整理分支** ```bash git checkout dev # 准备将dev分支变基到master git pull --rebase origin dev # 确保本地分支最新[^2] ``` 2. **执行变基操作** ```bash git rebase master # 将dev的提交"嫁接"到master最新提交之后 ``` 3. **处理冲突**(流程与merge相同) ```bash # 解决冲突后执行: git add [文件路径] git rebase --continue # 继续变基流程[^4] ``` 4. **切换到主分支合并** ```bash git checkout master git merge dev # 此时会触发快进合并(Fast-forward) git push origin master ``` **结果特征:** - 提交历史变为线性结构 - dev分支的所有提交将出现在master分支最新提交之后 --- #### 三、两种方法对比 | 特征 | `git merge` | `git rebase` | |---------------------|---------------------------------|-----------------------------------| | **历史记录** | 保留分支结构,显示合并节点 | 线性历史,隐藏分支分叉 | | **适用场景** | 公共分支合并(如master/main) | 个人分支整理 | | **冲突处理** | 合并时一次性解决 | 可能在每次提交重放时触发多次冲突 | | **远程分支影响** | 无需强制推送 | 私有分支可强制推送,公共分支慎用 | --- #### 四、关键操作示意图 **Merge合并效果:** ``` C---D---E dev / \ A---B---F-----------G master(合并提交节点) ``` **Rebase合并效果:** ``` A---B---F---C'---D'---E' master(线性历史)[^2] ``` --- #### 五、注意事项 1. **已推送分支慎用rebase**:变基会改写提交哈希值,协作分支需全员同步[^1] 2. **合并前备份分支**: ```bash git branch dev-backup dev # 创建分支备份 ``` 3. **图形工具辅助**: ```bash git log --graph --oneline # 查看分支拓扑图 ``` --- ### 相关问题 1. 如何撤销已经执行但出错的`git merge`操作? 2. 使用`git rebase`时如何跳过特定提交? 3. 为什么合并公共分支时推荐用`merge --no-ff`? [^1]: 强制推送会覆盖远程提交历史,影响团队协作 : rebase通过重写提交实现线性历史,适用于本地分支整理 [^3]: 合并前更新目标分支可避免引入过时代码 : `--no-ff`参数强制创建合并节点,保留完整操作记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值