2

Gitlovers,我有一个问题。

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

我试过变基:

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

在此处输入图像描述

对不起我糟糕的英语(欢迎更正):-)

4

4 回答 4

4

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

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

你必须发生的事情是你这样做了:

  1. 签出大师
  2. 合并开发
  3. 签出开发
  4. 合并大师(!!!)
  5. 继续在 dev 上开发

错误是第 4 步。这称为反向合并,应该避免 - 尽管一些基于主干的工作流会从中受益。

于 2012-10-12T07:09:08.543 回答
2

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

于 2012-10-12T07:13:26.687 回答
1

你可以试试:

$ git checkout dev
$ git merge master
$ get checkout master
$ get reset --hard [the revision you want to return]
于 2012-10-12T06:25:28.830 回答
1

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

  1. git tag master dev.target在我们移动 master 之前,在 dev 应该去的地方存储一个标签。
  2. git checkout master
  3. git reset --hard dev将 master 移动到 dev 所在的位置。
  4. git checkout dev
  5. git reset --hard dev.target将 dev 移动到 master 所在的位置。
  6. git tag -d dev.target删除占位符。

你可以在没有标签的情况下使用提交 ID 进行操作,但标签是一个很大的保险,以防你搞砸了。这本质上是git-reset 手册页中的“撤消提交,使其成为主题分支”配方,除非您的主题分支已经存在。

或者,由于您只想交换分支,您可以重命名它们!

  1. git branch -m master dev.mv
  2. git branch -m dev master
  3. git branch -m dev.mv dev

不利的一面是,如果他们有任何上游跟踪,那将是不正确的。你必须进去.git/config纠正它。

于 2012-10-12T09:22:04.240 回答