【问题标题】:Git checkout - detached head issueGit结帐 - 分离头问题
【发布时间】:2016-12-22 09:29:54
【问题描述】:

我知道这已经在这里讨论了很多。我对 git 及其分支复杂性完全陌生。尽管我浏览了几个线程,但我对其中使用的术语感到不舒服。因此,我正在寻找一些易于理解的逐步帮助。我试图解释我的实际情况以及我在寻找什么。

我有一个名为 css-merge-2016 的分支,从最近几天开始我一直在推送我的提交。现在我需要恢复到特定的提交。我也不想保留我在工作目录中所做的任何更改。如果一切都回到我在特定提交之前的位置,这将有助于我的目的。

我做了git checkout <commit_number>,这表明我在DETACHED HEAD。然后我输入了git checkout css-merge-2016,这是我用来推送更改的分支。但是当我运行 git branch 时,它仍然显示以下内容:

subrara@subrara-desktop:/var/www/localsite.com/local.main.drupal$ git 分支
*(与 f996a78 分离)
css-merge-2016
大师

我再次检查了git checkout <commitnumber>,它不再向我显示DETACHED HEAD 消息,而是说

HEAD 现在位于 f996a78... 已从 customtheme/sass/pages 中删除未使用的 SCSS 文件已删除文件:pages > _home.scss 规则合并到 base/sass/all/pages/_home.scss

我需要我在 f996a78 被丢弃并且我的本地 repo 回到 f996a78 之后所做的所有提交。这是可能吗?如果是,如何?请建议。我完全被卡住了!

更新:

如果我在这个阶段运行git status,我可以看到

HEAD 在 f996a78 处分离
未为提交暂存的更改:
(使用“git add/rm ...”更新将提交的内容)
(使用 "git checkout -- ..." 丢弃工作目录中的更改)

然后是一长串红色文件列表,其中一些标记为modified,一些标记为deleted

【问题讨论】:

    标签: git git-branch git-checkout


    【解决方案1】:

    当您签出提交 f996a78 时,您暂时处于分离的头部状态。这意味着您的 css-merge-2016 分支保持不变,只有指向分支尖端的指针发生变化。如果你真的想摆脱在提交f996a78 之后发生的提交,那么你可以使用git reset --hard

    git reset --hard f996a78
    

    请记住,这可能会导致 f996a78 之后发生的提交在某些时候被删除,并且这些提交将立即不再存在于您的分支中。

    您还应该注意,如果您想将您的分支推送到远程,您现在必须进行强制推送,例如

    git push --force origin css-merge-2016
    

    因为你改写了那个分支的历史。如果css-merge-2016 分支由您以外的任何人共享,您可能希望revert 查询中的提交,而不是使用git revert

    【讨论】:

      【解决方案2】:

      你可以试试

      git reset --hard f996a78
      

      这会将您的工作目录恢复到所需的状态。

      【讨论】:

        【解决方案3】:

        Git

        您的部分问题是关于git 的“分支复杂性”以及您对git 非常陌生。

        git 的有趣之处在于它基本上没有“复杂性”。当然,在您了解各种命令之前,您并不真正知道该做什么,但是内部数据结构以及实际命令都非常“不复杂”(阅读:非常简单)并且简单明了,当然与其他命令相比系统。

        如果你只读过一篇关于git internals 的文档,那么请阅读这篇:http://gitready.com/beginner/2009/02/17/how-git-stores-your-data.html 试着真正理解它告诉你的内容(这并不难,而且信息量也不大)。养成在白板或纸上画“提交树”的习惯。在此之后,您只需要知道各个 git 命令如何修改提交树,您就可以为以后的任何问题做好准备了。

        如果您关闭了该页面,可以添加 https://www.jayway.com/2013/03/03/git-is-a-purely-functional-data-structure/

        回答...

        ...你的问题。虽然在其他地方提到的git reset ... 确实有效,但我更喜欢:

        git branch css-merge-2016_backup css-merge-2016    # just in case...
        
        git branch -f css-merge-2016 f996a78
        git checkout css-merge-2016
        

        然后,您将让您的分支(实际上就是一个指向提交的小“便笺”)指向那个较旧的提交。如果你 100% 确定你已经完成了你的旧东西,你可以删除你的备份分支 (git branch -D)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-22
          • 2013-10-31
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          相关资源
          最近更新 更多