抽象的
我对问题的研究越多,我对问题的总结就越清晰:如何使用 git 基础架构在 DAG 中获取一个顶点的父节点,它实际上是我的应用程序域中的一棵树?
阅读愉快。欢迎任何想法(特定于 git)。
问题
我有一个存储库,其历史是由我通过半自动命令编写的脚本构建的:
因此,我可以根据需要自动将任何类型的信息放入历史记录中,例如在执行命令时以黄色标记的那些标签。
所有这一切的一个关键要求是,当发生合并冲突时(它们必须发生,因为脚本的目的是让用户意识到合并冲突,并与其他用户联系以找到解决方案问题 -如果发生合并冲突就会出现问题,我希望脚本能够激发用户之间的交流)。
现在,考虑到这一点,假设我想恢复一个合并提交。这对于非冲突合并非常有用,就像install-def
在这张图片中一样。我只需要使用git revert -m 1 install-def
(例如)。
当我需要 revert 时,该过程变得更加复杂install-abc
,因为我想准确地恢复那些提交install-abc
(合并提交)并且它是来自remotes/hacklet/abc/master
.
换句话说,要获得只有profile/myfirstprofile
和的线性历史remotes/hacklet/def/master
。
假设我可以用任何标签注释几乎任何提交,在半自动化脚本中实现这一目标的最简单和最安全的方法是什么?最好不必做任何与DAG相关的事情(或就此而言,递归),因为脚本是用 bash 编写的。
“还原”执行“卸载”。git revert -m 1 ...
适用于在 的情况下恢复提交install-def
,但install-abc
它给出:
error: could not revert 18cff49... using hacklet/abc/master in profile
myfirstprofile hint: after resolving the conflicts, mark the corrected
paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and
commit the result with 'git commit'
注意:profile
分支可以包含许多这样的install-
提交,我只想删除其中一个。“安装”和“配置文件”都不能嵌套。
注意:我知道“模块”和“子树”。请不要提他们,我在这里做的事情是特定于应用程序域的(git是应用程序的一部分),这不是关于在开发周期中使用git。我已经彻底分析了这两个功能,它们根本不适合我脚本的应用程序域。
附录 1
我已经破解了这些信息,这让我觉得更容易:
如果您认为这变得过于复杂,那不是,它一遍又一遍地基本上是相同的模式:
start-profile
在这里,只有install-abc
和install-foo
没有冲突。但是树的结构看起来确实“相同”。
最后一个,有所有的冲突(除了第一个,install-abc
),因为我喜欢 gitk 的多彩输出:
还有一个,但完全没有冲突:
注意:可能存在未在profile/myfirstprofile
分支中标记的单个提交。在这种情况下,应该保留这些提交。真的没有其他东西应该“卸载”,但提交属于install-THING
.
附录 2
虽然我before-install-
发现可以使用git describe --tags $(git rev-list -1 install-abc)
. 然而:
给定标签install-def
,如何在最后一张图片中找到子before-install-ghi
提交?
考虑到最后一个注释(中间未标记的提交),如何找到这些“子和父”提交适合粘在一起,而不需要install-THING
我想要“卸载”?
PS:我很明白有向无环图中directed这个词是什么意思,但是一定有一些特定于git的方式,使用git的基础设施和概念,我闻到了。
注意:我想避免每次我想“卸载”某些东西时都必须迭代树。