2013-06-20 77 views
4

假设提交的结构是类似下面:如何去掉几个旧的提交,但保持所有其他提交在git中保持不变?

    B'---C'   X' 
       / \  /\ 
      A---B---C---D---...---X---Y---Z(master) 

现在我需要剥去所有A和X之间的提交,

      X' 
         /\ 
        A---X---Y---Z 

AFAIK,至少有2路实现这一点:

  • GIT中变基-i甲
  • GIT中分支-f new_branch A; git rebase - 主master X

但是我总是需要手动处理一些冲突。

因为我只是想后清除所有犯了和以前X和我不需要改变任何git的跟踪结果每次提交后(例如,新生成的承诺X共享相同的内容作为旧的X提交),有没有更简单的方法来做到这一点?

+0

'Y'那么你想要什么'X'和'x''是?你会更喜欢'A --- Y --- Z'吗? –

+0

@ hus787对不起,我应该在A和X之间。 –

+0

我假设你想剥离提交,不会被压扁吗? – Ajedi32

回答

0

我想尝试这样的:

git checkout -b new_X X 
git rebase -i A # set everything to 'squash' 
git checkout master 
git rebase --preserve-merges --onto new_X X 

这个希望应保持提交修改一样,所以会有冲突。如果失败了,我可能会使用像git commit-tree这样的低级命令和一些脚本来创建原始树的新结构。

+0

处理'git rebase -i A'时发生冲突。 –

+0

Oh:/然后代替第一个rebase,使用'git cat-file commit X'查找X的树ID,并使用'git commit-tree'直接提交new_X(将A添加为父项)。 – che

+0

你能否写下更多的细节?我之前没有使用过'git commit-tree',并且我担心如果我犯了一个错误,我不能恢复原状:-) –

0

编辑:该解决方案将删除老提交(包括在其中所作的任何更改)从资源库中。这显然不是我们所要求的,但我仍然将答案留给未来的读者。


git checkout master 
git rebase --onto A X~ 

我不能保证不会有冲突,但如果您遇到任何可以手动解决这些问题,git add与冲突的文件,然后键入git rebase --continue

或者,你可能会迫使git rebase通过施加过的一个所做的任何冲突的更改顶部最近的修改(或之前)自动解决任何冲突:

git checkout master 
git branch backup # Just to be safe 
git rebase -s theirs --onto A X~ 
git branch -D backup # When you're sure master has everything you need 
+0

但'git add'会导致包含太多“<<<","===","> >>”的两个修改后的文件,我仍然需要手动合并它们? –

+0

是的,如果发生冲突,你必须手动合并。但我不确定如何避免这种情况。 有没有关于这些提交的内容,让你相信它应该可以做到没有冲突的rebase? – Ajedi32

+0

对不起,我没有得到你最后一句话的含义: - < –

1

注意:该解决方案将压扁你想要“剥离”到X中的提交,以便新的X提交和所有后续提交的文件处于与它们现在完全相同的状态。如果这不是你想要的,请参阅我的other answer


git checkout -b temp A 
git merge X --squash 
git commit -C X # Create new x commit 
git checkout master 
git rebase --preserve-merges --onto temp X # Rebase onto new X commit (should produce no conflicts) 
git -d temp 
如果你想去除所有`A`之间的提交
+0

但是在重新绑定时(我不知道为什么,也许是由于子模块)有冲突。 –

+0

这很奇怪。新的X提交应该与旧提交的内容完全相同,因此不应该有任何冲突。哪些文件出现冲突?你可以运行'git diff temp X'来确保X和temp之间确实没有区别吗? – Ajedi32

+0

哦,用'--preserve-merges'选项试试rebase(参见上面我的编辑)。 – Ajedi32