我有现在的情况
A ----- D
\
B - C (master)
现在我想在不合并D
的情况下插入提交,例如不更改未来提交的内容和.B
C
基本上重写B
提交的父母(因此上游的所有其他提交)。
最后我希望没有手动交互:
A - D - B - C
我有现在的情况
A ----- D
\
B - C (master)
现在我想在不合并D
的情况下插入提交,例如不更改未来提交的内容和.B
C
基本上重写B
提交的父母(因此上游的所有其他提交)。
最后我希望没有手动交互:
A - D - B - C
我想出了在不改变其内容(当然除了提交 SHA 之外)的情况下向历史引入新提交的正确方法是使用中间 git 移植。
在以下示例中,我假设之前没有移植:
# use a graft to temporarily change the parent of B to be D
echo "$SHA_B $SHA_D" > .git/info/grafts
# apply the grafts, changing the SHAs of the commits B...C
git filter-branch
# remove old pending commits
git gc
# remove the no longer needed grafts
rm .git/info/grafts
这使所有提交内容(文件和文件夹)保持不变。
批处理模式将对您当前分支历史记录中的内容执行。在这种情况下,您正在查看 D 的历史或您的主人的历史。在这里做的最简单的事情是:
git rebase D
(假设您已经主检出)为什么需要在批处理模式下完成?
您要查找的操作rebase
处于交互模式。
git checkout C
git cherry-pick D # Now: A - B - C -D
git rebase -i A
<reorder commits>
git log
该--interactive / -i
选项将在您的编辑器中打开历史记录,让您可以随心所欲地混乱。您甚至可以将多个提交压缩在一起或完全消除一些。
如果你想完全平凡,你也可以这样做:
git checkout A
git cherry-pick D B C