如何从一个分支中移除除了最后x个提交以外的所有提交?

6
我需要找到一种使用Git删除分支上除最后(最近)的159个提交之外所有提交的方法。如果您认为创建一个新分支并将最后的159个提交移动到该分支中更好,请告诉我。你有什么想法吗?我已经尝试过this但它似乎只允许我回滚到某个特定的提交(而这不是我想要的)。

1
cherry-picking 能解决你的问题吗?创建一个新分支并挑选你想要的提交。 - Maikel
2
新版本分支上的第160次提交应该是什么?第159次提交是否没有父级并引入整个源代码树的状态?或者你想要一个父级为第159次提交,引入该提交之前状态的提交吗? - Vampire
1
@BjörnKautler的问题是获得正确结果的关键之一。另一个关键是,无论答案是什么,您必须决定相关的源树应该具有什么初始状态。无论您是否将新分支作为孤立(新根)分支,您都必须选择第一个新提交的源树。这将影响其他159个提交的情况。 - torek
1
@torek 啊,这就是问题所在!我有很多合并提交,因此它一直失败。对我来说,git filter-branch似乎是完成工作的最简单方法。你有什么建议让它起作用? - Leonard Lamprecht
1
filter-branch 的技巧在于(就像rebase一样)它会复制提交。与rebase不同的是,默认情况下通过保持原始源树不变来进行复制,并且仅映射父ID。如果您熟悉图形理论,基本上它通过复制指定子图(从X..Y符号表示)的节点来创建一个新的子图,然后将分支标签粘贴到最新的复制提交上。每个提交(如果您设置了索引或树过滤器,则为索引或树)都会在执行新的git commit-tree之前通过各种过滤器进行传递,并带有来自映射的“-p”参数。 - torek
显示剩余2条评论
1个回答

9
最简单的方法是创建一个孤立分支,然后将一系列提交挑选到新分支中。
# create orphan branch 
git checkout --orphan <branch>

git cherry-pick <SHA-1>...<SHA-1>

git checkout --orphan

创建一个新的孤儿分支,命名为[分支名],并从[起点]开始切换到它。在这个新分支上做的第一个提交将没有父提交,这将是一个全新的历史记录,与所有其他分支和提交都没有关联。


如何将所需的提交加入不同的分支。

git cherry-pick <SHA-1>...<SHA-1>

应用主分支顶部提交所引入的更改,并创建一个包含此更改的新提交(s)。

...的语法是提交范围,抓取从开始(不包括)到最后一个提交之间的所有提交。

enter image description here


阅读完整的git cherry-pick文档以了解您可以使用的所有选项


1
谢谢!但是假设“one”是我的最新提交,我该如何确保在拣选时它被包含在内呢?因为根据您的答案,“one”和“three”将被排除,只有它们之间的提交将被复制(但是我想要包括“one”)。 - Leonard Lamprecht
2
你可以选择从哪个提交开始,并提供一个范围。例如:如果你想要160,使用命令git cherry-pick 160...1 - CodeWizard
1
你也可以使用 git cherry-pick commit-hash 命令来选择单个提交记录,而无需指定范围。 - Muhammad Shoaib
1
但他要求多次提交。这是最初的问题。 - CodeWizard

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