我希望能够这样做:
git cherry-pick --interactive hash-0..hash-n-1 # fantasy command
并获得与交互式rebase相同的工作流程:出现一个编辑器缓冲区,其中包含:
pick hash-0
pick hash-1
pick hash-2
...
pick hash-n-1
我可以删除任何不需要的提交,squash
他们在一起,或edit
在选择之间暂停以执行一些手动修正(如commit --amend
)以及所有这些。
请注意交互式rebase的pick
如何与cherry-pick
一样简洁。
现在可以通过首先执行cherry-pick,然后执行交互式rebase来完成上述操作,这是不方便的。那就是:
$ git tag old-head # mark starting point for later rebase
$ git cherry-pick hash-0..hash-n-1 # get everything first
$ git rebase --interactive old-head # okay now rebase "in-branch" to fix it up
由于这两个步骤不仅不方便,而且因为它可能需要解决提交中的冲突,你甚至不希望在rebase阶段将其丢弃。
答案 0 :(得分:24)
好的,找到了一个不错的黑客。
在当前分支中的一次提交中启动一个简单的rebase --interactive HEAD^
。你会得到类似的东西:
pick 1efd396b * Fixed a bug in frob function
现在,只需粘贴您想要选择的其他哈希值:
pick 1efd396b * Fixed a bug in frob function
pick f01934db * Awesome feature added
pick 6fd109c1 * Refactored the widgets layer
squash 3900fd77 * Refactored the widgets layer s'more
保存并退出,然后:rebase
骡子有义务地将你背上装载的附加物品按照命令将其合并到当前分支中。
你可以用:
实际做一个空的rebasegit rebase --interactive HEAD
你得到一个包含
的缓冲区noop
你不必删除它;只需添加您的选择。
附录:要生成此方法的选择列表,请使用git log --oneline --reverse from..to
,然后调整所需的输出并将rebase命令添加到每一行:pick
,{{ 1}},...
答案 1 :(得分:4)
好的,跟进了Carl Norum的建议,我调查了--onto
的{{1}}论点。
用例可以像这样满足,这是一种改进,但仍然涉及一些过多的步骤。
主要问题是rebase需要一个当前分支来挑选,所以我们必须将我们的坐标移动到一个临时分支,然后操纵我们原来的分支头并删除临时分支。
流程如下:
git rebase
# We are originally on "mybranch"
# We create a temp-branch pointing to the last commit to be picked: hash-n-1
$ git checkout -b temp-branch hash-n-1 # create branch at last hash
# Then we rebase from the point before the first hash, onto our original branch
$ git rebase --interactive hash-0^ --onto mybranch
# The above rebase should make "temp-branch" into the very object that
# we want "mybranch" to be. If it looks that way, then all that is left is
# make it so:
$ git checkout mybranch
$ git reset --hard temp-branch
$ git branch -D temp-branch
使用git rebase --interactive hash-0^ --onto mybranch
之前的提交作为"上游"对于rebase,从当前分支(基于hash-0
)获取所有不在上游的提交。当然,这些提交是hash-n-1
到hash-0
。它们已重新定位到hash-n-1
头部,但是当前mybranch
是temp-branch
来跟踪结果。因此,我们只需将指针指定给reset --hard
并删除mybranch
。
它相当笨拙,但却消除了重复的挑选,并且很容易随时使用temp-branch
恢复。
(这仍然可以改进。)
答案 2 :(得分:1)
也许有更好的答案,但这可能适合你
git cherry | awk '$0=$2' > cherry.txt
"$EDITOR" cherry.txt
git cherry-pick --stdin < cherry.txt