我如何 git rebase 合并两个提交,一个更远,一个最近
How can I git rebase to merge two commits, one is farther and one is recent
我想合并两个提交。一个是更早的,另一个是我 git 历史中最近的一个。这是我在一个分支中的最后 12 次提交(不是在 master 中)。
$ git log -12 --pretty=oneline
47c724a6fdbb6a0b6d51cd42d0bde92c23a0d32e L
9446932bc6e13d0437ab6b3f03161e3c2bca0f62 K Follow up of A
842e6a97284a02a70122d50f2f647a51b0e5cce7 J
77a0e99a62d9f77044cc37cbe22870b11c83f046 I
a125f0f701732a2dbd0cfe85c65583c46d1c67fa H
544b241dfe56e3b548af04c4d7c6e2092f3e108d G
7e5a649681a97f23c11716e8c87dfb1cc7d6125d F
d5378ec4216dce45dc0fc4a4ea1c0e4dac41a329 E
8d0420fd97178908db966a03d58252d5fb2b1c82 D
0e4425a86ce522a1a25886587c57379c1b4522ff C
5cba291aba6bb10749e1f1d4e0970d7e42decc17 B
2ba31cd61724f14f84a1a0a3e26e788374c62f9d A
A之前的commit比较多,不过我觉得跑题了,就不一一列举了。
我想合并A和K。如果可能的话,我想合并后删除A或K或两者。我在这里发现了一些关于 git rebase --interactive
的问题。我尝试了 git rebase -i HEAD~12
并被带入了 VIM。然后,我卡住了,无法继续。
- 我在 K 上试过
edit
,但似乎只编辑了提交消息。
- 我在 A 和 K 上尝试了
squash
,但我得到了 Cannot 'squash' without a previous commit
。似乎只压缩了两个后续提交。
你能告诉我在这里应该做什么吗?我有空push -f
到远程分支
使用 rebase -i HEAD~12
,您将按照 A(顶部)到 L(底部)的顺序获得提交。只需重新排序它们,以便 K 在 A 之后,而不是 pick 选择 fixup 并保存缓冲区并退出 vi.
pick 2ba31cd61724f14f84a1a0a3e26e788374c62f9d A
fixup 9446932bc6e13d0437ab6b3f03161e3c2bca0f62 K Follow up of A
pick 5cba291aba6bb10749e1f1d4e0970d7e42decc17 B
pick 0e4425a86ce522a1a25886587c57379c1b4522ff C
pick 8d0420fd97178908db966a03d58252d5fb2b1c82 D
pick d5378ec4216dce45dc0fc4a4ea1c0e4dac41a329 E
pick 7e5a649681a97f23c11716e8c87dfb1cc7d6125d F
pick 544b241dfe56e3b548af04c4d7c6e2092f3e108d G
pick a125f0f701732a2dbd0cfe85c65583c46d1c67fa H
pick 77a0e99a62d9f77044cc37cbe22870b11c83f046 I
pick 842e6a97284a02a70122d50f2f647a51b0e5cce7 J
pick 47c724a6fdbb6a0b6d51cd42d0bde92c23a0d32e L
我想合并两个提交。一个是更早的,另一个是我 git 历史中最近的一个。这是我在一个分支中的最后 12 次提交(不是在 master 中)。
$ git log -12 --pretty=oneline
47c724a6fdbb6a0b6d51cd42d0bde92c23a0d32e L
9446932bc6e13d0437ab6b3f03161e3c2bca0f62 K Follow up of A
842e6a97284a02a70122d50f2f647a51b0e5cce7 J
77a0e99a62d9f77044cc37cbe22870b11c83f046 I
a125f0f701732a2dbd0cfe85c65583c46d1c67fa H
544b241dfe56e3b548af04c4d7c6e2092f3e108d G
7e5a649681a97f23c11716e8c87dfb1cc7d6125d F
d5378ec4216dce45dc0fc4a4ea1c0e4dac41a329 E
8d0420fd97178908db966a03d58252d5fb2b1c82 D
0e4425a86ce522a1a25886587c57379c1b4522ff C
5cba291aba6bb10749e1f1d4e0970d7e42decc17 B
2ba31cd61724f14f84a1a0a3e26e788374c62f9d A
A之前的commit比较多,不过我觉得跑题了,就不一一列举了。
我想合并A和K。如果可能的话,我想合并后删除A或K或两者。我在这里发现了一些关于 git rebase --interactive
的问题。我尝试了 git rebase -i HEAD~12
并被带入了 VIM。然后,我卡住了,无法继续。
- 我在 K 上试过
edit
,但似乎只编辑了提交消息。 - 我在 A 和 K 上尝试了
squash
,但我得到了Cannot 'squash' without a previous commit
。似乎只压缩了两个后续提交。
你能告诉我在这里应该做什么吗?我有空push -f
到远程分支
使用 rebase -i HEAD~12
,您将按照 A(顶部)到 L(底部)的顺序获得提交。只需重新排序它们,以便 K 在 A 之后,而不是 pick 选择 fixup 并保存缓冲区并退出 vi.
pick 2ba31cd61724f14f84a1a0a3e26e788374c62f9d A
fixup 9446932bc6e13d0437ab6b3f03161e3c2bca0f62 K Follow up of A
pick 5cba291aba6bb10749e1f1d4e0970d7e42decc17 B
pick 0e4425a86ce522a1a25886587c57379c1b4522ff C
pick 8d0420fd97178908db966a03d58252d5fb2b1c82 D
pick d5378ec4216dce45dc0fc4a4ea1c0e4dac41a329 E
pick 7e5a649681a97f23c11716e8c87dfb1cc7d6125d F
pick 544b241dfe56e3b548af04c4d7c6e2092f3e108d G
pick a125f0f701732a2dbd0cfe85c65583c46d1c67fa H
pick 77a0e99a62d9f77044cc37cbe22870b11c83f046 I
pick 842e6a97284a02a70122d50f2f647a51b0e5cce7 J
pick 47c724a6fdbb6a0b6d51cd42d0bde92c23a0d32e L