Git:过去如何根据特定的提交基础?

时间:2019-11-08 09:05:59

标签: git version-control git-rebase

我想基于一个特定的提交,该提交不是另一个分支的HEAD,而是倒退:

A --- B --- C          master
            \
             \-- D --- E   topic

A --- B --- C          master
      \
       \-- D --- E   topic

如何以一种优雅而笼统的方式实现这一目标?

一般来说,我的意思是目标提交(B)不一定是HEAD的直接祖先(我也可以根据A或先前的提交作为基础),并且在主题分支上可能不仅仅是两个提交。我可能还想从B基地改成A基地。

1 个答案:

答案 0 :(得分:1)

使用git cherry-pick

git rebase是类固醇的git cherry-pick

如果您只需要移动一些提交:您可以使用git cherry-pick来逐一选择它们

# move back to B
git checkout B

# start a branch here, and use it as the active branch
git checkout -b wip

# cherry-pick the commits you want to have
git cherry-pick D
git cherry-pick E

# if all went well : move the 'topic' branch to the current branch :
git checkout topic
git reset --hard wip

# delete the temporary 'wip' branch
git branch -d wip

使用git rebase

如评论中所述:git rebase可以采取额外的选择来仅移动一系列提交。

您可以使用以下命令完成与上述cherry-pick序列相同的操作:

git rebase --onto B master topic

附加说明:git rebase -i

git rebase也有一个--interactive|-i标志:

git rebase -i --onto B master topic

使用-i标志:在执行任何操作之前,git将为您打开一个文本编辑器,其中将列出所有重新基于基础的提交。

这一步骤的明显好处是向您展示了将要应用的内容(在实际应用之前),并且比“挑选该提交”还描述了更多的动作。

您可以在网上搜索有关git rebase -i的更完整的教程,这里是一个:
Git Interactive Rebase, Squash, Amend and Other Ways of Rewriting History (thoughtbot.com)