将已有的提交更改为当前提交

3
简单来说,我是这样做的:
A------B-------C
        \
         \
          B2

现在,我想将B更改为B2。
A------B2-------C

有可能吗?

解决方案历史:

我刚刚添加了我的工作历史。

$ git log
commit b671c70b C
commit f4acdc2b B
commit 56f38939 A

$ git checkout f4acdc2b 

我修改了一些内容... 然后使用 -amend 选项提交了。

$ git commit -amend
$ git log
commit e2fd729 B'
commit 56f3893 A

现在,它变成了这样:
A------B-------C
        \
         \
          B'

将B变基到B'
$ git checkout b671c70b
$ git rebase -i 56f38939

打开交互式编辑器的方法

pick f4acdc2b B
pick 56f38939 A

只需删除行pick f4acdc2b,保存并退出。

如果出现错误error: could not apply b671c70b... C, 编辑所有合并冲突,然后,

$ git add .
$ git rebase --continue

$ git log
commit 914c6bc C'
commit 56f3893 A

$ git checkout 914c6bc
$ git rebase e2fd729 
$ git log
commit 5c65190 C''
commit e2fd729 B'
commit 56f3893 A

现在,它看起来像这样。
A------B'-------C''

你需要通过变基来更改B2和C的SHAs。 - Andrew C
2个回答

3
为了完全删除 B,您必须在 A 上重新集成 B2,并在 B2 上集成 C
git checkout C
git rebase B2

这将在B2的基础上,将分支C进行变基。

A-------B------B2-------C'

(请注意,C'是一个新提交)
但现在历史记录中仍然有B提交。您可以使用交互式变基来删除它。
git rebase -i A

打开交互式编辑器的方法

pick 05c98ef B
pick e31d9f0 B2
pick 5d30d05 C

只需删除行 pick 05c98ef B,保存并退出。这样,B 就被移除了,你的历史记录看起来像这样:

A------B2'-------C''

哦,谢谢。我一直在寻找如何删除B。它运行得很好。 - JK Park

2
您可以通过交互式变基将您的分支放置在B2的顶部(实际上是在A的顶部,因为您想要去掉B2):
 git checkout yourBranch # which references C)
 git rebase -i A
 # drop B

那将会得到:
 A------B2'-------C'

(请注意,C' 是具有不同 SHA1 的 C,因为其父级已更改)
(对于 B2,同样的注释,因为其父级也已更改)

但在这种情况下,B 将保留在历史记录中。生成的存储库将看起来像 A-------B------B2-------C',是吗? - René Link
@RenéLink 确实:我已经编辑了答案,添加了rebase的交互部分。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接