将最近的提交移动到另一个现有分支

时间:2014-03-05 02:43:52

标签: git branch

我刚刚对功能分支进行了一些更改,但我意识到我在错误的分支上。

如何进行上次提交,并将其移至另一个已存在的分支?我还没推过任何东西。

我已经看到了一些类似的问题,但他们都涉及创建一个新的分支,而他们所做的所有硬头重置都是一个可怕的小屁。

3 个答案:

答案 0 :(得分:1)

您将需要在当前分支上使用重置 - 这就是它的工作原理。不要担心 - 当你使用它时,你所有的东西都是安全的。

首先,在您的分支上,您不小心添加了提交(我们称之为branch1),创建一个新分支(让我们称之为temp

git branch temp

正如@bmargulies所说,分支只是对提交的引用。只要你有一个提交的引用,你就没有丢失它。在错误地提交提交之前,我们会将您的branch1分支移回原来的位置,因此temp是我们对您添加的提交的引用 - 将其视为备份。我们现在可以对branch1点进行各种更改,而不必担心丢失新提交。

如果ABC最初在branch1上提交,并且您意外添加了D EF那么你的提交历史现在看起来如下所示(括号显示每个分支引用哪个提交):

A <- B <- C <- D <- E <- F (temp)(branch1)

如果您添加了3个额外的提交(DEF),那么您不想将其添加到branch1,那么您可以重置branch1回到它应该使用的位置:

git reset --hard HEAD~3

现在事情会是这样的:

A <- B <- C (branch1)<- D <- E <- F (temp)

现在可怕的部分。垫底。 Rebase有一个标志--onto,它采用以下形式:

git rebase --onto <branch a> <branch b> <branch c>

它基本上说的是“找到branch bbranch c的共同祖先,在共同祖先和branch c之间进行每次提交所引入的更改,并将它们重播到{{1} }}

“共同祖先”的内容可能听起来很可怕,但如果branch abranch b的祖先(读取:箭头从branch c指向branch c),那么提交branch b指向共同的祖先。

看看这是怎么回事?如果我们说您要将提交移动到的分支称为branch b,那么您可以使用以下命令将新提交移动到它:

branch2

这将提交git rebase --onto branch2 branch1 temp DE并将它们放在F的末尾(它们会被称为其他内容,因为这是一个基础 - 你说过你没有推到公众回购所以这不应该是一个问题)

branch2现在将在您错误地添加这些提交之前的位置,新提交将位于branch1的末尾,您可以使用branch2 >

temp

答案 1 :(得分:1)

git checkout whereishouldhaveputit
git cherry-pick whereididputit
git checkout -B whereididputit whereididputit~

答案 2 :(得分:0)

你需要真正理解git提交永远不会'在'分支上。在git中,分支只是一个指向单个提交的标签,即分支的头部。

因此,如果您提交错误的分支,则需要将标签移回原位,这是重置操作的本质。这将从您提交的错误位置的角度撤消您的错误。额外的提交只会四处闲逛,不会造成任何伤害,直到它被垃圾收集。

因此,基本计划是使用合并将更改作为其他分支头部的后继应用,然后进行硬重置以将意外目标的标签放回原位。 / p>