我想知道是否有一种简单的方法可以将提交从分支A移动到分支B。
我当时在“开发”分支上工作,然后创建了一个新分支,比如说“ featureA” 开始开发新功能。我进行了2次提交,但是第一个提交应该是去“ develop”而不是“ featureA”,因为这只是一个小问题,但是我忘记了更改分支,因此我可以简单地将commit 1移到分支“ develop”并删除它来自“ featureA”?
更改仍未推送,只是本地更改。
我将不胜感激。
答案 0 :(得分:3)
在这种情况下很容易。要了解原因,请绘制(部分)提交图。
您从这样的事情开始:
...--o--* <-- develop (HEAD), origin/develop
然后,您创建了一个新的分支名称feature
,指向相同的develop
提交*
。您将HEAD
附加到新分支,得到:
...--o--* <-- develop, feature (HEAD), origin/develop
现在,您进行了两次新提交。我们称它们为A
和B
,而不是使用它们的真实哈希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 develop
将git 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^
来删除原始分支中的最后一次提交。