将两个合并提交压缩为单个合并提交?

Pac*_*uin 3 git merge

我有以下场景:

* a278b6b (HEAD -> feature1) Change i to j
| * c9550d0 (feature3) Print only odds
|/
| * befb5e9 (feature2) 2*z in baz loop
|/
* aa36658 Print only evens
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是将feature1feature2、 和feature3分支合并到一个新分支中,以便这个新提交包含来自 3 个分支的所有信息。通常,您只需进行章鱼合并即可得到我正在寻找的内容,但在这种情况下,三个分支之间存在需要手动解决的合并冲突。因此,在一次合并一个分支以解决所有合并冲突后,我剩下:

*   6679d6c (HEAD -> DI) merge feature3
|\
| * c9550d0 (feature3) Print only odds
* |   5b03abb merge feature2
|\ \
| * | befb5e9 (feature2) 2*z in baz loop
| |/
* / a278b6b (feature1) Change i to j
|/
* aa36658 Print only evens
Run Code Online (Sandbox Code Playgroud)

其中是所有三个分支将合并到的DI分支。feature

问题是现在我这里有两个合并提交:5b03abb6679d6c。我希望只有一个合并提交(用于清洁和维护),但合并冲突意味着我不能直接进行章鱼合并。有没有办法以某种方式将两个合并提交压缩到同一个提交中,就像对标准提交所做的那样,或者我应该使用其他一些合并策略,以便获得具有 3 个父项的单个合并提交?

eft*_*ft0 6

使用原始分支作为父级以及您拥有的最终树(文件、内容)来凭空创建提交......

git commit-tree -p a278b6b -p c9550d0 -p befb5e9 -m "some merge" 6679d6c^{tree}
Run Code Online (Sandbox Code Playgroud)

这将打印一个提交 ID。在那里设置你想要的分支,比如 main:

git branch -f main the-id-from-previous-command
Run Code Online (Sandbox Code Playgroud)

  • @Pacopenguin:此语法记录在 gitrevisions(5) 中,该版本位于 https://git-scm.com/docs/gitrevisions 上 (5认同)
  • @Pacopenguin [更具体的链接](https://git-scm.com/docs/gitrevisions#Documentation/gitrevisions.txt-emltrevgtlttypegtemegemv0998commitem) (5认同)