2010-11-12 27 views
22

我用git-svn来创建一个SVN仓库的git镜像。 SVN内部的结构有点不合标准,所以git创建了一个分支,它没有与master分支共同提交。git - 设置承诺的父母没有rebase

 A---B---C topic 

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

我知道犯A基于关闭提交E我敢肯定,我已经解决造成混帐不承认(使用filter-branch)这一事实的问题。我想要做的是重新连接topicmaster分支,设置EA父:

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

git-rebase似乎不适合我,因为参与比较提交A列表创建的存在于master中的大量文件,导致大量冲突。
从我对git的理解来看,只需设置E作为A的父项应该足以解决所有问题。
这可能吗?如果是这样,我该怎么做?

+0

有没有机会重新启动svn的git镜像,将“branches”指向正确的目录?或者先修复svn结构? – stefanw 2010-11-12 12:30:03

+0

实际上,回购确实使用标准干线/标签/分支布局。然而,我试图修复的分支是通过仅复制trunk的子路径而创建的 - 猜测对于git-svn来说,这太过分了。 – 2010-11-25 16:05:14

+0

rebase有一个'root'选项。如果需要,可以使用'to'和'preserve-merges'。 – 2012-10-23 18:26:35

回答

28

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

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

这使得混帐认为,提交有不同的父母比它实际上有。使用过滤器分支,使移植永久(使移植文件可以删除):

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

注意,这重写历史库的,所以不应该在共享回购使用!


如果你只想要重写被嫁接到主分支,例如提交的历史,使用这个命令:

git filter-branch --tag-name-filter cat -- master.. 
+0

如果您不需要,请勿使用移植或过滤器分支。 – 2010-11-24 07:02:09

+3

移植是非常有用的是你需要它们,但像git中的一些其他功能,他们应该在共享回购之前使用(或者你需要让其他人重新克隆)。正如答案所述,只需创建移植文件(hash-of-A,space,hash-of-E,newline)并使用“git filter-branch --tag-name-filter cat - --all”来重写没有改变其他提交数据的历史 – JodaStephen 2011-06-24 11:47:01

+0

@JodaStephen你应该添加到答案。你知道如果知识库发布的话可以这么做吗,但是你所做的移植只涉及新的未发布的提交? – naught101 2012-06-22 14:44:55

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 [email protected]{1} 

# Rebase the topic branch onto the modified A commit (current HEAD) 
git rebase --onto HEAD A topic 
+0

工作得很好,但话题结束后,没有跟踪远程原点/主题后,该操作! – 2017-03-03 10:55:46

5

所有你需要的是这样的:

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

根选项,您可以包括A.

UPDATE:

,如果你想保留分支添加--preserve-merges选项合并您正在重新绑定的部分。

+1

这个命令对我来说非常合适! – jarvisschultz 2012-10-23 17:59:33

+0

如果你有一个线性历史记录,如果它合并了提交,你必须使用'--preserve-merges',并且你必须手动重新解决合并冲突。 – Flimm 2014-01-07 11:37:57

+0

是的。我会更新答案。另一次,我回答了同样的问题,我包括了这个选项。 – 2014-01-07 20:04:26