【问题标题】:git - easy way to merge 3 trees without touching index or working treegit - 在不触及索引或工作树的情况下合并 3 棵树的简单方法
【发布时间】:2022-12-17 15:31:54
【问题描述】:

我脑子里有一个相当邪恶的想法,要求我在我做的地方运行不同的合并操作不是想要触摸索引或工作树。我知道 git merge-tree,我认为它曾经用于执行我要求的操作,但它已被废弃(至少提供 3 棵树并将生成的树 ID 作为输出的可能性)。目前还有其他方法吗?

只是要清楚:

  • 我不想弄乱历史。
  • 我想提供基础树和 2 个尖端树。
  • 最后但并非最不重要的是,我知道不是想弄乱索引和工作树。

如果合并成功,我所需要的输出就是生成的树 ID……如果有冲突,我什么也得不到也没关系。

【问题讨论】:

  • 现在有一些正在进行的工作,但除非你想破解 Git 内部结构,否则要做的就是使用临时工作树和索引,这样会容易得多......(对于正在进行的工作,请参阅Git 邮件列表。)
  • 明白....将进入档案馆,看看它是怎么回事,并密切关注它。有没有一个线程在这方面脱颖而出?
  • 不确定“脱颖而出”,但从 the most recent here 开始,和/或在 Junio 的树中查找相应的主题(不确定在哪里找到)。
  • 其实那个眼神很多就像我当时从 git merge-tree 中丢失的一样。我想我可以稍等一下,直到它到达 main。
  • 这是对一些想法的第三次(?)复审,这些想法正被推向各个方向,所以不知道什么时候它可能真正进入next,更不用说 master/main 了。

标签: git git-merge


【解决方案1】:

虽然 git merge-tree already improved with Git 2.37/2.38,但只有 Git 2.40(2023 年第一季度)添加了您寻找的缺失部分:“merge-tree”学习了一个新的 --merge-base 选项。

请参阅commit 4cc9eb3(2022 年 11 月 24 日)和Kyle Zhao (yefengzkk)commit 501e3bacommit 66265a6(2022 年 11 月 11 日)。
(由Junio C Hamano -- gitster --合并到commit 7576e51,2022 年 12 月 14 日)

merge-tree.c:添加 --merge-base= 选项

签字人:Kyle Zhao
签字人:Taylor Blau

这个补丁将使我们的呼叫者更灵活地使用git merge-tree(man), 如:

git merge-tree --write-tree --merge-base=branch^ HEAD branch

这会合并 HEAD 和 branch,但使用 branch^ 作为合并基础。

使用选项标志而不是位置参数的原因是允许传递给 merge-tree 的额外提交在将来通过章鱼合并处理。

注意:目前不支持指定多个碱基

和:

merge-tree.c:允许在传递 --stdin 时指定合并基础

签字人:Kyle Zhao
签字人:Taylor Blau

之前的提交添加了一个 --merge-base 选项,以便允许使用指定的合并基础进行合并。
扩展 --stdin 接受的输入,也允许指定的合并基础与请求的每个合并。
例如:

printf "<b3> -- <b1> <b2>" | git merge-tree --stdin

合并 b1b2,并使用 b3 作为合并基础。

git merge-tree 现在包含在它的man page 中:

输入格式

'git merge-tree --stdin' 输入格式完全基于文本。每行 有这种格式:

[<base-commit> -- ]<branch1> <branch2>

如果一行之间用--隔开,则分隔符前的字符串为 用于指定合并的合并基础和之后的字符串 分隔符描述要合并的分支。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 2021-09-08
    • 2012-01-24
    • 2011-09-13
    • 2012-01-28
    • 2023-03-16
    相关资源
    最近更新 更多