Git子树合并删除正在合并的分支中的更改

时间:2013-03-12 02:10:21

标签: git version-control merge repository subtree

我使用Git书中描述的结构设置了两个存储库:http://git-scm.com/book/ch6-7.html。基本上,我想保持一个回购的副本和它的原始分支之间的关系。我知道你可以用子模块做到这一点,但更新它们的过程看起来有点麻烦,我被告知(并阅读)子树更容易使用。无论如何,我设置“RepoA”以在其中有一个“RepoB”子树。我按照发球台链接中提供的步骤进行操作。

我在“RepoA”中对子树进行了重大修改。与此同时,我团队中的其他人正在对“RepoB”的主人进行修改。当我说完所有的时候,我希望我可以从“RepoB”原点/主控和子树中将它们合并到RepoA中的子树中。但是,当我这样做时(使用带-squash和--no-commit的-s子树合并选项),我删除了对RepoA中子树所做的所有更改。即使我添加到子树中的新文件也会被删除!为什么是这样?我是否误解了子树的使用?我合并得不合适吗?任何帮助将不胜感激!

此外,如果无法将这些与子树合并正确合并,那么我是唯一可以选择合并它们手动,手动创建新项目结构吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

假设您已将RepoB设置为遥控器,请尝试以下操作:

git merge -s ours --no-commit RepoB/master

此处提供更多信息:https://help.github.com/articles/working-with-subtree-merge

答案 1 :(得分:0)

' git read-tree'如果存在RepoB子树,则将RepoB子树合并到RepoA中的步骤不起作用。跳过读取树会导致所有文件被本地删除。 (重新开始)

必须从git本地删除RepoB子树。之后,git-read-tree将起作用,合并对于文件和历史记录都是正确的。

从具有来自先前合并的RepoB_subtree的RepoA的克隆开始。

git remote add -f RepoB <RepoB-url>
git merge -s ours  --no-commit RepoB/master
git rm -r RepoB_subtree
git read-tree --prefix=RepoB_subtree/ -u RepoB/master
git commit -m "Subtree merge of RepoB/master."

RepoA历史记录首先显示整个RepoB提交块。之前的子树合并提交显示在RepoA中,没有任何RepoB历史记录。

RepoA中RepoB历史的组织并不像我预期的那样是线性的,但回想起来,RepoA中RepoB子树的历史是完整且易于阅读的。