【问题标题】:Lost recent files after a "checkout"“结帐”后丢失最近的文件
【发布时间】:2020-08-03 04:56:38
【问题描述】:

我对文件 a.py 进行了一些更改,并创建了两个新文件 b.py 和 c.py,然后提交了更改,但收到了警告:

The Git repository at the following path is in the detached HEAD state

我忽略了它并提交了更改。让我们将此提交称为提交 X。

然后我进行了结帐并繁荣,a.py 和 b.py 文件消失了,我对 a.py 所做的更改也消失了。现在提交 X 不会显示在提交列表中。

我只有一个 master 分支,所以这不是因为我在不同的分支。

我不懂 Git,我正在使用 PyCharm 的图形界面。如何取回文件?

【问题讨论】:

标签: git pycharm checkout


【解决方案1】:

通常你会签出你想要处理的分支名称,例如:

git checkout master
git checkout develop

但您也可以使用其 SHA1 哈希检查特定提交:

git checkout 54e8cd9354

这样做时,您处于分离状态,这基本上意味着您的下一次提交不会添加到现有分支的末尾

您可以通过这种方式检查您的最后一次提交:

git log -1

【讨论】:

    【解决方案2】:

    您处于分离的 HEAD 状态,这意味着您处于与此类似的状态,其中 HEAD 没有指向任何引用:

    A <--master
    |
    B <--HEAD
    |
    C
    

    然后您添加了一些文件并提交了它们,如下所示:

    touch new_file.txt
    
    git add new_file.txt
    
    git commit -m "your detached HEAD commit"
    

    那时,你的树是这样的:

    master --> A  
               |  D <--HEAD
               |  |
               B / 
               |
               C
    

    由于 D 没有指向分支或其他引用(您被“分离”),当您再次签出 master 时,git 无法引用 D,因此它“丢失”了:

    A <--master (HEAD)
    |
    B 
    |
    C
    

    要查找 D,请使用 git reflog 并查找如下内容:

    0abce (HEAD -> master) HEAD@{0}: checkout: moving from b214e to master
    b214e HEAD@{1}: commit: your detached HEAD commit
    

    be14e 是您要查找的提交的名称,因此git checkout be14e 可以再次获取此文件(您也可以将文件直接git checkout 导入主文件,但这是另一回事):

    master --> A  
               |  D <--HEAD
               |  |
               B / 
               |
               C
    

    现在您可以查看丢失的文件。此时您可能应该创建一个分支,以便在切换分支时您的文件不再丢失。所以请git checkout -b new_branch 得到这个:

    master --> A  
               |  D <--new_branch (HEAD)
               |  |
               B / 
               |
               C
    

    【讨论】:

    • 我的文件回来了!非常感谢您的解决方案和课程!我不希望这种情况再次发生。当我意识到我处于一个超然的头脑中并且我的本地项目中仍然有当前文件时,我应该做些什么吗?我应该以某种方式连接头部吗?
    • @multigoodverse 是的,当发生这种情况时,您想“重新附加” HEAD。您可以使用 git checkout -b new_branch 在分离的 HEAD 所在的位置创建一个新分支。如果您处于分离 HEAD 状态但尚未提交任何内容,例如在第一个图中 HEAD 在 B 上且 master 分支提示在 A 上,您可以使用 git checkout master 将 HEAD 移动到 master。然后你的下一个提交将由 master 跟踪。基本原则是您希望分支指向 HEAD(换句话说,您希望 HEAD 被“附加”)。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多