6

第 3 方存储库中有一个分支,我想将其添加为我的存储库的子目录。我希望能够更改该 3rd 方代码,在我的 repo 中维护这些更改,并且仍然能够获得对 3rd 方 repo 所做的更新。本质上,我正在尝试创建一个叠加层。

按照此处的子树合并指南(它准确描述了我要完成的工作),我创建了一个指向该第 3 方存储库的远程,创建了一个引用我想要的远程分支的本地分支,完成了拉动该分支,并使用 read-tree 将本地分支的内容复制到 master 的子目录中。

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

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

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

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

4

2 回答 2

1

我不相信这是理想的行为,但是我自己也解决了类似的问题。

就我而言,问题在于当其他开发人员最初将子树添加到主分支时,他一次添加了多个子树。这导致更改结果提交的 SHA。

结果,当我尝试进行子树合并时,git 无法找到一个共同的父级。这有 git 的最终结果,假设我的本地树中的所有内容都旨在早于原始 repo 中的代码,并且在合并完成后本地更改丢失。

我通过git log --oneline在子树的前缀目录中执行 a 并确定第一个提交到本地 repo 来解决这个问题。

然后,

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

这应该会给您留下与从顶部成功合并子树所期望看到的相同的结果。

于 2013-04-26T20:06:01.253 回答
-1

As a general rule, you want to do such operations on a clean working tree. Git would abort if it would need over overwrite non-committed changes.

You can use git stash to temporarily store those uncomitted changes, so that you can do the merge, and git stash pop to apply them again and remove the stash.

于 2013-04-03T06:04:46.760 回答