【问题标题】:Git revert several commitsGit 还原几个提交
【发布时间】:2016-11-01 14:36:35
【问题描述】:

我已经对我的本地分支estimation 进行了几次提交,并将它们推送到远程分支estimation

现在,我想完全删除最后 3 个提交。

我尝试执行 git reset HEAD^git reset HEAD --hard 3 次,但是当我尝试推送更改时,它抱怨 HEAD 的尖端未对齐。

我该怎么做?

编辑:

历史如下:

commit e572aab4e18

commit e21e7310bc4

commit 4f372a513da

commit 31a4ac607ae

commit a1a6e3f02dd

我想删除前 4 个并返回到 commit a1a6e3f02dd 并在同一个 HEAD 上创建本地和远程分支。

【问题讨论】:

标签: git git-reset git-revert


【解决方案1】:

您可以通过三个命令来完成:

首先,重写远程分支的历史:

git push origin +a1a6e3f02dd:estimation

请注意,“+”会使其成为“强制推送”。此命令说“强制 a1a6e3f02dd 成为原点/估计分支的尖端。”

完成后,您只需将本地“估计”分支与远程分支同步即可:

git checkout estimation
get reset --hard origin/estimation

你就完成了!但请注意:“git reset --hard”会炸毁您在该项目中未提交的任何工作。

如果其他人也在使用“估计”分支,并且他们已经将你的 4 个“坏”提交拉到他们的分支中,那么就会出现一些协调混乱。但是根据我的经验,所有关于“永远不要重写共享分支的历史”的警告和告诫都被夸大了。应该重申:永远不要重写长期存在的共享分支的历史记录。

【讨论】:

    【解决方案2】:

    如果您已经推送了提交(并且不想强制推送并覆盖远程存储库中的数据,您可以做几件事):

    您可以使用git revert 代替git reset

    $ git revert ~4..HEAD
    

    或者您可以使用git checkout 然后提交更改:

    $ git checkout ~3 -- .
    $ git commit
    

    git revert 将执行 3 次单独的还原提交。 git checkout 方法将允许您在一次提交中恢复更改。

    在你的情况下,你可以这样做:

    $ git reset --hard $REMOTE/$BRANCH
    $ git checkout a1a6e3f02dd -- .
    $ git commit
    

    【讨论】:

    • 谢谢米帕迪。我有点困惑,所以我提供了更多信息。你能看一下吗
    • @chintans:更新了我的答案。
    • 谢谢,但现在我的分支是 a1a6e3f02dd,但我想完全删除所有 4 个提交,所以我的本地远程分支都指向 a1a6e3f02dd
    • @chintans:由于您已经在本地进行了重置,因此您必须重置为远程分支的 HEAD,然后执行 git checkoutgit commit。答案已更新。
    • 他想通过强制推送改写历史。他不想在他现有的历史记录之上添加 4 个新的“还原”提交。 p.s.我建议使用“git rebase -i”将一系列还原压缩为单个提交。
    【解决方案3】:

    首先:您应该只对您不共享的分支执行此操作;如果分支被其他人签出,此过程将使他们的本地副本与远程不同步,他们将无法再将提交推送到分支。这可以解决,但它可能是一团糟。

    鉴于此,如果我的理解正确,您处于这种情况:

    xxxxxxx Bad commit #3
    yyyyyyy Bad commit #2
    zzzzzzz Bad commit #3
    wwwwwww This and everything before it are fine
    

    您想在wwwwwwww 之后删除提交并修复远程分支以匹配。

    首先,备份您正在对其进行手术的分支,以便在出现问题时可以恢复它,然后切换回您要从中删除提交的分支。

    git checkout -b broken-estimation
    git checkout estimation
    

    运行 git log 以查找您要保留的第一个提交的 SHA1。获得 SHA1 后,将分支重置为:

    git reset --hard kkkkkkk
    

    kkkkkk 是您要保留在分支上的第一个提交的 SHA1。

    再次运行git log 以确保您已获得所需的SHA1 作为此分支的尖端;它应该是您在git log 输出中看到的第一个提交。如果您没有修剪足够的提交,请使用正确的 SHA1 重做 git reset --hard 以删除更多提交。

    如果您删除了太多次提交,请从备份中恢复estimation 分支:

    git checkout -B estimation broken-estimation
    

    并重做git log 以在提示处找到您想要的提交的 SHA1,然后是 git reset --hard kkkkkkkkkkkkkk 是您实际想要的 SHA1)以删除该提交后不需要的提交。

    一旦您的分支处于所需状态,您就可以将固定分支推送到远程,替换旧版本:

    git push -f the_proper_remote estimation
    

    一旦你确定你的修复是正确的,你可以删除分支的备份副本:

    git branch -d broken-estimation
    

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 2013-07-31
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多