我该如何从本地仓库撤销这些提交?
我更喜欢使用git rebase -i
来完成这个任务,因为它会弹出一个漂亮的列表,我可以在其中选择要摆脱的提交。它可能不像其他答案那样直接,但只是感觉正确。
选择您想要列出的提交数量,然后像这样调用(以列出最后三个)
git rebase -i HEAD~3
示例清单
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support
然后Git会删除你删除的任何行的提交记录。
使用git-gui(或类似工具)执行 git commit --amend
。从GUI中,您可以添加或删除单个文件到提交中。您还可以修改提交信息。
只需将分支重置到上一个位置即可(例如,使用 gitk
或 git rebase
)。然后从保存的副本重新应用更改。在本地存储库的垃圾回收之后,它将像不需要的提交从未发生过一样。要在单个命令中执行所有操作,请使用 git reset HEAD~1
。
警告: 粗心使用 git reset
是让您的工作副本进入混乱状态的好方法。如果可能的话,我建议Git新手避免使用此功能。
执行反向cherry pick(git-revert)以撤消更改。
如果您还没有将其他更改拉到分支上,只需...
git revert --no-edit HEAD
然后将您更新的分支推送到共享存储库。
提交历史将单独显示这两个提交。
还要注意:如果可能有其他人正在处理该分支,则不要执行此操作。
git push --delete (branch_name) ## remove public version of branch
清理您本地的分支,然后重新提交...
git push origin (branch_name)
通常情况下,您可能不需要担心私有分支提交历史记录是否完整无缺。只需推送一个后续提交(请参见上文的“如何撤消公共提交”),然后稍后执行压缩合并以隐藏历史记录即可。
gitk --all $(git reflog | cut -c1-7)&
可能会有所帮助。 - Brent Bradburngit reset
。 - Jhericogit push origin (branch_name) --force
命令完成。 - Brent Bradburn如果您想永久撤消操作,并且您已经克隆了某个代码库。
可以通过以下方式查看提交ID:
git log
然后你可以这样做:
git reset --hard <commit_id>
git push origin <branch_name> -f
git reset --hard
撤销最近的更改,但如果您需要永久删除最后的 "n" 个提交记录,则需要指定一个 SHA。 - poorva如果您已经提交了代码更改但是还没有推送。
git reset --soft HEAD~1
HEAD~1是指当前提交之前的快捷方式。如果需要重置,您也可以引用哈希值的SHA-1。使用--soft选项将删除提交但会保留所有已更改的文件作为“要提交的更改”,就像git状态所描述的那样。
如果要消除自上一次提交以来工作目录中任何跟踪文件的更改,请使用"--hard"。
或者
如果您已经推送并有人拉取了代码(通常是我),则无法使用git reset。不过,您可以使用git revert。
git revert HEAD
这将创建一个新的提交,它会撤销意外提交引入的所有更改。
git log --stat
或git reflog
显示的实际哈希值,而不是HEAD~1
- 当您需要“撤消”多个提交时非常有用。 - ccpizzagit revert
或者:
git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
git reset --soft 'HEAD^'
撤消最后一次本地提交的效果非常好!
“将工作树重置为上一个提交”
git reset --hard HEAD^
"清理工作树中的未知文件"
git clean
参见-Git快速参考
注意:这个命令会删除你之前的提交记录,因此请谨慎使用!git reset --hard
更安全。
git reset --hard
有什么不同之处? - Hashim Aziz如何撤销最后一次 Git 提交?
要将所有内容恢复到最后一次提交之前的状态,我们需要重置为 HEAD 前面的提交。
如果您不想保留所做的更改:
git reset --hard HEAD^
如果您想保留您所做的更改:
git reset --soft HEAD^
现在检查一下你的 git 日志。它会显示我们最后一次提交被删除了。
使用reflog查找正确的状态
git reflog
重置前的Reflog
选择正确的Reflog(在我的情况下是f3cb6e2),并键入
git reset --hard f3cb6e2
此后,仓库 HEAD 将被重置为该 HEADid。 重置后的日志
最后,引用日志将会像下面的图片一样。
引用日志最终结果
git reflog
已经接近你所描述的内容,但它给用户更多的控制权来确定需要(撤销)做的事情。但是请注意,“撤销”在各个地方的工作方式不同,人们会期望这个功能实现许多不同的事情。撤销上一个提交?撤销上一个操作?如果最后一个操作是推送,如何撤销,(重置并推送)还是(撤销并推送)? - Romain Valeri