git - 如何删除对 git 的提交

标签 git github git-commit

<分区>

我想删除远程分支上的一些提交。例如,如果历史记录如下:

A->B->C->D

我想删除C和D给我:

A->B

现在 HEAD 在哪里?

最佳答案

我将为您列出所有删除提交的不同方法以及何时应该使用它们。 在你做任何这些之前,为了安全起见,我强烈建议你将你的分支复制到另一个分支。

通过执行 git checkout -b copy_branch 执行此操作,然后通过执行 git checkout the_branch_i_want_to_delete_from_again 切换回原始分支

如果您已经推送过,就像您的情况一样,您可以跳到#3,但如果您还没有推送过,则可以查看 1 和 2。

1) 我还没有推送或正在单独工作,我想删除的提交是最近的提交:

如果我有: A---B---C---D

我想删除 C 和 D。

然后执行 git reset --hard sha_of_B

结果是: A---B

如果你已经推送了,就像你的情况一样,你仍然可以这样做,然后执行 git push --force origin the_branch,但不推荐这样做,因为你可能会惹恼其他人在这个项目上工作。您应该改为遵循 #3。

2) 我还没有推送或正在单独工作,我想删除的提交在我的分支中间:

如果我有: A---B---C---D

我想删除 C。

git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete

这会打开非常有用的交互式 rebase 屏幕:

pick sha_of_C C
pick sha_of_D D

正如 git 提示您“# If you remove a line here THAT COMMIT WILL BE LOST.”这就是我们要做的。

我删除了 pick sha_of_C C 这行,它给我留下了:

pick sha_of_D D

我用 :wq 将它保存在 vi 中,结果是:

A---B---D

如果你已经推送了,就像你的情况一样,你仍然可以这样做,然后执行 git push --force origin the_branch,但不推荐这样做,因为你可能会惹恼其他人在这个项目上工作。您应该改为遵循 #3。

3) 我已经推送了,我正在和其他人一起工作:

如果我有: A B C D 我想删除 C 和 D。

然后做

git revert sha_of_D

请注意,您可能必须在此处解决冲突,然后再提交。 然后做

git revert sha_of_C

请注意,您可能必须在此处解决冲突,然后再提交。

这导致:

A---B---C---D---Reverted_D---Reverted_C

推送是安全的,因为您实际上只是添加了一个提交来反转所有 C 和 D 的更改,实际上是删除它。

除非绝对必要,否则您通常应该不惜一切代价避免执行 git push --force。但是,如果您要执行推送操作,使用保护,那么在执行此操作之前,您绝对应该复制您的分支。如果您已经完全 push ,那么坚持#3 通常是一个很好的规则。

希望这对您有所帮助。

关于git - 如何删除对 git 的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959520/

相关文章:

git - 如何在 Perforce 中交互式添加文件(相当于 `git add -p` )

git - IntelliJ 错误 : branch 'origin/HEAD' does not point at a commit, 无法读取某些引用

Xcode merge : How to click "Left then right" button?

git 命令行多重身份验证

Git 提交而无需暂存

带有日期的 git ls 文件?

2 个分支的 Github 比较 View 不正确?

git - 运行 "git log"未出现提交历史记录

git - GitHub 是否计算您在组织的私有(private)存储库中所做的提交

git - github API 提交状态 "failure"和 "error"之间的差异?