Git如何使用revert和cherry pick来省略中间的commit?

3
我在GitLab上有以下提交记录:
3fad532  Last commit   
3bnaj03  Fifth commit
vcn3ed5  Fourth commit xxx
aece15d  Third commit  xxx
385d65a  Second commit 
556cc58  First commit 

我想要移除第三和第四个提交,为此我认为首先需要通过回滚到第二个提交:

git revert 385d65a

然后从第五个提交开始应用 cherry pick:

git cherry-pick 3bnaj03 3fad532  

1. 通过删除第三和第四个提交记录的方式来获取最后一次提交是否正确?

2. 对于这种情况,是否有更好的方法?


听起来你想使用 git rebase -i 556cc68 命令,然后用 drop 命令删除提交记录 aece15dvcn3ed5。这将从历史记录中简单地删除这两个提交。对于 aece15dvcn3ed5,你也可以选择使用 git revert(可以将其视为反向提交),并在标题为“Last commit”的提交之后添加新的还原提交。无论如何,你可以根据提交记录的分布情况选择更适合你的解决方案。但是,我无法理解你提出的解决方案。(在 Jon Skeet 发布他的答案之前,我在20秒前发布了这条评论 :P) - terrorrussia-keeps-killing
2个回答

5

我认为一种更简单的方法是使用交互式变基:

  • git rebase -i HEAD~6 (或者你想要回溯到的任何提交)
  • 在编辑器弹出窗口中删除代表您想要删除的提交的行
  • 让变基自动完成其余部分

2
我想移除第三和第四个提交,因此我认为首先要恢复到第二个提交...
git revert <hash>

告诉 Git:找到我刚刚给你的哈希 ID 对应的提交。确定在该提交的父提交(我保证只有一个父提交)和该提交之间发生了什么更改。无论发生了什么更改,都对当前提交进行另一个更改,以撤消或回退先前的更改。
(要恢复到某个特定提交之前的状态,Git 使用动词 git reset。这个命令非常大且复杂,因为它可以重置多个东西。除非您跟随其他 Git 命令,否则通常是错误的选择。)
Jon Skeet answered所述,要“删除”你不喜欢的两个提交,通常需要使用git rebase -i。请注意,这将必然用具有不同哈希值的新提交替换所有随后的提交。因此,如果你已经发布了这些提交,其他人也有这些提交,通常最好使用“撤销旧提交的新提交”git revert命令。
当你已经与其他人安排好可以替换已发布的提交时,就会有一个例外情况(“不要替换已发布的提交”)。这样,他们就不会惊讶地发现以前存在的一些提交现在已经消失了。如果他们已经做了依赖于现在已经消失的提交的其他提交,则可以使用他们自己的私有提交来创建自己的新提交,如果必要和适当的话,将其添加到已回滚和重写的分支上。
如果您的代码符合此异常情况(即可以进行变基),请继续使用git rebase。如果不符合,请考虑使用git revert两次,撤销您希望撤销的两个提交。Git会添加另外两个提交来撤消您想要撤消的两个提交。

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