【问题标题】:Compare about using checkout or reset hard to undo git commit比较使用 checkout 或 reset hard to undo git commit
【发布时间】:2012-01-03 07:45:46
【问题描述】:

如果我使用:

$ git reset --hard HEAD~N

$ git checkout HEAD~N

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

如果这两个命令有什么不同?
谢谢。

【问题讨论】:

  • 阅读更多关于重置的信息:progit.org/2011/07/11/reset.html
  • 谢谢!这篇文章很有帮助。我已经阅读了它并明确了一些概念。我的帖子是错误的,不是reset hardcheckout 都在清理工作目录,reset 覆盖它并checkout 合并它。

标签: git reset git-checkout


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    • git reset --hard 会将当前分支 HEAD 重置为指定的 refspec
    • git checkout 将切换分支,并将您留在detached head mode

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 2011-02-02
        • 2017-12-10
        • 2011-09-06
        • 2011-07-04
        • 2018-01-13
        相关资源
        最近更新 更多