我只想删除git日志中间的特定提交。它不应该受到上述提交的影响。
答案 0 :(得分:9)
它不应该受到上述提交的影响。
如果从分支中间删除提交,或者除了可能是分支的HEAD之外的任何地方,您将重写该分支的历史记录。这是因为用于实现此目的的工具,即git rebase -interactive
和git filter-branch
,需要重新提交删除后提交的所有内容。对于公共共享分支来说,这通常是不可取的,因为它迫使每个人采取相当严厉的措施来跟上这一变化。
相反,更安全的选择是使用git revert
:
git revert <SHA-1 of commit to delete>
这将在您的分支顶部添加一个 new 提交,这有效地撤消了中间提交所做的一切。
顺便说一句,如果确实想删除该提交,我建议您进行交互式rebase。
答案 1 :(得分:7)
如果未将提交推送到远程服务器,则可以使用git rebase
修改git历史记录。
你可以这样做:
git rebase -i commit-hash^
它将显示提交列表。第一行应该是您要删除的提交。从您编辑,保存和关闭的文件中删除该行。
如果您在执行此操作之前确实已推送到远程服务器,请注意,刚刚删除的提交之后的提交将根据您刚刚从历史记录中删除的提交之前的提交进行重写。出于这个特殊原因,所有提交都会更改,因为您的历史记录只是分歧。因此,如果你试图推动它,它将不会快进,你将不得不强迫推动。
出于这个原因,如果你不熟悉git rebase
我建议保留一个分支指向你正在修改历史的分支,以防出现问题。
此外,如果跨多个分支共享该特定提交,则分散一个分支的历史记录将导致多个问题,因为您将无法轻松地将旧历史记录中的一个分支合并到新历史记录中的分支。它将复制许多提交,并且您在一个分支中删除的提交不会在其他分支中删除。
想想它已经修改了git历史就像时间旅行。一点上的任何更改都会创建一个新的并行Universe。过去发生变化后的所有事情都会受到您过去所做的改变的影响。
答案 2 :(得分:0)
如果您使用的是 IntelliJ
假设你的分支 X 是这样的
commit [A] <-- 最后一次提交
提交 [B]
提交 [C]
提交 [D]
并且您想删除 2 个提交 B 和 C。
1- 使用 git log 对话框右键单击 commit D(在您要删除的那个之前的最后一次提交)并从中创建一个新分支,将其命名为 Y,intellij 将在分支 Y 处自动结帐
3- 您可以在 git log 对话框的左栏中看到您的分支,右键单击分支 X 并选择与当前比较
现在你会看到这个对话框
4- 您可以右键单击 commit A 并选择 Cherry-pick
现在在分支 Y 中,您已提交 A 和 D,解决冲突,提交和推送。