在git book,"子树合并"中,它说:
您也可以执行相反的操作 - 在主分支的
rack
子目录中进行更改,然后将它们合并到您的rack_branch
分支中,以便将它们提交给维护者或将其推送到上游。
这正是我想要做的。在简单的示例中它可以工作(另请参阅我对this question的回答),因此,如果我在rack
master
上进行更改并提交它们,我可以执行类似
git checkout rack_branch
git merge --squash -s recursive -Xsubtree master
并提交到rack_branch
。但是在我的项目中,目录结构更加复杂,它不起作用。 Git没有找到正确的目录结构,并使用超级文件夹的整个结构填充分支rack
(这是一个子目录)。
在我不起眼的新观点中,答案是使用-Xsubtree=PATH
,因为那时(正如git-merge doc中所述):
...相反,指定的路径是前缀(或从头开始剥离),以使两棵树的形状匹配。
但是如何在此具体示例中指定正确的路径?它在目录树上升级,即
git merge --squash -s recursive -Xsubtree=.. master
这不起作用。我应该补充说-Xsubtree=rack
(或者我的项目的等价物)也不起作用(即" strip"以及" prepend"策略都不起作用。感谢你你的帮助!
编辑:我偶然发现了this blog post,添加--no-ff
选项似乎有效。也许有人可以解释为什么这是必要的?这有必要吗?提前致谢。
EDIT2:我是否正确理解--no-ff
选项附加所有来自主分支的提交,即使那些与该子目录无关的提交?这不会是好事。有解决方法吗?
EDIT3:this可能重复。我现在意识到已经在几个小时前读过,但没有找到--no-ff
标志。如果这个问题如此常见,那么--no-ff
标志应该是-s recursive -Xsubtree=PATH
的默认行为,特别是如果明确提供了PATH。