change exists提交到当前提交

时间:2014-11-27 07:57:22

标签: git git-rebase

简单地说,我已经这样做了:

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''

2 个答案:

答案 0 :(得分:3)

要完全删除B,您必须重新B2 AC B2上的git checkout C git rebase B2

C

B2

之上重新定位分支A-------B------B2-------C'
B

(注意C'是新提交)

但是现在你在历史上仍然有git rebase -i A 提交。您可以使用交互式rebase删除它。

pick 05c98ef B
pick e31d9f0 B2
pick 5d30d05 C

打开交互式编辑器

pick 05c98ef B

删除行B,保存并退出。删除此A------B2'-------C'' 后,您的历史记录如下所示

{{1}}

答案 1 :(得分:2)

您可以在B2之上交互式地修改您的分支(实际上在A之上,因为您希望B2消失):

 git checkout yourBranch # which references C)
 git rebase -i A
 # drop B

这会给:

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

(请注意,C'C,其中包含不同的SHA1,因为其父级已更改)
B2的评论相同,因为其父级也已更改)