使用 git 删除提交 [重复]

Posted

技术标签:

【中文标题】使用 git 删除提交 [重复]【英文标题】:Removing a commit with git [duplicate] 【发布时间】:2011-11-01 17:23:18 【问题描述】:

可能重复:How to delete a 'git commit'

我是 git 新手,遇到了需要帮助的情况。 我克隆了一个远程存储库到我的 PC,然后打开了一个名为“meir”的新分支。

出于练习目的,我首先提交了对文件所做的一些更改。之后,我按照我想要的方式更改了文件并再次提交。然后我将本地分支推送到远程存储库。

问题是我的第一个提交是一个测试,我不希望它出现在远程服务器上。我想了两种可能的方法来解决它:

    删除本地和远程存储库上的远程“meir”分支并重新开始。 仅删除第一个提交,然后再次将分支推送到服务器,这样它也会丢失第一个提交。

我需要运行哪些命令来实现每个选项?

谢谢, 梅尔

【问题讨论】:

查看这个答案:***.com/questions/1338728/how-to-delete-a-git-commit 【参考方案1】:

一般来说,在您推送到远程存储库中的公共分支后,您不应该更改提交历史记录。这会给从远程存储库中提取/克隆的人带来痛苦。

但如果你真的想这样做,你可以使用交互式 rebase 和强制推送:

    使用 git rebase -i 将第一个提交压缩为第二个提交,以便本地分支 是按照您希望远程分支的方式设置的。 使用 git push -f(使用正确的分支规范)“强制推送”到远程分支。没有 -f 的普通 git push 会抱怨推送不是快进推送并会拒绝。

另一种选择是使用git push origin :meir 删除远程分支“meir”,使用git rebase -i 重构您的本地存储库,然后正常推送。

【讨论】:

【参考方案2】:

有多种方法可以做到这一点,但没有一种是推荐的 因此,使用它们需要您自担风险。

推送其中一个提交

使用变基

如果您有 2 个提交并且希望只推送其中一个,这不是最新的。

    git reset –hard git 推送 git reset –hard

只有与 2nd Commit Id 对应的更改才会被推送,而您的最新提交将不会被推送。

但是,如果必须推送最新的提交而不是第二次提交,则必须先撤消提交

    git log - 记下 53259b225 之前的提交 ID。让我们说它是 xxxxxxxx git rebase -i xxxxxxxx

在打开的编辑器中,您应该会看到两行代表您的提交 53259b225 和 227552392 之类的

选择 227552392 blah blah 选择 53259b225 blah blah

将这两行重新排序,使其看起来像

选择 53259b225 等等等等 选择 227552392 blah blah

然后保存文件。

有了这个,你基本上改变了你的提交顺序。如果您在两次提交中处理不同的文件集,那么这将是一个相对容易的过程。如果没有,那么您可能需要进行一些合并。

如果在任何时候你认为自己搞砸了,那么你可以发出命令

    git rebase --abort 让您回到开始交互式 rebase 之前的流的样子。

使用壁球

    执行“git log”并记下您的 HEAD 提交(列表中的第一个提交)并记下您的更改的“基本提交”(您要替换的第一个提交之前(及时)的提交)。确保添加索引中没有文件。 执行“git reset --hard”(请谨慎使用此命令;确保执行上述步骤)。 执行“git merge --squash” - 这将撤销提交,所有提交的文件都将被暂存。 执行“git status”等操作并验证预期的更改是否在您的索引(和工作树)中。 如果您不想推送任何文件,请执行 git reset HEAD 或 如果您希望对这些文件进行更改,请进行这些更改并暂存它们 执行“git commit -m ''”。

如您所见,这也可用于将几个提交合并为一个。

【讨论】:

以上是关于使用 git 删除提交 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何删除在 git 中错误提交的大文件 [重复]

git:如何使其“意识到”文件已被删除[重复]

从存储库历史记录中删除提交 [重复]

恢复到 Git 中的特定提交 [重复]

编写 git 提交消息时要遵循的标准 [重复]

git aws.push 从服务器中删除动态创建的文件 [重复]