合并 git 中没有真正共同祖先的复制存储库的更改

2024-02-10

我有一个项目 DemoA,它是基于 git 存储库 Project1 构建的。

不幸的是,DemoA 一开始只是 Project1 文件的副本,然后才变成一个实际的长期项目。我现在想让 Project1 成为 DemoA 的子模块,但更重要的是,希望合并对 DemoA 中从 Project1 派生的代码所做的更改。

我在 DemoA 上进行了子树拆分,以创建分支 P1,其中对 DemoA 中的 Project1 代码库进行了所有更改。

我还设法在将 Project1 实例化为存储库之前添加对 DemoA 所做的更改。

Project1
A - B - C - D                     - E
Demo1/P1
    (untracked changes) F - G - H - I

where the files in E are identical to F

我想要的是:

Project 1
A - B - C - D - E - G - H - I

显然,E 和 F 的哈希值不同,因此当我将 Demo1/P1 作为远程添加到 Project1 并尝试合并时,它抱怨没有共同的祖先。

我努力了使用格式补丁 https://stackoverflow.com/questions/2217452/in-git-how-do-i-create-a-single-patch-for-the-last-2-revisions,但是 git am 已经抱怨了

错误:file.xyz:索引中已存在

我试图重新定位到不同的分支 https://stackoverflow.com/questions/973268/replay-the-last-n-git-commits-on-a-different-branch/973403#973403, doing:

git rebase -s recursive -X subtree=project1dir --onto (E-hash) (F-hash) emptybranch

但我显然不明白它实际上在做什么,因为它似乎实际上并没有do任何事物。

有没有一种干净的方法来做到这一点?我不介意这个过程需要一些手动操作,但我想保留历史。


这都是中等难度的(实际难度取决于环境和你对 Git 的熟悉程度)。

如果文件在E and F确实相同,做到这一点的(或)简单方法是放入移植物(用git replace或移植文件),以便 Git 假装G的父提交是提交E。也就是说,你有:

A--B--C--D--E   <-- master

F-------------G--H--I   <-- refs/remotes/rem/P1

and git diff master rem/P1~4根本不产生输出(master名称提交E, rem/P1~4名称提交F,以及两棵树E and F完全匹配)。

You wish,至少作为一个中间产品,你有这个:

A--B--C--D--E   <-- master
             \
F             G--H--I   <-- refs/remotes/rem/P1

也就是说,您希望 Git 假装(至少出于某些目的和一段时间)提交G已提交E作为其父级。

Using git replace模仿旧的可怕的黑客移植

Git 移植正是这样做的:它们告诉 Gitpretend某些提交的父级是其他一些提交。但这些已被弃用,取而代之的是更通用的git replace https://www.kernel.org/pub/software/scm/git/docs/git-replace.html。您可以使用git replace进行新的提交G'类似于(但至少取代了大多数 Git 命令)G,唯一的区别是G' has E作为其父级。

然后你可以使用git filter-branch重新复制存储库中的提交,以便此替换变得真实且永久,而不仅仅是副本。当然,您将获得新提交的新提交哈希值(G'可以保留它的哈希值,但你必须得到一个新的H' and I'). See Jakub Narębski 的回答 https://stackoverflow.com/a/3811028/1256452, 进而git 移植和替换有何不同? (移植现在已经被废弃了吗?) https://stackoverflow.com/q/6800692/1256452,其中 VonC 链接到 Jakub 的答案。

(Git 移植仍然有效,你可以将提交的哈希值放在G and E into .git/info/grafts: echo $(git rev-parse rem/P1~3) $(git rev-parse master) > .git/info/grafts, 例如。但他们are这是一个可怕的黑客行为,如果你做了这种伎俩,最好是事后立即运行你的过滤器分支,正如 Jakub 指出的那样。)

Using git rebase

您还可以使用git rebase --onto,正如您所尝试的那样,但是您必须使用现有的(普通的,本地的)分支名称来启动此变基(我不确定在哪里emptybranch来自这里)指向提交I。我认为您可能缺少的步骤可能是制作这个常规的普通本地分支名称:

git checkout -b rewrite rem/P1

例如,假设名称rem/P1决心承诺I. Or git checkout -b rewrite <hash-of-I>,如果您面前有该哈希值以便于剪切/粘贴。那时你会得到这个:

A--B--C--D--E   <-- master

F-------------G--H--I   <-- HEAD -> rewrite, rem/P1

也就是说,您现在正在使用这个新的rewrite分支,指向提交I。现在你可以git rebase --onto master HEAD~3复制当前分支上最近的 3 个提交 -G, H, and I。副本将是G', H', and I',与父母G' being E——承诺master点——以及H' being G'等等:

              G'-H'-I'   <-- HEAD -> rewrite
             /
A--B--C--D--E   <-- master

F-------------G--H--I   <-- rem/P1

现在您可以删除远程及其远程跟踪分支,因为您拥有所需的提交链。您还可以快进master指向提交I'任何时候,如果这是你想要的。

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

合并 git 中没有真正共同祖先的复制存储库的更改 的相关文章

  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • Git 无效的修订范围 Symfony2 Composer 外部包

    RuntimeException Failed to execute git log 18efcf67d236d5bbf46ac67820250dffd0474b6e 94e2146f525fa1367e15646fa273e5b34f92
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • IntelliJ:查看本地和 git 提交/分支之间所有已更改文件的差异

    使用 IntelliJ 的 diff 查看器是检查代码的一种非常好的方法 因为您可以使用 IntelliJ 代码编辑器的所有功能 重构 完成等 在本地版本中进行更改 不幸的是 我还没有弄清楚当你在 IntelliJ 中进行代码审查时如何做最
  • 如何解决 VSTS 中拉取请求中的合并冲突?

    我已经创建了拉取请求 我进入了这个 批准 按钮不执行任何操作 并且 完成 被禁用 如何解决拉取请求中的冲突 Update 微软刚刚添加了基于浏览器的合并 这可能会让你摆脱小冲突的困境 并提供自 Sprint 150 起改进了不同场景的可视化
  • 代表 Git 存储库的数学结构是什么

    我正在学习 Git 如果我能描述一下代表 Git 存储库的数学结构 那就太好了 例如 它是一个有向无环图 它的节点代表提交 它的节点有代表分支等的标签 每个节点最多一个标签 没有标签使用两次 我知道这个描述不正确 我只是想解释我正在寻找的内
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • 在 Clearcase 上使用 Mercurial 时保留历史记录

    我在 ClearCase 商店工作 CC 在集成团队的工作方面做得很好 尽管我们的代码审查流程阻止我使用它来跟踪我的日常更改 在我的 CC 视图之上创建 hg 存储库效果非常好 我可以跟踪我的更改并轻松在文件服务器上进行备份 为人们生成差异
  • 在 github 上的 fork 中跟踪上游的最佳实践

    摘要 对于要维护一组本地更改的上游存储库 处理长期运行跟踪的最佳实践是什么 我想让 github 上的 fork 与上游保持同步 但仍然允许清晰跟踪 fork 特有的更改 对于本次讨论 假设upstream指向主项目存储库并且origin指
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可

随机推荐

  • 如何使用 C# API 将 BigQuery 行转换为 JSON?

    我使用下面的 C 代码从 BigQuery 表中提取一些数据 BigQueryClient client BigQueryClient Create
  • Ruby on Rails - 搜索结果分页

    我有 2 个模型 Post 和 Location 其中 location has many posts 和 post owns to location 搜索工作正常 分页也工作正常 除了total entries 结果显示超过 10 条 查
  • 以编程方式更改 UIImageView Xcode Swift 的高度和宽度

    嘿 出于某种原因 我正在努力尝试设置我的图像视图之一的高度和宽度 我想将其设置为高度仅占屏幕的 20 我知道要定期设置它 您可以执行以下操作 图像 0 0 50 50 但我需要高度不是一个静态数字 像 image 0 0 frame hei
  • 为什么 val_loss 和 val_acc 不显示?

    训练开始时 运行窗口中仅显示loss和acc 缺少val loss和val acc 仅在最后才会显示这些值 model add Flatten model add Dense 512 activation relu model add Dr
  • jQuery + Gravity Forms:在错误验证时执行 jQuery

    我在当前的重力形式上使用了一些 jQuery 然而 当我提交表单并返回错误验证时 我丢失了一些 jQuery 目标 我很好奇如何更换 document ready function 一旦字段因错误验证而重新加载 就会调用我的 jQuery
  • 基于 BERT 的 NER 模型在反序列化时给出不一致的预测

    我正在尝试在 Colab 云 GPU 上使用 HuggingFace 变压器库训练 NER 模型 对其进行 pickle 并将模型加载到我自己的 CPU 上以进行预测 Code 模型如下 from transformers import B
  • 如何仅从级别顺序遍历字符串构造二叉树

    考虑具有以下属性的二叉树 如果内部节点 非叶节点 有两个子节点 则其值为 1 叶节点的值为 0 因为它没有子节点 树上的级别顺序遍历将生成一串 1 和 0 通过在访问每个节点时打印奇怪的值 现在给定这个字符串构造二叉树并在树上执行后序遍历
  • BPMN的优点和缺点?

    我希望您能告诉我从开发人员的角度来看 BPMN 的优点和缺点是什么 我将 UML 与 BPMN 进行比较 发现 UML 有很多优点和缺点 但 BPMN 却没有 这很大程度上取决于观众和目的 在建模语言方面 BPMN 和 UML 活动图涵盖了
  • Numpy - 用 NaN 替换数字

    我正在寻找用 numpy 中的 NaN 替换数字 并且正在寻找类似的函数numpy nan to num 除非相反 随着处理不同的数组 该数字可能会发生变化 因为每个数组都可以有唯一定义的 NoDataValue 我见过人们使用字典 但数组
  • 我什么时候应该在 Asp.Net Core 中使用 Task.Run?

    我相信您永远不必在 net core web 上下文中使用 Task Run 进行任何操作 如果您有一个长时间运行的任务或 CPU 密集型任务 您可以将其卸载到消息队列以进行异步处理 如果您有一个同步操作 但没有等效的异步方法 那么卸载到后
  • 文档中的 Firebase 云函数幂等性

    我正在关注 Firestore 的文档这里关于聚合查询 https cloud google com firestore docs solutions aggregation 我忍不住注意到云函数解决方案无法完全工作 因为它不是幂等的 nu
  • 我遇到此错误执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生失败

    在我的应用程序中 我有一个模型类 它有一些变量 我可以使用改造和房间数据库在该应用程序中调用并显示这些数据 这意味着该应用程序首先从服务器收集数据 然后显示在房间数据库中 但是当我在这个模型类中使用列表时 它显示了这个错误 这是我的代码 M
  • 我该如何转换这个 linq 表达式?

    假设我有一个要查询并应用排名的实体 public class Person Entity public int Id get protected set public string Name get set public DateTime
  • git lfs 迁移后 git repo 损坏

    git lfs migrate 使用不当 一切都会以某种方式生成包含每种已知文件类型的 gitattributes 文件 这基本上摧毁了我们的项目 因为每种类型的所有文件现在看起来都是这样的 version https git lfs gi
  • Git - 拉取后缺少标签

    它不是 几乎 因为 stackoverflow 不允许 精确标题的重复 Git Pull 一切都是最新的 但事实并非如此 https stackoverflow com questions 8350567 git pull everythi
  • ImportError:动态模块没有定义 init 函数,但它确实定义了

    我正在尝试为供应商 C 库编写绑定 我已经成功地使用如下代码片段在其他模块中定义 init 函数 但在这个模块中它似乎不起作用 它编译得很好 但是当我尝试将其导入到测试中时就会抛出 ImportError脚本 这里可能出了什么问题 ifnd
  • DirectX 11 叠加

    我正在为游戏编写 DirectX 11 覆盖 创建纹理非常简单 而且我对 C C 有很好的了解 我遇到的问题是在我的测试窗口中我可以打印纹理 但是一旦我改变相机角度 纹理就会随之移动 这就是大多数人想要的 我想知道的是如何以 2D 打印某些
  • 如何将球形贴图投影到球体/立方体上:“等距矩形到立方体”

    更新 我找到 http os ivrpa org panosalado wiki http os ivrpa org panosalado wiki 在java中有一个实现 谁有类似的 c 或 c 东西 我有这张全景图 来自谷歌街景的球形地
  • 用Java创建虚拟打印机

    我想使用 Java 创建一个虚拟打印机 这样当您打印文件 使用 Word 或其他东西 时 Java 打印机就会被列为有效打印机 我的目标是获取程序 Word 等 直接发送到打印机的打印机格式化对象 我不知道这是否可能 对于这个问题来说 这似
  • 合并 git 中没有真正共同祖先的复制存储库的更改

    我有一个项目 DemoA 它是基于 git 存储库 Project1 构建的 不幸的是 DemoA 一开始只是 Project1 文件的副本 然后才变成一个实际的长期项目 我现在想让 Project1 成为 DemoA 的子模块 但更重要的