2013-04-03 34 views
5

第三方回购有一个分支,我想将其添加为我的回购的子目录。我希望能够对第三方代码进行更改,将这些更改保留在我的回购中,并且仍然能够获得对第三方回购的更新。本质上,我试图创建一个覆盖。Git子树合并,但保持本地更改?

按照指导here进行子树合并(它完全描述了我正在尝试完成的工作),我创建了一个指向第三方回购的远程,创建了一个引用我想要的远程分支的本地分支,在该分支上完成了拉取操作,并使用读取树将本地分支的内容复制到master中的子目录中。

我已经犯下并在此子目录推变化(新文件和编辑现有的文件)掌握。上游分支中的各种文件也进行了更改。我已经能够将这些改变下拉到我的分支。但是,当我尝试合并如下时,

git merge --squash -s subtree --no-commit <my_branch> 

我的本地更改被上游的更改覆盖。我创建的新文件将被删除,并且我对现有文件所做的更改会丢失。

我做错了什么或者是预期的行为?我怎样才能保持我的变化,并仍然从上游的变化合并?

+0

我有完全相同的问题,您是否找到解决方案? – gregseth

+0

@gregseth对不起,但没有。幸运的是,我最终不需要解决它。我应该再次尝试一下,并在这里给出更好的答案。如果您找到适合您的解决方案,请让我知道! – Naenyn

回答

-1

作为一般规则,您希望在干净的工作树上执行此类操作。如果需要覆盖未提交的更改,Git会中止。

您可以使用git stash临时存储那些未完成的更改,以便您可以执行合并,并且git stash pop可以再次应用它们并删除存储。

+0

本地更改已被提交并推送。我没有任何东西可以隐藏。更新覆盖了这些更改......基本上,无论本地状态如何,都会用上游替换所有内容。 我想我应该使用不同的措辞。那里的“本地”,我的意思是我的起源/主人而不是上游。 – Naenyn

+0

你正在做' - 我们的' 。这意味着它只能选择历史的一面。你还会期待什么? – Ikke

+0

Woops,我的错误,我粘贴了错误的信息。我实际上在做'-s子树'。我将相应地编辑该问题。在一个侧面说明中,“我们的”将完全忽略上游的变化,这与我所经历的相反。 – Naenyn

1

我不认为这是所需的行为,但我只是通过类似的问题自己工作。

在我的情况下,原来的问题是,当其他开发商最初添加的子树的主分支,他添加了多个子树的一次。这有改变结果提交的SHA的结果。

结果,当我试图做子树合并,GIT中是无法找到一个共同的父。这有git的最终结果,假设我的本地树中的所有东西都是用来代替原始回购的代码,并且在合并完成后本地更改丢失了。

我解决此得到由子树的前缀目录做git log --oneline,以及标识第一提交到本地的回购协议。

然后,

git checkout -b <subtree>_merge <first commit SHA> 
git merge --squash -s subtree --no-commit <subtree_remote/ref> 
git checkout master 
git merge <subtree>_merge 

这应该离开你,你会期望从一个成功的子树看到了相同的结果从顶部合并。

+0

为了清楚起见,' _merge'是新分支的名称,所以无论名称如何。当您最初将子树内容添加到您的回购库时,<第一次提交SHA>是第一次提交,提交SHA可以帮助您记住'git log --oneline'。不过,我担心的是,这个过程并没有将master repo与子树repo“”链接起来。最后,它会将它与新创建的“合并”分支链接起来,这是在<<第一个提交SHA>'处的旧repo与子树子目录与远程同步的奇怪组合,没有本地更改。 – KrisWebDev

相关问题