如何合并两个没有共同祖先的分支?

2024-01-23

我已经开始在项目中使用 Git,其中前两次提交只是一些初始设置(.gitignore 和 .gitattributes),第三次提交M2添加SVN trunk的内容:

I1 -- I2 -- M2 -- N -- .. -- Z

我已将 SVN 历史记录导入名为svn, where M1是SVN主干(内容与M2,.gitignore 和 .gitattributes 除外):

A -- B -- ... -- K -- L -- M1

Q:合并两个分支的最佳方法是什么?

我可以合并M1 and M2 into M3,然后rebase,但我不知道如何删除I1 and I2提交,如果我可以安全地删除M3提交(我发现了一些保留合并提交的建议,但在这种情况下M3不再需要了)。

A -- B -- ... -- K -- L -- M1
                             \
                              M3 -- N' -- .. -- Z'
                             /
               I1 -- I2 -- M2 -- N -- .. -- Z

另一种方法是挑选N .. Z致力于svn手动分支,但我想避免这种方法。

最优雅的解决方案是对由N .. Z提交于之上svn分支,但我还没有找到没有共同祖先的两个分支所需的语法。


免责声明: 我自己只在玩具库中使用过一次“移植点”。但这是一个您可能没有听说过的晦涩功能,但它_可能_对您的情况有帮助。

您可以使用“移植点”来伪造祖先信息。参见,例如,.git/info/grafts 是做什么用的? https://stackoverflow.com/questions/161928/what-are-git-info-grafts-for或立即继续有关移植点的 git wiki 条目 http://git.or.cz/gitwiki/GraftPoint.

本质上,您将创建一个文件.git/info/grafts这会欺骗 git 认为提交M1是 commit 的祖先M2:

$ cat .git/info/grafts
<your M2 commit hash> <your M1 commit hash>

随后,它看起来像M2是一个刚刚合并的空提交I2 and M1变成一棵普通的树。

主要缺点:嫁接点未犯;因此,它不会被检出,而是需要手动添加到存储库的每个本地工作副本中。



Update: use git replace --graft https://git-scm.com/docs/git-replace反而。

如上所述,移植点已被取代。跑步

git replace --graft <your M2 commit hash> <your M1 commit hash>

创建移植物。这存储在.git/refs/replace/。尽管 git 默认情况下不会获取或推送这些引用,但可以使用以下方法在存储库之间同步它们:

git push origin 'refs/replace/*'
git fetch origin 'refs/replace/*:refs/replace/*'

(StackOverflow:如何在 git 中推送“引用/替换”而不推送任何其他引用? https://stackoverflow.com/a/20072413/1172714)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何合并两个没有共同祖先的分支? 的相关文章

  • 如何使用合并或替换来更新 R 中具有多列的表

    我想做一些与这个问题非常相似的事情 如何使用 merge 更新 R 中的表 https stackoverflow com questions 3190118 how to use merge to update a table in r
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • Git:如何正确合并两个功能完全不同的分支?

    想象一下这样一种情况 同一个项目有两个分支 第一个分支的一部分对另一个分支进行了大幅重构 但有一段时间 您需要保持两个分支的功能 因此您需要对两个分支进行错误修复和关键功能添加 有时是以不对称的方式 在某些时候 您必须将重构的分支合并到原始
  • Git 认为我每次进行小更改时都在重写我的一个文件

    我有一个中等大小的 Java 文件 每次我对一个文件 BuildTable java 进行更改时 Git 都会将其报告为巨大的更改 即使只是一两行 BuildTable java 大约有 200 行 本次提交中的更改仅更改了一行 git d
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • GitLab:无法将代码推送到服务器?

    我已经在 Ubuntu 服务器上安装了 GitLab 一切似乎都工作正常 除了我无法向服务器推送 拉取 克隆 当我按下时 我收到一般错误消息 fatal Could not read from remote repository Pleas
  • 如何从 Git 存储库中删除选定的提交日志条目,同时保留其更改?

    我想从线性提交树中删除选定的提交日志条目 以便这些条目不会显示在提交日志中 我的提交树看起来像 R A B C D E HEAD 我想删除 B 和 C 条目 以便它们不会显示在提交日志中 但应保留从 A 到 D 的更改 也许通过引入单个提交
  • 如何从暂存区删除单个文件(撤消 git add)?

    情况 我有一个 Git 存储库 其中文件已在索引中 我对几个文件进行了更改 打开 Git 并使用 git add 将这些文件添加到我的暂存区域 问题 如何从暂存区域中删除这些文件之一 但不将其从索引中删除或撤消对文件本身的更改 如果我正确理
  • Git Hook - 在我推送到 github 后让服务器拉取

    我有一个本地存储库 并且我在实时服务器上设置了另一个存储库 www site com projects ProjectA 我想要实现的目标非常简单 在我推送到 GitHub 后 我想要存储库位于www site com projects P
  • 如何将yarn add/npm install与monorepos一起使用

    我需要从 GitHub 中的私有 monorepo 下载节点包 类似于 monorepoProject subProjectA subProjectB 还有两个子项目A and 子项目B是 typescript 项目 如下图所示 subPr
  • 如何仅隐藏一些未提交的更改?

    我正在对 Git 存储库进行重大更改 并意识到某些更改需要向后移植到错误修复分支 我不想签入我的所有更改master因为它们还没有经过充分的测试和准备 但我确实想提取其中一些更改并将它们提交到错误修复分支 然后按原样返回到 master 我
  • 如何仅对最新合并后的提交进行变基?

    考虑以下场景 我从master那里检查了一个分支 我做了一些承诺 我合并了更新的master 我做了更多的承诺 现在我想要从第 4 点开始变基提交 以便从第 2 点开始的提交不受影响 所以如果我最初有 1 2 x x x x x x x m
  • 当隐含 ID 列时,如何合并 csv 文件中的多个数据框?

    我想将一堆数据框合并在一起 因为如果您只处理一个数据框 则许多操作似乎会更容易 但如果我错了 请纠正我 目前我有一个像这样的数据框 ID var1 var2 A 2 2 B 4 5 Z 3 2 每个 ID 位于单行上 并带有多个单个测量值
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • Xcode - 使用 SSH 身份验证添加存储库时出现身份验证失败错误

    我正在尝试通过 Xcode gt 设置 gt 帐户添加存储库 但我被困在正确的地址上 我们的存储库地址非常简单 my domain com port project name 通过 SSH 密钥进行身份验证 有人可以帮助我了解这里发生了什么
  • 如何使用 Groovy 获取自上次成功构建以来 Jenkins 的提交信息?

    如何编写自定义 groovy 脚本以轻松操作自上次成功构建以来所有提交的数据 在 gradle maven 步骤之后添加新的构建步骤 gt 执行系统 groovy 脚本 适配代码 import com tikal jenkins plugi
  • 将各种提交合并为一而不合并

    是否可以加入各种提交 这是我的情况 我的应用程序在 OSX 10 6 和 10 7 中运行 我已经修复了 10 6 的一些内容 然后提交了 更改为 10 7 并再次修复修复程序 以便它们兼容 然后再次提交 然后返回到 10 6 并再次检查并
  • GIT:向非当前分支添加本地更改

    我通常会遇到这样的情况 我做了一些本地更改 却发现我在错误的分支上进行了更改 因此我需要在提交之前切换分支 问题是当有本地更改时我无法切换分支 有办法做到这一点吗 显然 我可以复制更新的文件 切换分支 然后将它们复制回来 但这看起来并不聪明
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag

随机推荐