我想反转 git 过滤分支,并想知道执行此操作的最佳方法。
最初我有一个这样的回购协议:
A
p
q
r
然后我将 q 创建为它自己的存储库,这样我就有了这个:
A
p
r
Q
现在,在多次提交之后,我想反转该操作以将 q 返回到其原始父级 A。如何将 Q 返回到 Aq 并保留所有历史记录?
答案1
我想到了一些方法。我建议在存储库的克隆中尝试这些,以改变您的想法并尝试其他微不足道的事情。 (尽管即使您不小心在唯一的副本中执行了此操作,也git reset
应该可以使用引用日志进行恢复)。
git subtree
, 没有--squash
。这可能会做一些足够接近你想要的事情。该命令(在 A 内)类似于git subtree add -P q git://user@host/path/Q.git master
. A 仍然可以快进。如果你想更多地定制它,你可以使用子树合并(我很确定 git-subtree 在内部使用)。 A 仍然可以快进。
git-filter-branch 基本上可以做任何事情,没有理由它不能合并存储库。例如,您可以将 Q 拉入 A 的一个分支,然后对其进行过滤分支以将其全部移动到 q 子目录下,然后将其合并到 master (使用
--allow-unrelated-histories
)。这将更改 Q 的所有提交 ID,但不会更改 A。或者您可以使用提交等过滤器将提交一起放入历史记录中(这当然会更改很多提交 ID,因此除非非常小心,A会不是可快进)。
PS:虽然关于在 Unix/Linux 系统上运行的程序的问题在这里是可以的,但是关于 git(和其他开发工具)有更多的专业知识堆栈溢出。这取决于你,但我个人会在那里问 git 问题,因为我认为你会得到更快而且很可能更好的答案。