如何在Git中重新父母

时间:2011-02-12 22:32:04

标签: git

在每种情况下,哪些非交互式git命令实现了从Before到After的更改?

1a上。重新养育我

在:

A---B---C---D

后:

  C'---D'
 /
A---B

1b中。重新育儿II

在:

  C---D
 /
A---B

后:

  C
 /
A---B---D'

1c上。重新育儿III

在:

  C
 /
A---B---D

后:

  C---B'---D'
 /
A

2 个答案:

答案 0 :(得分:15)

这些看起来都像git rebase --onto的应用程序。

1a上。重新养育我

在:

A---B---C---D

后:

  C'---D'
 /
A---B

设置分支以标记特定提交,然后重新绑定到。

  1. git checkout -b ex1a-b B
  2. git checkout -b ex1a-d D
  3. git checkout -b ex1a-a A
  4. git rebase --onto ex1a-a ex1a-b ex1a-d
  5. 1b中。重新育儿II

    在:

      C---D
     /
    A---B
    

    后:

      C
     /
    A---B---D'
    

    创建与上述类似的分支:git rebase --onto ex1b-b ex1b-c ex1b-d

    1c上。重新育儿III

    在:

      C
     /
    A---B---D
    

    后:

      C---B'---D'
     /
    A
    

    再次使用分支,但现在只是git rebase ex1c-c ex1c-d

答案 1 :(得分:6)

这取决于您对B'C'D'的定义。

如果您想移动补丁,那么(在第一个示例中)git diff B C == git diff A C',那么您想“重新定位”(不是“重新表达” “)使用Emil所述的git rebase

另一方面,如果您想要移动快照,那么您确实想要“重新显示”。为此,我建议使用git reparent

最有可能的是,你实际上想要重新定义而不是重新定义,但作为参考,这里是重新定义的命令。它们有点复杂,因为这不是正常的事情。

(以下假设您目前在D的分支机构。)

<强> 1a上。重新养育我

git rebase -i B
# Select the "edit" command for C
git reparent -p A
git rebase --continue

<强> 1b中。重新育儿II

git reparent -p B

<强> 1c上。重新育儿III

git rebase -i A
# Select the "edit" command for B
git reparent -p C
git rebase --continue