关于Git:Git – Undo推送提交


Git - Undo pushed commits

我在远程存储库中有一个项目,与本地存储库(开发)和服务器一(prod)同步。我已经做了一些已提交的更改,这些更改已被推到远程并从服务器中提取。现在,我要撤消这些更改。所以我可以在更改前提交并提交新的更改,但我猜将有问题再次将它们推到远程。我该怎么办有什么建议吗?


您可以使用以下命令恢复单个提交:

1
git revert <commit_hash>

这将创建一个新的提交,该提交将还原您指定的提交的更改。请注意,它只恢复特定的提交,而不在这之后进行提交。如果要恢复一系列提交,可以这样做:

1
git revert ..<latest_commit_hash>

它在指定的提交之间(包括指定的提交)恢复提交。

有关git revert命令的更多信息,请查看git revert手册页。另请查看此答案以了解有关恢复提交的更多信息。


不留"撤消"痕迹的解决方案。

注意:如果有人把零钱拿出来了,不要这样做。(我只在我的个人回购中使用)

做:

1
git reset [cc]

这将在本地重新签出所有更新(因此Git状态将列出所有更新的文件)

然后您"完成您的工作"并重新提交您的更改(注意:此步骤是可选的)

1
git commit -am"blabla"

此时,您的本地树与远程树不同

1
git push -f <remote-name> <branch-name>

将推送并强制远程考虑此推送并删除上一个推送(指定远程名称和分支名称不是必需的,但建议避免使用更新标志更新所有分支)。

!!小心一些标记可能仍然指向删除的提交!!如何删除远程标记


在这些情况下,我要做的是:

  • 在服务器中,将光标移回上一次已知的良好提交:

    1
    git push -f origin <last_known_good_commit>:<branch_name>

  • 在本地执行相同的操作:

    1
    2
    3
    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional

请参阅我为此创建的分支my_new_branch的完整示例:

1
2
$ git branch
my_new_branch

这是在添加了一些东西到myfile.py之后的最新历史:

1
2
3
4
5
6
7
8
9
10
11
12
$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

我想摆脱上一次提交,它已经被推送,所以我运行:

1
2
3
4
$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

好极了!现在,我看到在该提交上更改的文件(myfile.py显示在"not staged for commit"中:

1
2
3
4
5
6
7
8
9
10
11
$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use"git add <file>..." to update what will be committed)
  (use"git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use"git add" and/or"git commit -a")

因为我不想做这些更改,所以我只需要将光标移回本地:

1
2
$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

所以现在head在前面的commit中,包括本地和远程:

1
2
3
4
5
6
$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit


如果您通过git命令行执行下面给出的步骤,那么可以在本地和远程恢复(或者也可以称之为删除)git提交。

运行以下命令查看要还原的提交ID

1
git log --oneline --decorate --graph

你会看到下面的截图enter image description here

如果您还检查了远程(通过Web界面),那么您可以看到如下所示

氧化镁

根据当前的屏幕截图,您处于提交ID E110322上,但是您希望在本地和远程恢复到030BBF6。

执行以下步骤以本地+远程删除/还原提交

首先本地还原为提交ID 030BBF6

1
git reset --hard 030bbf6

然后

1
git clean -f -d

这两个命令clean force reset to commit stage 030BBF6,如下快照所示

氧化镁

现在如果你跑步Git状态,然后您将看到远程分支后面有两个提交,如下所示氧化镁

运行以下命令更新索引(如果有任何更新)。建议您要求所有开发人员不要接受主远程分支上的任何请求。

1
git fetch --all

完成后,您需要使用分支前面的+符号强制执行此提交,如下所示。我在这里做过总分行,你可以用任何

氧化镁代码

1
git push -u origin +master

现在,如果您看到远程的Web界面,那么提交也应该被恢复。

enter image description here


1
git revert HEAD -m 1

在上面的代码行中。"最后一个参数表示"

  • 1-恢复一个承诺。

  • 2-恢复最后两次提交。

  • n-还原最后n个承诺。

您需要在这个命令之后按下才能在远程上生效。您还有其他选项,比如指定要恢复的提交范围。这是一种选择。

以后使用git commit -am"COMMIT_MESSAGE"。然后是git pushgit push -f