在其他提交之间删除一个提交

4

我有一个本地项目和对应的Github仓库。我有一些提交记录:

A <- B <- C <- D

最新的是A。

这种情况在两个存储库中都存在。我想要删除提交C,就像它从未发生过一样。

因此,在git log上应该像这样。

A <- B <- D

在两个代码库上都需要进行操作。

我尝试了git reset --soft <sha-commit-C>,但现在卡住了。我看不到A, B。在进一步操作之前,我想要完全确定自己的所作所为。

git reflog给出如下反馈:

git reflog
73ea54d HEAD@{0}: reset: moving to 73ea54d8
a594699 HEAD@{1}: rebase -i (finish): returning to refs/heads/unique_ptr_release
a594699 HEAD@{2}: checkout: moving from unique_ptr_release to a594699fb6f7d85bc8
a594699 HEAD@{3}: checkout: moving from unique_ptr_release to unique_ptr_release
a594699 HEAD@{4}: commit (merge): Merge branch 'master' into unique_ptr_release

HEAD@{4} 是在执行 reset --soft 命令之前我的 HEAD 所指向的位置。

我该如何摆脱这种情况?


1
在进行进一步实验之前,请复制/备份您的.git文件夹。 - mnagel
谢谢。我刚刚完成了那个。 - Ashish Negi
你可以从reflog中使用sha来挑选缺失的提交,将它们合并到当前分支中,然后排除c以获得所需的结果。 - mnagel
git reset --hard a594699 把我带回了ABCD :) - Ashish Negi
2个回答

8

Git-rebase是你需要的。

如果你想要移除提交记录 A-B-C-D 中的 C,可以尝试以下命令:

git rebase -i HEAD~3

通过编辑器(我的是vim),它将显示您的最后3个提交记录,只需删除要删除的提交行(在vim中:dd),然后保存它(在vim中::wq)。

完成后,查看git log,您会发现C提交已被删除。

*不要忘记备份您的代码或.git文件夹。


我的 HEAD 是否在 A?git log 显示 C <- D。我已经执行了 git reset --soft C。我应该只是执行 git rebase -i HEAD-3 吗? - Ashish Negi
由于我已经推送了代码:虽然我不太了解 Git,但我应该使用 Git revert 吗? - Ashish Negi
已经在我的问题中提到了:HEAD@{4} commit(merge) 是我的 A。 - Ashish Negi
哦,抱歉。你应该回到 A,使用 git reset --soft HEAD@{4}。之后执行 git rebase -i HEAD~3 - waskito
它不允许我说已经存在一个rebase-merge目录。 - Ashish Negi
显示剩余2条评论

1
  1. 确保备份您的 .git 文件夹。
  2. 确保提交 D,不要依赖于 C 中所做的更改。
  3. git rebase --onto D B~1(因为 A 是最新的提交)

D不依赖于C。我应该只输入git rebase --onto B D~1 . B,其中B和D表示它们的SHA值吗?我希望你明白我的当前情况是在git reset --soft C之后。 - Ashish Negi
我刚刚编辑了我的回答,请检查。是的,B和D表示它们的SHAs。 - Shunya
git log 显示 C D。我找不到 B 的 SHA。如何找到它? - Ashish Negi
使用 git reset --soft C 命令后,如果你执行 git status 命令,会显示 A 和 B 作为新文件,请提交 B 并使用适当的提交信息提交 A。现在你回到了原始状态。然后按照上面提到的方法执行 git rebase 命令。 - Shunya
A和B不是文件,而是我的提交。因为它们在服务器上。如果我提交,它将变成提交“F”。我不能从服务器获取这些提交吗?reset --soft也很危险。我在某个地方读到过,要执行git reset --hard a594699 <-其中a594699在git reflog的输出中。我应该这样做吗? - Ashish Negi

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