我该如何从本地仓库撤销这些提交?
我的情况是我将代码提交并推送到了错误的分支,因此我想要把所有修改都拿回来,这样我就可以将它们提交到一个新的正确的分支中。所以我执行了以下操作:
在你提交和推送的同一个分支上,如果你输入“git status”命令,你看不到任何新的内容,因为你已经提交和推送了。现在输入以下命令:
git reset --soft HEAD~1
这将把所有更改(文件)放回到暂存区,现在要将它们放回工作目录(取消暂存),只需键入:
git reset FILE
“File”是您想要再次提交的文件。现在,此文件应该位于工作目录(未暂存)中,并带有您进行的所有更改。现在,您可以切换到任何您想要的分支并提交该分支中的更改。当然,您最初提交的分支仍然具有所有更改,但在我的情况下,这没问题。如果对您来说不行,您可以寻找在该分支中撤销该提交的方法。
撤销上一个提交:
git reset --soft HEAD^ or git reset --soft HEAD~
这将撤销最近的提交。
这里的--soft
表示重置为暂存区。
HEAD~或HEAD^
表示移动到HEAD之前的提交。
将最近的提交替换为新的提交:
git commit --amend -m "message"
它将用新的提交替换最后一次提交。
假设你在本地提交了错误的内容并将其推送到远程仓库。你可以使用以下两个命令来撤消这个错误:
首先,我们需要通过回退到我们想要的提交来纠正我们的本地仓库:
git reset --hard <previous good commit id where you want the local repository to go>
现在我们可以使用以下命令强制将此良好提交推送到远程存储库:
git push --force-with-lease
使用带有'with-lease'选项的force命令可以防止意外删除您不知道的新提交(即自上次拉取以来来自另一个源的提交)。
每个人的评论都很复杂。
如果你想从你的分支中移除最后一次提交,最简单的方法是:
git reset HEAD~1
git reset --hard HEAD~1
现在,为了实际推送那个更改以消除你最后的提交,你需要执行以下操作:
git push --force
就这样了。这将删除你的最后一次提交。
VISUAL STUDIO 用户(2015等)
如果你不能在 Visual Studio 中进行同步,因为你没有权限推送到类似“开发”这样的分支,那么无论我如何尝试,在 Visual Studio 中,回滚和重置(硬重置或软重置)都不会起作用。
根据获得大量赞同票的答案:
在项目根目录的命令提示符中使用以下命令,清除任何将尝试被推送的内容:
git reset --hard HEAD~1
备份或压缩文件,以防止您不希望丢失任何工作等...
在之前的回答中提到了与Git相关的命令,我想与所有读者分享我的典型Git工作流程,这可能会有所帮助。下面是我如何使用Git:
第一次从远程服务器克隆
git clone $project
从远程拉取(当我没有等待推送的本地提交时)
git pull
将新的本地file1
添加到$to_be_committed_list
中(只需想象$to_be_committed_list
表示staged
区域即可)
git add $file1
从$to_be_committed_list
中删除错误添加的file2
(假设像第3步一样添加了该文件,但我不想要它)
git reset $file2
提交在$to_be_committed_list
中的file1
git commit -m "提交消息描述"
在推送之前将本地提交与远程存储库同步
git pull --rebase
解决冲突时,先预设合并工具
git mergetool #在这里解决合并问题,也可以手动合并
添加已解决冲突的文件,比如file1
:
git add $file1
继续上一个rebase
命令
git rebase --continue
推送准备好且已同步的本地最后一次提交
git push origin head:refs/for/$branch #分支=master、dev等
git reset --soft HEAD~1
重置会将当前HEAD分支回滚到指定的修订版本。在我们上面的例子中,我们想回到当前修订版本之前的那个版本 - 有效地撤消了我们最后一次提交。
请注意--soft标志:这可以确保未做的修订中的更改被保留。运行命令后,您将在工作副本中找到更改为未提交的本地修改。
如果您不想保留这些更改,只需使用--hard标志。请务必只在确定不再需要这些更改时才这样做。
git reset --hard HEAD~1
git reset --hard HEAD~1
git reset --hard HEAD~2
...
git reset --hard HEAD~n
要删除特定提交后的所有内容:
git reset --hard <commit sha>
e.g.,
git reset --hard 0d12345
使用"硬重置"要小心:它将删除你仓库中的本地更改,并恢复到前面提到的上一个提交。只有在你确信你弄糟了你最后一次提交并想要回到之前的状态时,才应该运行此命令。
顺便说一下,在提交哈希中约7个字母就足够了,但对于大型项目,您可能需要多达12个字母才能确保其唯一性。您也可以使用整个提交SHA。
以上命令在GitHub for Windows中同样适用。
git reflog
已经接近你所描述的内容,但它给用户更多的控制权来确定需要(撤销)做的事情。但是请注意,“撤销”在各个地方的工作方式不同,人们会期望这个功能实现许多不同的事情。撤销上一个提交?撤销上一个操作?如果最后一个操作是推送,如何撤销,(重置并推送)还是(撤销并推送)? - Romain Valeri