假设你的git历史记录如下:
1 2 3 4 5
其中1-5是单独的修订版本。您需要删除第三个版本,同时保留1、2、4和5。如何实现?
如果要删除的版本后有数百个修订版本,是否有一种高效的方法可以完成此操作?
假设你的git历史记录如下:
1 2 3 4 5
其中1-5是单独的修订版本。您需要删除第三个版本,同时保留1、2、4和5。如何实现?
如果要删除的版本后有数百个修订版本,是否有一种高效的方法可以完成此操作?
根据这条评论(我已经确认这是真的),rado的回答非常接近但会使git处于分离的HEAD状态。相反,删除HEAD
并使用以下命令从当前分支中移除<commit-id>
:
git rebase --onto <commit-id>^ <commit-id>
^
更改为 ~1
后,它就可以工作了。 - Antimony--strategy-option theirs
。 - LastStar007git pull --strategy-option ours
,git push
。 - LastStar007以下是一种非交互式地删除特定<commit-id>
的方法,只需知道您想要删除的<commit-id>
:
git rebase --onto <commit-id>^ <commit-id> HEAD
HEAD
以避免出现分离头指针的情况。 - mklement0如之前所述,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):
使用rebase也可以删除一系列提交。如果我们有以下情况:
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参数和参数可以是任何有效的提交标识符。
--onto master~3 master~1
吗? - mxkgit rebase -i <after-this-commit>
一个编辑器将打开当前分支中所有提交(忽略合并提交),这些提交在给定提交之后。您可以随心所欲地重新排序此列表中的提交,并可以删除它们。这个列表看起来有点像这样:
单行说明仅供您参考;git-rebase不会查看它们,而是查看提交名称(例如本例中的“deadbee”和“fa1afe1”),因此请勿删除或编辑名称。pick deadbee 这个提交的单行说明 pick fa1afe1 下一个提交的单行说明 ...
如果要删除的版本之后有数百个版本,是否有一种高效的方法?
下面是步骤,但是为了参考,让我们假设以下历史记录:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C: 在被删除的提交(commit)之后的提交(commit)
R: 要被删除的提交(commit)
B: 在被删除的提交(commit)之前的提交(commit)
由于“数百个修订版本”限制,我假设以下先决条件:
我也遇到了类似的情况。使用下面的命令使用交互式变基,在选择时删除第三个提交。
git rebase -i remote/branch
以下是我遇到的情况以及如何解决它的过程。
[branch-a]
[Hundreds of commits] -> [R] -> [I]
这里的R
是我需要删除的提交,I
是在R
之后的单个提交
我创建了一个还原提交并将它们压缩在一起。
git revert [commit id of R]
git rebase -i HEAD~3
rado 和 kareem 的答案对我没有任何帮助(只显示消息“当前分支已经是最新的。”)。可能是因为在 Windows 控制台中 '^' 符号不起作用。 但是,根据 this 的评论,将 '^' 替换为 '~1' 可以解决问题。
git rebase --onto <commit-id>^ <commit-id>
git rebase --onto 2 3 HEAD
的意思是将提交从3到HEAD(HEAD是可选的,或者在这种情况下为5)重新应用到2上。 - neaumusic