23

我曾经git-svn创建一个 SVN 存储库的 git 镜像。SVN 内部的结构有点不标准,所以 git 创建了一个与该分支没有共同提交的master分支。

      A---B---C topic

D---E---F---G master

我知道提交A是基于提交的E,我非常肯定我已经解决了导致 git 无法识别该事实的问题(使用filter-branch)。我想要做的是重新附加topicmaster分支,设置E为父级A

      A---B---C topic
     /
D---E---F---G master

git-rebase似乎对我不起作用,因为提交的差异A列出了已存在的大量文件的创建master,从而导致大量冲突。
根据我对 git 的理解,设置E为父级A应该足以解决所有问题。
这可能吗?如果是,我该怎么做?

4

3 回答 3

29

看看移植物(移植文件可以在 中找到.git/info/grafts)。格式非常简单:

<commit sha1> <parent1 sha1> <parent2 sha1> … <parentN sha1>

这使 git 相信提交的父级与实际的父级不同。使用 filter-branch 使移植物永久化(因此可以删除移植物文件):

git filter-branch --tag-name-filter cat -- --all

请注意,这会重写存储库的历史记录,因此不应在共享存储库上使用!


例如,如果您只想重写被移植到主分支上的提交的历史记录,请使用以下命令:

git filter-branch --tag-name-filter cat -- master..
于 2010-11-12T12:46:48.650 回答
8

根据您的图表(尽管我担心您所说的“我非常肯定我已经解决了导致 git 无法识别该事实的问题(使用filter-branch)。”),您应该能够执行类似的操作以下。

# checkout A
git checkout A

# Reset the branch pointer to E so that E is the parent of the next commit
# --soft ensures that the index stays the same
git reset --soft E

# Remake the commit with the E as the parent, re-using the old commit metadata
git commit -C HEAD@{1}

# Rebase the topic branch onto the modified A commit (current HEAD)
git rebase --onto HEAD A topic
于 2010-11-12T12:58:20.060 回答
7

你只需要这样:

git rebase --root --onto master^^ topic^^ topic

root 选项允许您包含 A。

更新:

--preserve-merges如果要保留正在变基的部分的分支和合并,请添加该选项。

于 2010-11-24T06:50:20.880 回答