1

我有现在的情况

A ----- D
 \
  B - C (master)

现在我想在不合并D的情况下插入提交,例如不更改未来提交的内容和.BC

基本上重写B提交的父母(因此上游的所有其他提交)。

最后我希望没有手动交互:

A - D - B - C
4

3 回答 3

1

我想出了在不改变其内容(当然除了提交 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

这使所有提交内容(文件和文件夹)保持不变。

于 2013-04-27T18:20:26.380 回答
1

批处理模式将对您当前分支历史记录中的内容执行。在这种情况下,您正在查看 D 的历史或您的主人的历史。在这里做的最简单的事情是:

git rebase D

(假设您已经主检出)为什么需要在批处理模式下完成?

于 2012-06-27T00:13:09.497 回答
1

您要查找的操作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
于 2012-06-26T23:55:02.617 回答