如何在Git中重新父母

Jam*_*ber 15 git

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

1A.重新养育我

之前:

A---B---C---D
Run Code Online (Sandbox Code Playgroud)

后:

  C'---D'
 /
A---B
Run Code Online (Sandbox Code Playgroud)

1B.重新育儿II

之前:

  C---D
 /
A---B
Run Code Online (Sandbox Code Playgroud)

后:

  C
 /
A---B---D'
Run Code Online (Sandbox Code Playgroud)

1C.重新养育子女III

之前:

  C
 /
A---B---D
Run Code Online (Sandbox Code Playgroud)

后:

  C---B'---D'
 /
A
Run Code Online (Sandbox Code Playgroud)

Emi*_*Sit 16

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

1A.重新养育我

之前:

A---B---C---D
Run Code Online (Sandbox Code Playgroud)

后:

  C'---D'
 /
A---B
Run Code Online (Sandbox Code Playgroud)

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

  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

1B.重新育儿II

之前:

  C---D
 /
A---B
Run Code Online (Sandbox Code Playgroud)

后:

  C
 /
A---B---D'
Run Code Online (Sandbox Code Playgroud)

创建类似于上面的分支:git rebase --onto ex1b-b ex1b-c ex1b-d.

1C.重新养育子女III

之前:

  C
 /
A---B---D
Run Code Online (Sandbox Code Playgroud)

后:

  C---B'---D'
 /
A
Run Code Online (Sandbox Code Playgroud)

再次与分支机构,但现在只是git rebase ex1c-c ex1c-d.


Mar*_*ato 6

这取决于你的定义B',C'D'.

如果你想移动补丁,那么(在第一个例子中)git diff B C== git diff A C',那么你想要使用Emilgit rebase所描述的"rebase"(而不是"reparent").

另一方面,如果你想要移动快照,那么你真的想要"重新表达".为此,我建议使用git reparent.

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

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

1A.重新养育我

git rebase -i B
# Select the "edit" command for C
git reparent -p A
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

1B.重新育儿II

git reparent -p B
Run Code Online (Sandbox Code Playgroud)

1C.重新养育子女III

git rebase -i A
# Select the "edit" command for B
git reparent -p C
git rebase --continue
Run Code Online (Sandbox Code Playgroud)