从其他分支中挑选一组提交,跳过空提交。

5

我正在使用 cherry-pick 合并一大堆提交。

git rev-list --reverse something-begin..something-end | git cherry-pick --stdin

然后出现错误信息。

...
You are currently cherry-picking commit xxxyyy.

nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

If you wish to skip this commit, use:

    git reset

Then "git cherry-pick --continue" will resume cherry-picking the remaining commits.

我不想选择这些空提交记录。
每次停止和提示时输入git reset; git cherry-pick --continue非常烦人。
为什么它没有提供--skip-empty选项?然后我找到了这个线程:

http://markmail.org/message/yowzaetyu32ulvz7

很糟糕,我检查了我的git版本2.9.3,甚至发现它的cherry-pick不支持--skip-empty--empty-commpit=skip或任何其他选项。
我已经检查过git rev-list有一个--remove-empty选项,但它根本没有起作用。
2个回答

3

终于我找到了解决方法。

git rev-list --reverse something-begin..something-end . | git cherry-pick --stdin

rev-list命令中添加一个点(即路径部分),将跳过所有空提交(那么--remove-empty是用来做什么的?)


正如文档所说,“--remove-empty” 表示“当树中给定路径消失时停止。”也就是说,完全停止查看早期的修订版本。 - torek
@torek 是的,我已经读过那行了,并且确认那不是我想要的。但是那个文档中的那一行“当给定路径从树中消失时停止”并不够清晰,我不明白它的意思。 - William Leung
考虑一下如果你只给git rev-list一个单独的提交,它会做什么。它会打印该提交的ID,然后是该提交的父ID,然后是该父ID的父ID,然后是那个父ID的父ID,以此类推。什么时候停止从父级到父级的跟踪呢?通常的答案是:当没有更多的父级时。但你可以让它提前停止。 - torek
你尝试过 git cherry-pick something-begin..something-end 吗?那时候可用吗?它有同样的问题吗? - Dan M.

1
您可以这样使用rebase(已经检出了目标分支):
git reset --hard something-end && git rebase ORIG_HEAD

自动跳过冗余提交。

感谢我的同事Michael Adam提出了这个想法。


1
rebase不适用于子树重定位。实际上,我正在使用cherry-pick -Xsubtree选项从一个仓库中挑选一组提交到另一个仓库,该仓库仅包括原始文件夹。 - William Leung

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