据我所知,调用“git reset --hard”应该撤消我计算机上的任何更改。但是在运行之后,我的系统上有1,459个文件Git说我需要添加或合并到我正在处理的分支。
如何让它丢弃我计算机上的所有更改(我确实想保留已推升的更改)?
如果相关,this occurred because Visual Studio ran out of memory half way through switching to another branch。所以我认为它从我系统上的一个分支中留下了文件,但在切换到分支时标记为自己。
答案 0 :(得分:1)
尝试删除索引(删除文件.git/index
),然后运行git reset --hard origin/support-15.2
。这不是正常的事情,但你的情况也不正常。
听起来有点像Visual Studio充满了#34;磁盘已满#34;错误处理。
作为another recent Q&A noted,当我们在Git工作时(没有一些IDE),我们有三个主要部分:
存储库本身,通常隐藏在名为.git
的目录中(但不是在使用--bare
存储库时)。
存储库存储对象(它是一种键/值数据库),加上一些辅助数据,最重要的是来自名称的映射--Git通常表示为"分支B"或者"标记T",但一般格式是引用名称 - 对象哈希ID,例如丑陋的提交哈希值。由于哈希随机出现随机,Git(和我们)需要一种方法将一致的,明智的名称(如master
)转换为提交的哈希ID,以将其视为最近的提交。科。 (随着时间的推移,这种映射会随着我们添加越来越多的提交而发生变化。)
存储库中的对象以特殊的Git格式存储。它们也是只读的,一旦创建:对象就在那里,包含与最初和永久保存到键/值存储中时相同的值;或者根本不存在。如果磁盘空间不足,则此数据库必须维护此相同的属性(对象必须仍为全有或全无)。
名称到对象ID映射是可读/写的,因为它们确实发生了变化。磁盘空间不足可能会导致丢失一些映射,这很重要,因为这些映射本身可以使对象可以访问。
工作树(或工作树,工作目录,或其他各种名称,全部用于"您工作的地方")。
工作树中的文件具有正常的日常格式,并且可以像普通的日常文件一样进行读/写。
index ,也称为临时区域和缓存。
从某种意义上说,索引完全没有必要,但它是Git如何获得大部分速度的。它还支持一些棘手的项目,如git add -p
。索引的实际实现是作为文件.git/index
,但该文件的格式和内容是非常重要的(现在有一些东西称为拆分索引,其中索引在多个文件中;当您使用git worktree add
时,每个工作树会得到一个索引,因此您不应该假设.git/index
。
索引与工作树一样,必须是读/写。它有几个角色:它不仅允许您阶段项目进行提交(通过git add <file>
),还可以缓存关于所有工作树文件的信息。这就是它具有名称临时区域和缓存的原因。缓存的信息让git status
变得非常快 - 但假设索引已根据工作树的内容进行了正确调整,反之亦然。
正常git checkout
和git add
系列会使此缓存数据保持最新,以便索引和工作树相互匹配。我怀疑在耗尽空间后,VS和/或底层的Git代码使两者不同步。如果他们得到足够严重的去同步,即使是普通的git reset --hard
也没有让他们恢复同步。
在这种情况下,只要您没有分阶段修改,没有正在进行的合并等,它就足以安全地删除索引。这会丢失有关当前提交和当前工作树内容的所有缓存信息,这会强制Git从头开始重建它。具有git reset
或--mixed
的后续--hard
将执行此重建。使用--mixed
,Git将为git reset
, 1 的目标提交中的文件创建索引条目,查看工作树中的内容,而不触及工作树。使用--hard
,Git将生成这些索引条目,同时重新设置工作树文件以匹配目标提交。如果从一些其他提交哈希ID的半转换中遗留了一些工作树文件,那么使它们都与origin/support-15.2
解析的哈希ID匹配可能是正确的。
(一如既往,如果您不太确定,可以将工作树内容保存在Git本身无法触及的地方,然后使用您喜欢的任何工具将保存的树与Git提取的内容进行比较。 )
1 target 就是我所说的git reset
的提交参数:
git reset [--type] target
( type 是软,混合或硬的一种)
Git文档称之为<commit>
,但有很多提交。如果指定原始哈希ID,则必须是提交的哈希ID,Git将更改当前分支名称 - 无论分支名称是什么 - 因此它将该特定哈希ID命名为其当前提交。如果您指定了一个名称,例如origin/support-15.2
,Git只会将该名称解析为提交哈希ID,然后继续进行,就像您给它一个提交哈希ID一样。
使用--soft
,Git将当前分支更改为指向目标提交,然后停止。使用--mixed
,Git继续修改索引,然后停止。使用--hard
,Git会在修改索引时更新工作树。