我刚刚对功能分支进行了一些更改,但我意识到我在错误的分支上。
如何进行上次提交,并将其移至另一个已存在的分支?我还没推过任何东西。
我已经看到了一些类似的问题,但他们都涉及创建一个新的分支,而他们所做的所有硬头重置都是一个可怕的小屁。
答案 0 :(得分:1)
您将需要在当前分支上使用重置 - 这就是它的工作原理。不要担心 - 当你使用它时,你所有的东西都是安全的。
首先,在您的分支上,您不小心添加了提交(我们称之为branch1
),创建一个新分支(让我们称之为temp
)
git branch temp
正如@bmargulies所说,分支只是对提交的引用。只要你有一个提交的引用,你就没有丢失它。在错误地提交提交之前,我们会将您的branch1
分支移回原来的位置,因此temp
是我们对您添加的提交的引用 - 将其视为备份。我们现在可以对branch1
点进行各种更改,而不必担心丢失新提交。
如果A
,B
和C
最初在branch1
上提交,并且您意外添加了D
E
和F
那么你的提交历史现在看起来如下所示(括号显示每个分支引用哪个提交):
A <- B <- C <- D <- E <- F (temp)(branch1)
如果您添加了3个额外的提交(D
,E
和F
),那么您不想将其添加到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 b
和branch c
的共同祖先,在共同祖先和branch c
之间进行每次提交所引入的更改,并将它们重播到{{1} }}
“共同祖先”的内容可能听起来很可怕,但如果branch a
是branch b
的祖先(读取:箭头从branch c
指向branch c
),那么提交branch b
指向共同的祖先。
看看这是怎么回事?如果我们说您要将提交移动到的分支称为branch b
,那么您可以使用以下命令将新提交移动到它:
branch2
这将提交git rebase --onto branch2 branch1 temp
,D
和E
并将它们放在F
的末尾(它们会被称为其他内容,因为这是一个基础 - 你说过你没有推到公众回购所以这不应该是一个问题)
branch2
现在将在您错误地添加这些提交之前的位置,新提交将位于branch1
的末尾,您可以使用
temp
答案 1 :(得分:1)
git checkout whereishouldhaveputit
git cherry-pick whereididputit
git checkout -B whereididputit whereididputit~
答案 2 :(得分:0)
你需要真正理解git提交永远不会'在'分支上。在git中,分支只是一个指向单个提交的标签,即分支的头部。
因此,如果您提交错误的分支,则需要将标签移回原位,这是重置操作的本质。这将从您提交的错误位置的角度撤消您的错误。额外的提交只会四处闲逛,不会造成任何伤害,直到它被垃圾收集。
因此,基本计划是使用合并将更改作为其他分支头部的后继应用,然后进行硬重置以将意外目标的标签放回原位。 / p>