【问题标题】:How to remove an in-between merge in git?如何删除git中的中间合并?
【发布时间】:2011-06-10 01:57:06
【问题描述】:

我想删除中间合并(删除,而不是 squash),然后将最后 2 个提交移动到新分支。

这是我目前的git log --graph

* 3a5c453 - (2 hours ago) last commit (HEAD, master)
*   b6c19f1 - (2 hours ago) Merge branch 'tade' into HEAD
|\  
* | be356d0 - (2 hours ago) previous commit
| * 65328dc - (3 hours ago) some other commit in branch tade

我想这样结束:

    * bbbbbbb - (some time in the future) a later commit on tade (tade)
*   | aaaaaaa - (some time in the future) a later commit on master (master)
| * | 3a5c453 - (2 hours ago) last commit (HEAD, newone)
| * | be356d0 - (2 hours ago) previous commit
|/  |
|   * 65328dc - (3 hours ago) some other commit in branch tade

我想过使用git rebase -i 删除与分支tade 的合并,然后执行git branch newonegit reset --hard HEAD^2 将最后2 个提交移动到新分支。但是,当我进行 rebase 时,它​​向我显示了来自 tade 分支的所有提交,这些提交合并到了 master 和 |不愿意删除它们。

有没有更好的方法或者我应该继续它?

编辑:我更新了预期的状态图以使其更加清晰。 2 个新提交(aaaaaaabbbbbbb)只是为了更好地说明状态(我希望)

【问题讨论】:

  • 我真的对你想要的结果中的那些垂直线感到困惑。上面是否还有其他提交,在分支 tade 上,以及在......最左边的任何隐含分支?
  • 如果您将当前的 HEAD 标记为实际的分支名称,并告诉我们您是如何调用 rebase -i 的,这也会很有帮助。
  • 对不起,我是 git log --graph 输出的新手。我将更改图表以阐明预期状态。

标签: git git-branch git-rebase git-merge git-reset


【解决方案1】:

使用交互式变基将3a5c453 变基为be356d0,而不是合并提交b6c19f1(即只需将3a5c453 下移一个)。那么你应该有这样的东西:

*   xxxxxxx - (2 hours ago) Merge branch 'tade' into HEAD
|\  
* | yyyyyyy - (2 hours ago) last commit (HEAD)
* | be356d0 - (2 hours ago) previous commit
| * 65328dc - (3 hours ago) some other commit in branch tade

然后你就可以创建新的分支了:

git checkout -b newbranch yyyyyy

然后你可以删除xxxxxx 并提交一些东西给主人,最后得到这个:

* zzzzzz - new commit on master
| * | yyyyyyy - (2 hours ago) last commit (HEAD)
| * | be356d0 - (2 hours ago) previous commit
| | * 65328dc - (3 hours ago) some other commit in branch tade

【讨论】:

  • 当我进行交互式 rebase 时,我在 2 次提交之间收到了大量提交(来自 tade 分支)。我应该把它们都移到下面吗?
  • 试试rebase -i 65328dc,它应该只给出65328dc和当前HEAD之间的那些。
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 2016-05-05
  • 2012-12-29
  • 2021-04-20
  • 2017-05-25
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多