Git - Undo pushed commits
我在远程存储库中有一个项目,与本地存储库(开发)和服务器一(prod)同步。我已经做了一些已提交的更改,这些更改已被推到远程并从服务器中提取。现在,我要撤消这些更改。所以我可以在更改前提交并提交新的更改,但我猜将有问题再次将它们推到远程。我该怎么办有什么建议吗?
您可以使用以下命令恢复单个提交:
1 | git revert <commit_hash> |
这将创建一个新的提交,该提交将还原您指定的提交的更改。请注意,它只恢复特定的提交,而不在这之后进行提交。如果要恢复一系列提交,可以这样做:
1 | git revert ..<latest_commit_hash> |
号
它在指定的提交之间(包括指定的提交)恢复提交。
有关
不留"撤消"痕迹的解决方案。
注意:如果有人把零钱拿出来了,不要这样做。(我只在我的个人回购中使用)
做:
1 | git reset [cc] |
这将在本地重新签出所有更新(因此Git状态将列出所有更新的文件)
然后您"完成您的工作"并重新提交您的更改(注意:此步骤是可选的)
1 | git commit -am"blabla" |
。
此时,您的本地树与远程树不同
1 | git push -f <remote-name> <branch-name> |
将推送并强制远程考虑此推送并删除上一个推送(指定远程名称和分支名称不是必需的,但建议避免使用更新标志更新所有分支)。
!!小心一些标记可能仍然指向删除的提交!!如何删除远程标记
在这些情况下,我要做的是:
在服务器中,将光标移回上一次已知的良好提交:
1git push -f origin <last_known_good_commit>:<branch_name>。
在本地执行相同的操作:
1
2
3git reset --hard <last_known_good_commit>
# ^^^^^^
# optional
请参阅我为此创建的分支
1 2 | $ git branch my_new_branch |
。
这是在添加了一些东西到
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) |
。
好极了!现在,我看到在该提交上更改的文件(
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 |
号
你会看到下面的截图。
如果您还检查了远程(通过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界面,那么提交也应该被恢复。
。
1 | git revert HEAD -m 1 |
。
在上面的代码行中。"最后一个参数表示"
1-恢复一个承诺。
2-恢复最后两次提交。
n-还原最后n个承诺。
您需要在这个命令之后按下才能在远程上生效。您还有其他选项,比如指定要恢复的提交范围。这是一种选择。
以后使用