将提交移到其他分支

时间:2018-06-28 18:56:48

标签: git

我想知道是否有一种简单的方法可以将提交从分支A移动到分支B。

我当时在“开发”分支上工作,然后创建了一个新分支,比如说“ featureA” 开始开发新功能。我进行了2次提交,但是第一个提交应该是去“ develop”而不是“ featureA”,因为这只是一个小问题,但是我忘记了更改分支,因此我可以简单地将commit 1移到分支“ develop”并删除它来自“ featureA”?

更改仍未推送,只是本地更改。

我将不胜感激。

2 个答案:

答案 0 :(得分:3)

在这种情况下很容易。要了解原因,请绘制(部分)提交图。

您从这样的事情开始:

...--o--*   <-- develop (HEAD), origin/develop

然后,您创建了一个新的分支名称feature,指向相同的develop提交*。您将HEAD附加到新分支,得到:

...--o--*   <-- develop, feature (HEAD), origin/develop

现在,您进行了两次新提交。我们称它们为AB,而不是使用它们的真实哈希ID,它们是又大又丑陋且容易忘记的。提交A作为其父级,提交*,并且提交B具有提交A作为其父级,名称feature现在指向提交{ {1}}:

*

不理会...--o--* <-- develop, origin/develop \ A--B <-- feature (HEAD) ,让我们告诉Git移动名称feature指向提交develop,这是您想对A进行的次要修复:

develop

由于有几种调整...--o--* <-- origin/develop \ A <-- develop \ B <-- feature 的方法,因此我暂时删除了附加的HEAD,并且develop可能会在我们执行时重新附加。这是您想要的最后一幅图:根本没有更改任何提交,但是您的本地名称HEAD现在指向第一个提交,而develop指向第二个提交。

那么:我们应该怎么做?

一种相当安全的方法(不会丢失任何工作)是首先feature,然后使用git checkout developgit merge --ff-only快进到正确的提交。这是develop的提交,比A退了一步,所以我们可以这样做:

feature

这将使您git checkout develop git merge --ff-only feature~1 指向提交develop(并且您的A附加到HEAD,因此您必须develop才能继续)

另一种方法是检出git checkout feature并使用develop将标签git reset --hard移动到任意提交(同时还要更新索引/临时区域和工作树) 。这基本上与上面的相同,但是即使您的选择不明智,也可以将其移动到任何地方,所以上面的方法可能更可取。

另一种方法是使用develop强制将名称移动到您想要的位置:

git branch -f

这会将您的git branch -f develop feature~1 附加到HEAD,这样您就不必feature继续工作。但是,就像git checkout feature方法一样,它也不是很安全,因为它可以让您将名称移动到 any 提交,即使这没有任何意义。

最后,有一种非常偷偷摸摸的方法可以快速签发git reset来更新develop,而无需签出git merge --ff-only-实际上,您需要停留在其他分支上进行

develop

这使您的Git调用您自己的Git,并建议它自己将名称git push . feature~1:develop 移动到指向通过解析develop获得其哈希ID的提交。您的Git会在且仅当这是快速前进时才服从您的Git,因为此处没有强制标记。

使用您喜欢的任何一种;最后,除了附加了feature~1以外,它们都达到相同的结果。

答案 1 :(得分:2)

您可以从目标分支使用git cherry-pick <commit>将提交复制到那里(<commit>是分支的名称,如果它是最后一次提交)。

您可以使用git reset --hard HEAD^来删除原始分支中的最后一次提交。