我有一个项目,我使用Git子树在库中合并。我在图书馆和项目之间进行了一些小改动。
稍后,创建了一个新的存储库,它是库的权威主页。它包含与我的项目基本相同的库代码版本,可能有一两个小的更改。由于各种原因,它与库的前一个主页没有任何直接的Git历史记录(它不是以前库的克隆版)。
我现在要做的是更改我的项目,以便从新位置拉出/推送库。第一次发生这种情况时,我还需要解决任何合并冲突,尽管在这种情况下,更改很简单,可以稍后重做。
这样做的最佳方式是什么?
我尝试删除在我的项目中删除该库的副本,然后将其与旧的遥控器和分支一起删除。然后我尝试从新位置进行子树添加等。这似乎有效,但当我尝试从我的项目推回到库时,我遇到致命的坏对象错误。
我认为我尝试过的方法存在一个缺陷 - 可能与缺乏共享历史有关 - 但我对已经知道如何解决它的问题的理解还不够深入,或者应该对这个问题采取什么样的“正确”方法。
[更新:编辑问题使其更加清晰 - 有点含糊不清]
答案 0 :(得分:1)
尝试克隆新项目。然后将你的作为遥控器加入
git remote update
这将从您的项目中提取所有参考。现在做
git cherry-pick <sha1>
你想要在新项目中使用的sha。这是我认为最简单的方法。
此外,您应该知道git不需要共同的历史记录(尽管第一次合并时不太好)。所以你可以做我说的话,然后你可以合并你的历史,而不是采摘樱桃。它可能会有冲突。我建议一旦你开始合并(如果你这样做),使用git mergetool
并知道如何使用3向差异。
答案 1 :(得分:1)
您是否有任何理由不将您的库作为项目的子模块引用?
(见true nature of submodules)
您案例的优势在于to change a submodule address是多么容易。
答案 2 :(得分:1)
也许,您应该使用您的库版本(仅包含您的更改的库树)设置一个单独的工作分支(或存储库),然后您可以将其推回到原始库存储库。
因此,为了推送到原始远程仓库,首先在本地准备您希望远程显示为提交的内容;可以有不同的工作流来实现这一点:或者,在项目工作期间,首先将库更改提交到专用于库的特殊本地工作分支(该分支应继承库的原始历史记录),然后合并这个带有库的分支将更改为您的项目工作分支(其中库是子树),或者将您的更改从项目工作分支合并到专用库工作分支中。然后,您可以根据需要将专用库工作分支推送到原始远程仓库。
因此,基本上,首先创建一个本地专用工作分支,以便它继承原始历史记录:
git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO
(REMOTE_BRANCH_LIBFOO是您感兴趣的本地漫游远程分支,由git fetch更新)
然后,按照您的工作流程,确保您对库的更改位于工作分支MY_LIBFOO中,然后您可以
git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY
通过这种方式,可以清楚地了解发生了什么。