假设您的git历史记录如下:
1 2 3 4 5
1–5是单独的修订。您需要删除3,同时仍然保留1、2、4和5。如何完成?
如果要删除的修订有数百个,是否有一种有效的方法?
git rebase --onto 2 3 HEAD几乎意味着要重新设置为2,并在3和HEAD之间提交(HEAD是可选的,在这种情况下为5)
假设您的git历史记录如下:
1 2 3 4 5
1–5是单独的修订。您需要删除3,同时仍然保留1、2、4和5。如何完成?
如果要删除的修订有数百个,是否有一种有效的方法?
git rebase --onto 2 3 HEAD几乎意味着要重新设置为2,并在3和HEAD之间提交(HEAD是可选的,在这种情况下为5)
Answers:
要将版本3和版本4合并为一个版本,可以使用git rebase。如果要删除版本3中的更改,则需要在交互式变基模式下使用edit命令。如果要将更改合并为一个修订版,请使用squash。
我已经成功使用了这种壁球技巧,但之前从未需要删除修订版。希望“分裂提交”下的git-rebase文档应该给您足够的想法来解决它。(或者其他人可能知道)。
从git文档:
从您想保持原样的最早提交开始:
git rebase -i <after-this-commit>将使用当前分支中的所有提交(忽略合并提交)来激发编辑器,这些提交将在给定提交之后进行。您可以按照自己的喜好对列表中的提交进行重新排序,也可以将其删除。该列表大致如下所示:
选择Deadbee此提交的单行代码 选择fa1afe1下一次提交的单行 ...单行描述纯粹是为了您的愉悦;git-rebase不会查看它们,而是查看提交名称(在此示例中为“ deadbee”和“ fa1afe1”),因此请勿删除或编辑名称。
通过将命令“ pick”替换为命令“ edit”,您可以告诉git-rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交,并继续进行基础调整。
如果要将两个或多个提交折叠为一个,请在第二次和后续提交中将命令“ pick”替换为“ squash”。如果提交的作者不同,它将被压缩的提交归因于第一提交的作者。
根据此评论(我检查这是对的),rado的回答非常接近,但git处于分离状态。而是删除HEAD并使用它<commit-id>从您所在的分支中删除:
git rebase --onto <commit-id>^ <commit-id>
^以~1使其起作用。
--strategy-option theirs。
这是一种非交互方式删除特定对象的方法<commit-id>,仅知道<commit-id>您要删除的对象:
git rebase --onto <commit-id>^ <commit-id> HEAD
HEAD以免遗漏,以免造成头部过头。
如前所述,git-rebase(1)是您的朋友。假设提交在您的master分支中,则可以执行以下操作:
git rebase --onto master~3 master~2 master
之前:
1---2---3---4---5 master
后:
1---2---4'---5' master
从git-rebase(1):
一定范围的提交也可以通过重新设置基准来删除。如果我们有以下情况:
E---F---G---H---I---J topicA然后命令
git rebase --onto topicA~5 topicA~3 topicA将导致删除提交F和G:
E---H'---I'---J' topicA如果F和G以某种方式存在缺陷,或者不应该成为topicA的一部分,则这很有用。请注意,-onto的参数和参数可以是任何有效的commit-ish。
--onto master~3 master~1吗?
MERGE CONFLICT错误。我使用了stackoverflow.com/questions/2938301/remove-specific-commit中提到的方案,并且在该示例中无法删除第二次提交。
如果您只想删除版本3中所做的更改,则可能要使用git revert。
Git revert只需创建具有更改的新修订,即可撤消您要还原的修订中的所有更改。
这意味着您将保留有关不需要的提交和删除这些更改的提交的信息。
如果这同时完全有可能有人从您的存储库中拉出了,这可能会更加友好,因为还原基本上只是一个标准的提交。
到目前为止,所有答案都没有解决跟踪问题:
如果要删除的修订有数百个,是否有一种有效的方法?
遵循以下步骤,但作为参考,我们假设以下历史记录:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C:紧随要删除的提交之后的提交(干净)
R:要删除的提交
B:即将删除的提交之前的提交(基本)
由于存在“数百次修订”约束,因此我假设以下先决条件:
这是一组限制性很强的约束,但是有一个有趣的答案实际上可以在这种极端情况下起作用。
步骤如下:
git branch base Bgit branch remove-me Rgit branch savegit rebase --preserve-merges --onto base remove-me如果确实没有冲突,则不应再有任何干扰。如果有冲突,您可以解决它们,rebase --continue或者决定忍受尴尬和痛苦rebase --abort。
现在你应该对master不再有提交- [R在里面。的save分支点到你之前在哪里,如果你想调和。
您如何安排其他人转移到您的新历史记录取决于您自己。您将需要与相识stash,reset --hard和cherry-pick。你可以删除base,remove-me和save分支机构