非交互式的 Git 命令在每种情况下都可以实现从 Before 到 After 的变化。
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
非交互式的 Git 命令在每种情况下都可以实现从 Before 到 After 的变化。
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
这些都看起来像是对git rebase --onto
命令的应用。
操作前:
A---B---C---D
之后:
C'---D'
/
A---B
建立分支来标记特定的提交,然后再进行变基操作。
git checkout -b ex1a-b B
git checkout -b ex1a-d D
git checkout -b ex1a-a A
git rebase --onto ex1a-a ex1a-b ex1a-d
更改前:
C---D
/
A---B
之后:
C
/
A---B---D'
创建分支的方法与上面类似:git rebase --onto ex1b-b ex1b-c ex1b-d
。
之前:
C
/
A---B---D
之后:
C---B'---D'
/
A
再次涉及到分支,但现在只需执行 git rebase ex1c-c ex1c-d
命令。
B'
、C'
和 D'
的定义。git diff B C
== git diff A C'
,那么您需要使用 git rebase
进行“变基”(而不是“改变父分支”),具体请参见 Emil 的说明。git reparent
。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