如何更改Git子树合并的源?

4
我有一个项目,我使用Git子树合并了一个库。我在库和项目之间推送和拉取了一些小的更改。
后来,创建了一个新的存储库,它是库的最终主页。它包含与我的项目基本相同版本的库代码,可能有一两个小的更改。由于各种原因,它与先前库的直接Git历史记录不共享(它不是先前库的克隆)。
现在我想改变我的项目,使其从新位置拉取/推送库。第一次发生这种情况时,我还需要解决任何合并冲突,尽管在这种情况下更改是微不足道的,稍后可以重做。
最好的方法是什么?
我尝试删除我的项目中库的副本,然后删除旧的远程和分支。然后我尝试从新位置进行子树添加等操作。这似乎有效,但当我尝试从我的项目推回到库时,我遇到了致命的错误对象错误。
我认为我尝试的方法存在缺陷 - 可能与缺乏共享历史有关 - 但我对正在发生的事情没有足够深入的理解,不知道如何修复它,或者应该解决此问题的“正确”方法是什么。
3个回答

1

尝试克隆新项目。然后将您的项目添加为远程,执行

git remote update

这将拉取您的项目中的所有引用。现在执行

git cherry-pick <sha1>

选择您想要在新项目中使用的SHA。我认为这是最简单的方法。

此外,您应该知道,Git不需要共同的历史记录(虽然第一次合并可能不太好),以进行合并。因此,您可以按照我的建议操作,然后不是挑选,而是合并您的历史记录。它可能会有冲突。如果您开始合并(如果您这样做),我建议使用git mergetool并了解如何使用三方差异。


谢谢您的回答,但我认为我的问题有点含糊(抱歉)。当我说“它包含基本上与我的项目相同的代码,可能只有一两个小改变。”时,更清楚的说法应该是“它包含基本上与我的项目相同的库代码,可能只有一两个小改变。”换句话说,我正在将一个库引入到我的项目中,这个库只是移到了一个新位置。新版本并不包括所有我的项目代码,所以我不认为您建议的是我想要的。[我现在修改了问题] - Sam Deane

1

总之,是的 :)当我研究它时,我发现了许多原因,为什么我更喜欢子树而不是子模块。我不能一下子记住所有原因,但我认为这归结于相对容易地推送/拉取更改,并且能够克隆主存储库并确信您已经获得了构建项目所需的所有内容。 - Sam Deane
@Sam:“相对容易地推送/拉取更改,并能够克隆主存储库并确信您已获取了构建项目所需的所有内容”: 这正是子模块的用途。我在我的回答中提供的“子模块的真实本质”链接应该详细介绍了这些组件的所有特点。这适用于基于组件的方法 - VonC

1

也许你应该建立一个单独的工作分支(或存储库),包含你修改过的图书馆树,然后将其推送回原始图书馆存储库。

因此,为了推送到原始远程存储库,请先在本地准备好你期望在远程提交中出现的内容;可以采用不同的工作流来实现这一点:要么在项目工作期间,首先将图书馆更改提交到专门的本地工作分支中,该分支专门用于图书馆(该分支应继承图书馆的原始历史记录),然后将此分支与图书馆更改合并到项目工作分支中(其中图书馆是子树),要么将更改从项目工作分支合并回专用的库工作分支。然后,当你愿意时,就可以将你的专用库工作分支推送到原始远程存储库。

因此,你首先需要创建一个本地专用工作分支,以继承原始历史记录:

git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO

(REMOTE_BRANCH_LIBFOO是您本地存储的感兴趣的远程分支,通过git fetch更新)

然后,根据您的工作流程,请确保您对库所做的更改在工作分支MY_LIBFOO中,然后您可以进行操作。

git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY

这样,就清楚地知道正在发生什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接