如何取消git添加--所有操作后面都有多个提交

如何取消git添加--所有操作后面都有多个提交,git,github,git-add,Git,Github,Git Add,我之前无意中使用了git add--all,然后进行了几次提交,它试图添加几个应该忽略的大文件 现在,在任何提交时,它都会显示“这超过了GitHub的100.00 MB文件大小限制”。我尝试了git--reset,但它显示您的分支比“origin/master”提前了2次提交。如何让git恢复正常?非常感谢。如果您已经提交,一个选项是删除您的文件夹并再次克隆它。新的更改将丢失!只有在您独自处理此回购且没有太大变化的情况下,才能执行此操作。您可以通过运行git reset HEAD~2--hard

我之前无意中使用了
git add--all
,然后进行了几次提交,它试图添加几个应该忽略的大文件


现在,在任何提交时,它都会显示“这超过了GitHub的100.00 MB文件大小限制”。我尝试了git--reset,但它显示您的分支比“origin/master”提前了2次提交。如何让git恢复正常?非常感谢。

如果您已经提交,一个选项是删除您的文件夹并再次克隆它。新的更改将丢失!只有在您独自处理此回购且没有太大变化的情况下,才能执行此操作。

您可以通过运行
git reset HEAD~2--hard
返回2次提交。如果您尚未提交,请运行:

吉特储藏室-u

TL;博士: 请参阅或上的各种答案,跳到最后一节“最终示例”

解释 你问题中的问题是你没有正确描述你的情况。您不仅添加了各种文件,还提交了它们。这意味着它们现在永久存储在您的存储库中

永久这个词在Git中有点奇怪。的确,提交是固定不变的,并且无论您做什么,都会在存储库中保留很长一段时间。默认情况下,它们将永远留在那里,成为任何人所做的每一次承诺的历史的一部分。Git从不删除任何提交:每个新提交都保留其上一次提交(称为其父提交)的标识,新提交到旧提交的反向链是存储在存储库中的历史记录

提交本身实际上是由hash id存储的,Git向您展示的那些丑陋的东西(有时缩写),比如
a9b307c
等等。这些散列ID是每个提交的“真实名称”。它们看起来是随机的,基本上不可能被人们记住,所以我们要做的是让Git在某个特定的提交上附加一个名称,比如
master
。我们称之为分支的顶端。该提交本身具有上一个分支提示的哈希ID

考虑一下这张只有三次提交的存储库图,所有提交都在
master
上。我将为每个提交使用一个字母的名称,而不是哈希ID:

A <--B <--C   <--master
Commit
D
获取一个新的、唯一的哈希,该哈希基于
D
中的所有内容(包括
C
的哈希ID,以及您的姓名、电子邮件地址和当前时间)。但Git Git中的分支名称的秘密是,现在将新提交的哈希ID写入分支名称中,这样名称
master
现在指向提交
D

A <--B <--C <--D   <--master
Commit
D
仍然存在(这是一种永久性的!),但从名称
master
无法访问它,因为Git从
master
名称的Commit hash ID开始,并向后工作。这意味着Git不会“看到”提交
D
:它不再位于分支
master


1您可以一次推送多个分支名称。这过去是git push的默认操作,事实上,尽管这很容易出错,但现在的默认操作是只推当前的分支名称

在Git中,有时仔细区分名称(如
master
develope
)和我称之为“DAGlets”(提交图的一部分,如上文所示)是很重要的。提交图是一个D定向a循环G图或DAG。
git fetch
git push
都采用分支名称或任何其他类型的名称。他们在互联网电话的另一端调用另一个Git,并与之交谈:他们给对方一些这样的名字,然后将它们转换为适当的哈希ID。然后,它们根据散列ID和我前面提到的父链接决定发送或接收哪些提交(以及其他Git对象)。因为散列ID完全基于每个提交的内容,如果您的Git和他们的Git具有相同的提交,那么这两个提交具有相同的散列ID


关于git重置的了解 在Git中移动分支指针的主要方法是使用
Git reset
。不幸的是,
git reset
是一个复杂的命令

Git还有另外一对重要的特性:当您使用
Git commit
进行提交时,您可以从一些东西进行提交。“某物”本身实际上是Git的索引。索引主要是构建下一个提交的位置

当您运行
git add
时,git会从您的工作树(您工作的地方)中获取文件,这些文件的格式是您可以实际使用的,并将其复制到索引中。运行
git add--all
时,git获取所有工作树文件2并将它们添加到索引中

此时,它们在索引中,但未提交,因此它们不是永久性的。您可以
git reset
将它们从索引中重新设置出来。这是git reset的工作之一:重新设置索引

但这些文件也在您的工作树中。工作树版本也没有提交,因此它们不是永久的。您也可以
git reset
它们,这是
git reset
的另一项工作

当然,
git reset
可以移动一个分支名称,这是我们在这个特殊情况下需要的,因为您确实提交了文件,所以现在它们作为新提交的一部分永久存储。移动分支名称是git reset的三项主要工作中的第三项。3这三项工作的重要性顺序如下:

  • git reset
    始终移动(重新设置)分支名称
  • git reset
    有时会重置索引;及
  • git reset
    偶尔会重置工作树
  • 您可以使用
    --soft
    (仅执行作业1)、
    --mixed
    (执行作业1和作业2)和
    --hard
    来控制它们
    A <--B <--C <--D   <--master
    
    A--B--C   <-- master
           \
            D
    
    ...--o--o--o   <-- origin/master
                \
                 X--o--o--o--Y   <-- master (HEAD)
    
    git branch save-my-mistake
    
    ...--o--o--o   <-- origin/master
                \
                 X--o--o--o--Y   <-- master (HEAD), save-my-mistake
    
    git reset --hard origin/master
    
    ...--o--o--o   <-- master (HEAD), origin/master
                \
                 X--o--o--o--Y   <-- save-my-mistake