比较使用签出或重设难以撤消git提交

比较使用签出或重设难以撤消git提交,git,reset,git-checkout,Git,Reset,Git Checkout,如果我使用: $ git reset --hard HEAD~N 或 两者都将使用HEAD~N的版本来更改工作目录和后台区域 这两个命令之间是否有任何不同? 谢谢。 git reset--hard将当前分支头重置为指定的refspec git checkout将切换分支,并将您留在 因此,对于第一个分支,您可以立即在当前分支中开始提交。 对于第二个分支,您需要首先定义一个分支,您(以前)当前的分支头还没有移动。只更改了工作目录。并且您不再处于任何分支中(因此称为“分离模式”)。git che

如果我使用:

$ git reset --hard HEAD~N

两者都将使用
HEAD~N
的版本来更改工作目录和后台区域

这两个命令之间是否有任何不同?
谢谢。

  • git reset--hard
    将当前分支头重置为指定的refspec
  • git checkout
    将切换分支,并将您留在
因此,对于第一个分支,您可以立即在当前分支中开始提交。

对于第二个分支,您需要首先定义一个分支,您(以前)当前的分支头还没有移动。只更改了工作目录。并且您不再处于任何分支中(因此称为“分离模式”)。

git checkout HEAD~N用于检查提交,而不进行处理,因为它将创建分离的HEAD状态。如果要将(当前分支头)重置为特定的提交,请使用git reset[--hard]

第一个将更改分支以指向指定的提交。在此之前的提交将丢失,除非有其他引用(分支或标记)。有一个reflog(git reflog)可以保存签出内容的历史记录(默认情况下,它会保存最后90天的值)

第二个将切换到您指定的分支。由于您指定了提交而不是本地分支,因此将不会跟踪您在此处提交的任何更改。除了reflog之外,在执行除当前提交或头之外的后续签出时,将丢失在第一次签出之后进行的这些提交


可以“撤消”工作的第三种方法是在第二个命令后放置“-.”。这会将工作树更改为指定提交时文件所在的状态。您仍将签出相同的分支,并且它仍将指向相同的提交。当您运行“git status”时,您将看到工作目录中的所有更改看起来都像您编辑的文件,与您指定的提交中的文件相同。提交这些更改将进行一次新的提交,如果指定的一次提交,该提交将有效地“撤消”后续提交的内容。您当前的分支现在将指向此提交。如果其他人可能依赖于您希望有效删除的提交,这是一个很好的做法。

阅读有关重置的更多信息:谢谢!这篇文章很有帮助。我读过了,把一些概念讲清楚了。我的帖子是错误的,
reset hard
checkout
并不是都在清理工作目录,
reset
覆盖它和
checkout
合并它。
$ git checkout HEAD~N