【问题标题】:How to return an undone commit in GitHub如何在 GitHub 中返回未完成的提交
【发布时间】:2016-09-27 15:14:36
【问题描述】:

我已经完成了我的项目并想使用 GitHub Desktop 提交它。

在提交我的第一次提交时,我知道我不希望一个文件夹出现在该提交中,因此我单击了“还原”按钮。然后我发现我的项目存储库是空的!我尝试点击“撤消最近的提交”按钮返回我的文件。

所以现在我既没有文件也没有提交(我没有发布任何东西)。

Git log 和 git reflog 显示我没有任何提交。

我怎样才能找回我的项目?

抱歉,我刚开始使用 Git,解释不清楚。

【问题讨论】:

  • 表示当前分支master还没有提交
  • @AD7six,我使用的是 Windows。我本能地做每一件事。在它工作之前 =(

标签: git undo github-for-windows


【解决方案1】:

呻吟

我真的不喜欢这些回答说:“我不知道如何解决它,所以你显然已经失去了一切,以后要多加小心”

仅仅因为您不知道如何做某事并不意味着您应该说这是不可能的!这实际上有点无益,因为如果事情是可能的,而您只是不知道,那么您就是在散布谎言:P。

可能的方法

无论如何,像这样的情况很可能是惯用的,所以可能没有一个命令可以始终如一地工作。但您可以尝试以下方法:

备份

在你做任何事情之前使用cp -r创建repo目录的备份

git 工作原理概述

现在,git 在垃圾收集之前不应该放弃任何提交:我认为必须手动完成。这意味着,希望您的提交存在。只是你没有引用旧的master

您可能需要查看https://git-scm.com/book/en/v2/Git-Internals-Git-Objects 以了解 git 对象模型。 “tl;dr”是 git 存储库是一棵带有指针的大树。这些指针是 sha 引用。

你可能很幸运

git reflog 文件通过查看.git/logs 起作用,在我的情况下,我设法删除了文件.git/logs/refs/heads/master 文件。但是文件.git/logs/head 仍然存在,所以我可以找到对我之前分支的引用。

允许我运行git reset --hard COMMIT_FOUND_IN_FILE

管道命令git show-ref 也引用了我旧分支的sha。

或者你可能需要努力工作

即使在没有这些线索的情况下,技术上也可以找到 git dag 的叶子,这些叶子中的一片将成为你的旧分支。

命令git rev-list --objects --all 显示你空闲的每个对象,git cat-file 可以检查这些对象。

git rev-list --objects --all --graph 将尝试绘制一些模糊的图形,例如您的提交。我不太确定输出是什么,但第一个结果是我的主人。

【讨论】:

    【解决方案2】:

    运行git reflogs:它会显示你上次提交的sha1。然后你只需要检查你感兴趣的提交,并在上面放置一个分支。

    例如,假设这个命令的第一行是:

    c5e511a HEAD@{0}: checkout: moving from e9c02de51d808c91ac2abbac39166b1daf150452 to origin/master
    e9c02de HEAD@{1}: checkout: moving from c5e511a7b64da6f52c514f770959e48c3b503169 to e9c02
    c5e511a HEAD@{2}: commit: final commit of my project
    

    并说你认识到最后一行代表你感兴趣的提交。然后你可以运行:

    git checkout c5e511a
    git checkout -B master
    

    瞧:你的 master 分支回到了正确的位置。

    请注意,您可能还会发现该命令很有用

    git show <sha1>
    

    因为它将提供有关特定提交的更多信息


    另一方面,如果您删除尚未提交的更改,那么它就会丢失。 在这种情况下,请放心,我知道你的痛苦是什么感觉……好消息是你再也不会犯这个错误了!

    【讨论】:

    • git reflog 说我没有任何提交
    • 您还可以将 reflog 条目指定为 HEAD@{n},如 reflog 中所示。
    【解决方案3】:

    我认为你已经失去了所有的工作:-(并且你将学习 git 的第一条也是最重要的规则:

    “首先,尽可能提交以保存你的工作,然后做任何你想做的事情(修改、变基、合并、重置……)你将永远能够撤消并重试你想做的事情!”

    第二条规则是花 5 分钟了解reflog 命令,以便能够找到一些“丢失”的提交,从而轻松撤消按照第一条规则执行的某些操作。

    这几乎就是你需要的所有东西,再也不会丢失一些使用 git 的工作......

    【讨论】:

      【解决方案4】:

      您还原了所有内容,因为在一切都消失之前没有提交任何内容,我猜

      【讨论】:

      • 需要提交才能恢复工作(最终结果将是 两个 提交)。该操作可能会被术语混淆,但这似乎不太可能回答(或帮助)任何事情。
      • 他丢弃了未提交的东西 imo,我部分同意这无济于事,但这也是一个答案。鉴于 reflog 是空的,我看到的只有一个
      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2017-03-14
      • 2013-05-27
      • 1970-01-01
      • 2014-09-18
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多