git reset后删除了directort --hard @ {u}

时间:2017-09-26 14:39:01

标签: git

我从github克隆了一个空的repo(让它命名为repoA)并在其中添加了一个目录(命名结果)(所以repoA / results)

然后我做了git add results将结果目录添加到repo中。 然后是git commit -m "add results directory"。最后git push

在推送期间,由于文件太大而导致错误,我忘了删除:

Total 5660 (delta 2779), reused 0 (delta 0)
remote: Resolving deltas: 100% (2779/2779), done.
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 7b1b7d4f8a8e398ef7184a6410f06c66
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File results/quality/R1.linker.fastq is 360.01 MB; this exceeds GitHub's file size limit of 100.00 MB
To https://github.com/XXX/repoA.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: impossible de pousser des références vers 'https://github.com/XXX/repoA.git'

所以我在本地删除了大文件。然后git commit -m "delete big file" 我再次尝试git push,但我遇到了同样的错误。

我尝试git resetgit checkout没有任何影响。

然后我做了git reset --hard @{u}

HEAD is now at 78022b7 Initial commit

但是现在/ results目录从我的计算机上消失了,并没有在github上推送...有什么可以修复我的(愚蠢的)错误。这些结果对我来说很有价值。

非常感谢

  

修改

正如我所建议的那样,我做了git reset 2f6116c

Modifications non indexées après reset :
D   results/benchmarkBlast/benchmarkBlast.R
D   results/benchmarkBlast/benchmark_blast_bowtie_01092017.jpg
D   results/benchmarkBlast/benchmark_blast_bowtie_01092017.pdf
D   results/benchmarkBlast/bowtie2_10000000_1_LTR.txt
D   results/benchmarkBlast/results/BLV/blast_1000000_10_10_BLV.txt
D   results/benchmarkBlast/results/BLV/blast_1000000_10_1_BLV.txt
D   results/benchmarkBlast/results/BLV/blast_1000000_10_2_BLV.txt
etc..

我的目录中仍然没有? D figure / benchmarkBlast / results / BLV / blast_1000000_10_3_BLV.txt

  

修改

我解决了这个问题:

git reset -- results
git checkout -- results

2 个答案:

答案 0 :(得分:1)

TL; DR:创建一个新的分支名称以恢复现有的提交

您可以使用git branch执行此操作。

长解释

  1. "不要惊慌失措" : - )

  2. 在Git中意识到提交 是一个永久的,不可更改的快照,无论你在Git称之为索引暂存区域缓存(同一事物的三个字)。

  3. 每个提交都会记住其先前(或)提交。你做了两次提交(在创建存储库时可能通过GitHub提交了一次,但效果是一样的)。第一个有 no 父级,因为它不能:它是第一次提交。 (我们将此提交称为 root 提交。)

    然后你做了第二次提交,但由于这次提交有一个先前的提交,Git使第二次提交使用第一次提交作为其父提交。如果我们调用第一个提交A - 而不是它的实际名称,一些难以理解的哈希ID,如78022b7... - 并调用第二个提交B(而不是2f6116c...),我们可以画出这样的情况:

    A <-B
    

    提交B2f6116c...)让Git找到提交A78...),因为B存储了A&# 39; s ID。但是Git首先需要某种方式来查找B,因为它们的哈希ID与您提交的顺序没有任何关系。这就是master之类的分支名称的来源:

    A <-B   <-- master
    

    我们说名称master 指向提交B,因为它为我们找到了提交B

    git reset的作用很复杂,但它从移动分支名称开始

    最初,您的存储库中有这两个提交,master指向B,您尝试git push但失败。

    然后你跑了git reset --hard @{u}。这会做三个事情,但让我们先担心第一件事:它会移动分支名称

    提交是永久性的,不可更改的。 git reset不会影响提交,因为无法。但它确实会影响名称 - 在这种情况下master - 因为名称​​不是永久性的,而 是可更改的。

    提交序列A<-B仍保留在您的存储库中,但我们可以稍微改写一下,以便我们可以将master指向A

    A   <-- master
     \
      B   [abandoned]
    

    现在,如果我们是Git并且我们首先查看master,我们会发现提交A并显示它,然后提交A是根提交(没有父母)所以我们停下来。

    提交B仍在那里,没有名字。幸运的是,只要reflog条目保持不变(默认情况下至少30天), reflog (你现在已经看到)保存了它的哈希ID,保存它。

    重置会做一件,两件事或三件事

    请记住上面我说git reset --hard @{u}做了三件事。移动分支名称只是三个中的一个。

    其他两件事git reset可以,--hard可以做到:

    • 重新设置索引。

      索引(也称为暂存区域或缓存)可能最好被描述为&#34;将进入 next 提交的内容&#34;。

    • 重新设置工作树

      工作树实际上是这些事情中唯一显而易见的事情:它是你工作的地方。在工作树中,您的文件具有通常的形式,并且所有正常的计算机程序都可以使用。索引和内部提交中的内容采用特殊的Git形式。

    只做一件事就可以让Git停止:git reset --soft。这会移动分支名称,而不会触及索引和工作树。

    你做完两件事后可以让Git停止:git reset --mixed。这会移动分支名称,并重新设置索引。

    或者,你可以让Git做三件事:git reset --hard。这将移动分支名称,重新设置索引,并重新设置工作树。

    您可能希望拥有的内容是这样的:

    A   <-- master
     \
      B   <-- recovery
    

    这将为您提供两个现有提交的分支名称。

    如果您当前的名称master指向提交A,则只需添加一个新的分支名称recovery,指向提交B

    git branch recovery 2f6116c
    

    会这样做。

    如果名称master当前指向提交B,您可以执行另一个git reset,使其再次指向提交A。您可以先创建名称recovery ,而不必拼出B的哈希ID:

    git branch recovery
    git reset 78022b7
    

    每次像这样运行git reset时,都会移动当前分支名称 - git status表示您在给定提交中的分支。如果使用--mixed(默认值),则还会重置索引。如果您使用--hard,则还会重置工作树。但是,无论您提供什么提交哈希,都会将当前的分支名称移动到指向该提交。

    承诺本身保持原样,永久不变。有什么变化:

    • 您的分行名称;
    • 你的索引/登台区;和
    • 你的工作树。

    只要有一个分支名称,您可以永久地,不变地存储您使用git commit保存的任何内容,通过该分支名称可以找到提交一个reflog条目,否则-abandoned commit alive。只有在大约一个月后,当reflog条目开始到期时,放弃的提交才会真正消失。

    重置实际上可以做更多事情

    我花了足够长的时间来回答这个问题,你想出了git reset -- results。这是git reset可以做的另一件事:它&#34;移动&#34;当前分支名称到现在的位置,它没有任何效果,然后它将一些特定的索引条目或条目重新设置为新当前提交中的任何内容。这使您可以运行git checkout将索引条目提取到工作树中。

    (您也可以直接从提交中提取,首先将其复制到索引中,然后再复制到工作树中。这是一个好主意,请记住,Git始终在使用每个文件的三个副本:一个在HEAD提交中,一个在索引中,第三个在工作树中!)

答案 1 :(得分:0)

  • git reflog将为您完成操作
  • 从那里发现操作哈希硬重置
  • 之前完成
  • git reset <commithash>
  • 如果reset会在删除文件时(因为在您的情况下似乎)将您带回,因为您没有指向正确的操作哈希,您可能需要执行git checkout -- .才能恢复它们。