为git存储库上的第一次提交设置父级

为git存储库上的第一次提交设置父级,git,branch,git-branch,reparenting,Git,Branch,Git Branch,Reparenting,我们在已设置的git存储库中跟踪供应商的软件产品上游版本发布。我们在克隆的git存储库中对此产品进行更改。当发布新版本时,我们git将更改合并到我们的自定义存储库中,并修复它们的更改与我们的更改之间的任何合并冲突 供应商提供本地语言和全球语言版本。我们只跟踪本地语言,但现在在10个合并版本之后,我们意识到我们需要跟踪全球语言,以便我们能够从与此软件集成的其他供应商那里引入更改 提交历史记录如下所示。每个\都是两个存储库之间的合并 local A - B - C - D \

我们在已设置的git存储库中跟踪供应商的软件产品上游版本发布。我们在克隆的git存储库中对此产品进行更改。当发布新版本时,我们
git将更改合并到我们的自定义存储库中,并修复它们的更改与我们的更改之间的任何合并冲突

供应商提供本地语言和全球语言版本。我们只跟踪本地语言,但现在在10个合并版本之后,我们意识到我们需要跟踪全球语言,以便我们能够从与此软件集成的其他供应商那里引入更改

提交历史记录如下所示。每个
\
都是两个存储库之间的合并

local A - B - C - D
        \       \
   custom E - F - G
我们需要它看起来像

global X - Y - Z
        \
local    A - B - C - D
          \       \
custom     E - F - G

答案是这个还是别的?我已经看过了,但我仍然不清楚这样做是否正确。

你不能真的这样做。更改提交的父对象将产生一个全新的提交对象,该对象具有自己的唯一哈希(标识符)。这意味着间接将其作为父级的所有提交也需要更改。这个提交将是整个存储库中的第一个提交,您将在存储库中重新创建所有提交

这是一种简单的方法,可以让所有参与的人都中断工作,通常不鼓励这样做,就像重新调整已发布提交的时间一样

如果要集成原始历史记录,可以在单独的独立分支上导入提交X-Z,然后在提交后
D
将它们合并到本地分支中。这样,您可能会得到如下结果:

global X - Y - Z -------
                        \
local    A - B - C - D - H
          \       \       \
custom     E - F - G ----- I

当然,这不会修复以前的提交,但也不会使它们无效。您仍然可以将原始历史记录保存为X-Z,并在H和更高版本中保留与新代码的关系。

我不理解您的历史记录示例。“部分”是什么意思?“本地”、“全球”和“自定义”是分支?他们的关系如何?(看起来它们是完全分开的。)请修正您的问题,使实际情况更加明显。是否有一种替代方案是从本地合并到全球?这将使本地成为主分支。这在语义上不是很好,但看起来仍然可以。当然,你可以这样做,但你应该知道分支名称没有任何意义。它们只是图形中提交的命名指针。如果名称困扰您,您可以使用
git branch-m
轻松重命名分支;如果您愿意,您完全可以在没有主分支的情况下工作。抱歉,这不清楚,我的意思是它将使本地分支成为根分支(包含所有未来更改的父提交)。是的,当然,如果这对您更有意义,您当然也可以这样做。任何更适合您工作流程的选项:)