如何“变基”单个提交?

5
考虑以下树形结构:
A --- B --- C --- D --- E --- F --- master
 \
  \
    B' --- C' --- D' --- topic

假设 (B != B'),我想执行 git rebase --onto master master topic,但这样会产生冲突。但情况更简单:我只想将单个的 topic 提交放到主分支上。

git checkout master
git cherry-pick topic
git checkout topic
git reset --hard master
git checkout master
git reset --hard HEAD~1

这些命令能否用一条命令来完成呢?

为什么不解决这些冲突呢? - Ôrel
因为实际上不存在冲突... - user3719454
1
可能是 git rebase a single commit 的重复问题。 - Stevoisiak
1个回答

4

首先重置你的分支,然后使用reflog找到要挑选的提交:

git checkout -B topic master # re-create topic branch at the commit of master
git cherry-pick topic@{1} # copy the old tip of the topic branch

另一种可能更简单的方法是将一系列提交提交给rebase,其中仅包含要重新定义的单个提交:
git rebase --onto master topic^ topic

如果我正确理解了 -B 标志,第二个 cherry-pick 应该会显示没有要做的事情,因为它试图挑选与 master 指向相同的提交,我认为 topic@{1} 应该被直接哈希值替换,如果我错了请纠正我。 - Mohammad AbuShady
@MohammadAbuShady: topic@{1} 指的是分支之前指向的上一个提交。在检出/重置之前,它指向 D',在检出之后,它指向 Ftopic@{0} 将是 Ftopic@{1} 将是 D',而 topic@{2} 将是在 D' 之前指向的任何提交(很可能是 C')。 - knittl
嗯,这很有趣。例如,如果我执行 git rebase origin/develop,然后发现我弄错了冲突或其他什么问题,我可以简单地执行 git reset --hard develop{1} 吗? - Mohammad AbuShady
@MohammadAbuShady: develop@{1},是的。使用git reflog $branch来查看特定分支的reflog。如果没有参数调用,它将显示HEAD reflog。 - knittl
啊,好的,所以@{1}是reflog中提交历史记录的索引,谢谢你的提示(或更像指针历史记录)。 - Mohammad AbuShady
git rebase --onto master topic^ topic 正是我所需要的,谢谢 :) - user3719454

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