假设我从这样的历史开始:
A---B---C
\
\-D---E
然后,我合并了这两个分支,在此过程中解决了一些冲突:
A---B---C---F
\ /
\-D---E-/
但是之后,我想重写历史,使它看起来像这样:
A---B---C---EF
\ /
\-D-----/
换句话说,我想将分支提交
E
中的更改移动到合并提交 F
中。就像我在手动解决从将 D
合并到 C
时的冲突时所做的更改一样。(我的实际原因是,
E
只是一个合并准备提交,使预期的冲突更容易解决。它本身没有多大价值,我不希望它污染历史记录。我不想将 E 混入其前任中,因为它的更改在逻辑上是独立的。)我尝试过:
git rebase -i --rebase-merges HEAD~10
但是那给了我:
...
pick 1069500 ...
merge -C 44c0a69 ...
# s, squash <commit> = use commit, but meld into previous commit
# ...
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
所以看起来一个提交可以是合并提交,或者git rebase -i可以将其压缩到其前任中,但不能同时进行。无论如何,git rebase会使我重新应用手动冲突解决方法,这有点烦人。还有其他方法吗?
F^{tree}
或者HEAD^{tree}
仅指快照(仅文件),而F
指整个提交(文件、信息、作者等),因此我们应该在git commit-tree
命令后有${newcommit}^{tree} == F^{tree}
。这样是正确的吗?您是一个非常好的解释者,谢谢您。 - leogama^{<type>}
后缀告诉修订解析代码,在定位插入符号之前的任何内容的哈希 ID 后,它应该尽力找到适合给定类型的哈希 ID。有些类型不会转换 - 例如,如果^{tree}
左侧的哈希是 blob 哈希,则^{tree}
会产生错误。但是提交始终只有一个树,因此当F
是提交时,F^{tree}
每次都有效。 - torekgit diff
,给定提交哈希指示符,将提交哈希转换为树哈希以进行差异比较。其他(主要是“管道”)Git命令则不会这样做,因此您需要一些语法或代码来获取正确类型的对象。 - torek