我想基于一个特定的提交,该提交不是另一个分支的HEAD,而是倒退:
A --- B --- C master
\
\-- D --- E topic
到
A --- B --- C master
\
\-- D --- E topic
如何以一种优雅而笼统的方式实现这一目标?
一般来说,我的意思是目标提交(B)不一定是HEAD的直接祖先(我也可以根据A或先前的提交作为基础),并且在主题分支上可能不仅仅是两个提交。我可能还想从B基地改成A基地。
答案 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)