Git:将提交移动到“顶部”

49

假设我在master分支上禁用了某个功能。 我在feature分支上开发该功能,所以我有一次特殊提交 $,仅启用该功能。 现在我想将我在feature中所做的更改合并到master中,但是不包括启用功能的提交。就像这样:

main:    A--B--X--Y
feature: A--B--$--C--D

所以假设我想通过把 $ 提交移动到 feature 的顶部来实现它:

new feature: A--B--C--D--$

我该如何着手做这件事呢?


1
你为什么提到主分支?你完全在询问功能分支,对吗? - Frank Puck
当我再次来到这里时,-Xours-Xtheirs也是你的好朋友。 - WEBjuju
更详细的QA请参考:如何移动特定的提交范围 - Top-Master
2个回答

53

git rebase -i B,然后将$移动到在编辑器中显示的列表的末尾。它将作为打开的文件的第一行开始。您也可以完全删除该行,这将从您的分支历史记录中删除该提交。


1
太棒了,谢谢!现在我清楚地知道应该使用rebase了,之前因为某些原因一直试图用cherry-pick来解决它。 - Adrian Panasiuk
@AdrianPanasiuk,您也可以使用cherry-pick,但这可能需要更多的努力。 - Carl Norum
3
你还可以使用git rebase -i $~1,它等同于$~1$之前的提交,即B - yunzen
不清楚:“然后将$移动到列表末尾” - 我在这里询问如何做到这一点! - Frank Puck
1
只需将行移动到您的编辑器中,无论对于您的配置来说如何运作。 - Carl Norum

13

如果您希望在feature上按照相同的顺序保留提交记录,您应该创建一个新的分支并执行以下操作。否则,请在feature上执行以下操作。

git rebase -i <sha for commit B>

将提交 $ 移动到列表底部

git checkout master
git rebase feature <or the other branch name>

我在问题上不太清楚,但如果你根本不想要 $,而不是移动它,请在git rebase -i之后删除它。不过,你需要在一个新分支上做这个操作,以防丢失内容。因为你正在改变历史记录。

这还假设分支feature没有被推送到远程,因为重写历史记录是不好的。


第一个rebase做了什么?为什么我必须将rebase应用于B而不是$?第一个rebase之后的状态是什么? - Frank Puck
为什么要检出主分支?原始问题是修改特性分支并保持主分支不变。 - Frank Puck
1
@FrankPuck 第一次变基是允许您重新排序提交的。您使用B的SHA,因为它是第一个不需要更改的提交。当您重新排序提交时,所有其他提交的SHA都会更改(如果我没记错的话)。至于第二个检出,我不确定(我在8年前回答的)。我认为这也是为了将提交合并到主分支上。 - Schleis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接