如何在特定提交上执行rebase?

时间:2012-10-12 06:18:10

标签: git version-control rebase git-rebase

Gitlovers,我有一个问题。

几次提交之前,在最后一次将dev分支合并到master之后,我忘了切换回dev分支。我继续向错误的分支提交:master - 应该回到合并发生的地方。我如何交换分支,以便在我将其合并到主服务器之后将其转换回dev分支?

我尝试使用rebase:

git checkout master; git rebase dev;git checkout master; git rebase --onto dev;为我做了一些奇怪的事情..

enter image description here

抱歉我的英语很糟糕(欢迎更正): - )

4 个答案:

答案 0 :(得分:3)

一种通用解决方案,也适用于历史不是线性的更复杂场景。 确保您在主分支,然后:

git rebase --preserve-merges --onto master^2 master dev

你遇到这种情况必然发生的事情是你这样做了:

  1. 签出了主人
  2. merged dev
  3. 签出了开发
  4. 合并大师(!!!)
  5. 继续在dev上发展
  6. 错误是第4步。这称为后合并,应该避免 - 虽然一些基于干线的工作流程会从中受益。

答案 1 :(得分:2)

您基本上将一堆提交从主分支移回到dev分支。我有类似的情况试图将提交从一个主题分支移动到另一个主题分支。 --onto命令的rebase开关执行此操作。我不想在这里重复我的整篇博文,但这是我详细说明我所做的事情 - http://nibrahim.net.in/2012/01/09/moving_topic_branches_in_git.html

答案 2 :(得分:1)

你可以尝试:

$ git checkout dev
$ git merge master
$ get checkout master
$ get reset --hard [the revision you want to return]

答案 3 :(得分:1)

无需变基或合并。分支只不过是提交标签。您可以使用git reset移动标签。尽管名称如此,reset实际上是move labels around命令。

  1. git tag master dev.target在我们移动主人之前,存储dev应该去的标签。
  2. git checkout master
  3. git reset --hard dev将主人移至dev所在的地方。
  4. git checkout dev
  5. git reset --hard dev.target将dev移至master所在的位置。
  6. git tag -d dev.target删除占位符。
  7. 你可以在没有使用提交ID的标签的情况下做到这一点,但是标签是一个很大的保险,以防你搞砸了。这主要是来自git-reset man page的“撤消提交,使其成为主题分支”的配方,除了您的主题分支已经存在。

    或者,因为你只想交换分支,你可以重命名它们!

    1. git branch -m master dev.mv
    2. git branch -m dev master
    3. git branch -m dev.mv dev
    4. 缺点是,如果他们有任何上游跟踪,那将是不正确的。你必须进入.git/config才能纠正它。