Git子树合并,但保持本地更改?

时间:2013-04-03 01:36:52

标签: git

第三方回购中有一个分支,我想添加为我的回购的子目录。我希望能够更改第三方代码,在我的仓库中维护这些更改,并且仍然能够获得对第三方仓库所做的更新。从本质上讲,我正在尝试创建叠加层。

按照指南here进行子树合并(其中描述了我正在尝试完成的内容),我创建了一个指向第三方仓库的远程,创建了一个引用远程分支的本地分支我想,在该分支上完成拉动,并使用read-tree将本地分支的内容复制到master中的子目录中。

我已将此子目录中的更改(新文件和编辑到现有文件)提交并推送到master。还对上游分支中的各种文件进行了更改。我已经能够将更改下载到我的分支机构。但是,当我尝试合并如下时,

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

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

我做错了什么或是预期的行为?如何保留我的更改并仍然合并来自上游的更改?

2 个答案:

答案 0 :(得分:1)

我不相信这是理想的行为,但我自己也只是处理过类似的问题。

在我的情况下,事实证明,当其他开发人员最初将子树添加到主分支时,他一次添加了多个子树。这导致更改生成的提交的SHA。

因此,当我尝试进行子树合并时,git无法找到共同的父级。这得到了git的最终结果,假设我本地树中的所有内容都是为了使代码与原始repo相提并论,并且在合并完成后,本地更改就会丢失。

我通过在子树的前缀目录中执行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

这应该会给您带来与从顶部成功进行子树合并所期望的结果相同的结果。

答案 1 :(得分:-1)

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

您可以使用git stash临时存储这些未经注释的更改,以便您可以进行合并,并git stash pop再次应用它们并移除存储。