使用git删除提交


Removing a commit with git

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to delete a 'git commit'

我刚加入Git,遇到了一个需要帮助的情况。我克隆了一个远程存储库到我的个人电脑上,然后打开了一个新的分支"meir"。

出于实践目的,我首先提交了一些我在文件上所做的更改。之后,我按照我希望的方式更改了文件,并再次提交。然后我将本地分支推送到远程存储库。

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

  • 删除本地和远程存储库上的远程"meir"分支并重新启动。
  • 只删除第一次提交,然后再次将分支推送到服务器,这样它也将丢失第一次提交。
  • 我需要运行什么命令来实现每个选项?

    谢谢,梅尔


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

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

  • 使用git-rebase-i将第一个提交压缩为第二个提交,以便本地分支设置远程分支的方式。
  • 使用git push-f(具有适当的分支规范)来"强制推"到远程分支。没有-f的普通Git推会抱怨推不是一个快进推,并拒绝它。
  • 另一种选择是使用git push origin :meir删除远程分支"meir",使用git rebase -i重新购买本地存储库,然后按正常方式推送。


    有多种方法可以做到这一点,但是没有一种是推荐的所以,使用它们的风险由你自己承担。

    推动其中一项承诺

    使用REBASE

    如果您有两个承诺,希望只推动其中一个,这不是最新的一个。

  • git reset–hard<2nd commit id>
  • Git推送
  • git reset–hard<1st commit id>
  • 这样,只会推送对应于第二个提交ID的更改,而不会推送您最近的提交。

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

  • Git日志-注意提交ID在53259B225之前。让我们说是XXXXXXX
  • Git钢筋-I XXXXXXXX
  • 在打开的编辑器中,您应该看到两行代表您的提交53259B225和227552392,类似于

    选择227552392 blah blah选择53259B225 blah blah

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

    选择53259B225 blah blah选择227552392 blah blah

    然后保存文件。

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

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

  • git-rebase——在启动交互式的rebase之前,中止将您带回到流的样子。
  • 使用壁球

  • 执行"git-log"并注意头部提交(列表中的第一次提交),并注意更改的"基本提交"(在(及时)替换第一次提交之前的提交)。确保添加索引中没有文件。
  • 执行"git reset--hard"(使用此命令时要小心;请确保以上步骤)。
  • 执行"git merge--squash"-这将撤销提交,并且所有提交的文件都将被暂存。
  • 执行"Git状态"等操作,并验证预期的更改是否在索引(和工作树)中。
  • 如果您不想推任何文件,请执行git reset head或如果要对这些文件进行更改,请进行这些更改并将其阶段化。
  • 执行"git commit-m"""。
  • 如您所见,这还可以用于将少量提交合并为一个提交。