比较使用checkout或重置难以撤消git commit

时间:2012-01-03 07:45:47

标签: git reset git-checkout

如果我使用:

$ git reset --hard HEAD~N

$ git checkout HEAD~N

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

如果这两个命令有任何不同之处?
感谢。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

  • git reset --hard会将当前分支HEAD重置为指定的refspec
  • git checkout将切换分支,并让您进入detached head mode

所以第一个,您可以立即开始提交,在您当前的分支中 对于第二个,您需要先定义一个分支,您(先前)当前分支HEAD尚未移动。只更改了工作目录。而且你不再在任何分支中(因此是“分离模式”)。

答案 2 :(得分:2)

第一个将更改分支以指向您指定的提交。除非有另一个对它们的引用(分支或标记),否则将丢失那个之前的提交。有一个reflog(git reflog)可以保存已检出的内容的历史记录(默认情况下会保留最后90天的值)

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

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