如何在Git中进行重新父级操作

19

非交互式的 Git 命令在每种情况下都可以实现从 BeforeAfter 的变化。

1a. 改变父提交

Before:

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

1
你的问题听起来像是测验题...你确定可以在网络上随意提问吗? - Paŭlo Ebermann
11
保罗,哪个班级会知道什么是版本控制,更不用说在测试中放git图示节点的样例了。 - ironfroggy
1
“Quiz” 不一定要是一个类...我不知道,但问题的上下文太少了,以至于听起来像这样。 - Paŭlo Ebermann
5
在这种情况下为什么需要上下文?我故意把问题分解成我试图完成的非常具体的操作。 - James Tauber
2个回答

20

这些都看起来像是对git rebase --onto命令的应用。

1a. 重置父分支(Reparenting I)

操作前:

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

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 命令。


7
这取决于您对 B'C'D' 的定义。
如果您想要移动 补丁(在第一个示例中),使得 git diff B C == git diff A C',那么您需要使用 git rebase 进行“变基”(而不是“改变父分支”),具体请参见 Emil 的说明。
另一方面,如果您想要移动 快照,那么您确实需要“改变父分支”。为此,我建议使用 git reparent
最有可能的情况是,您实际上需要进行变基而不是改变父分支,但是为了参考,这里提供了改变父分支的命令。它们有些复杂,因为这不是正常操作。
(以下假定您当前在 D 分支。) 1a. 改变父分支 I
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接