Ios git重置后如何恢复我的故事板--硬头^?
大约一周前,我将.gitignore文件推到我的存储库中,遇到了一些小问题,最终解决了这个问题,但注意到我所有的故事板也都在存储库中。天才的一笔,我研究了如何让他们离开那里,发现了上面的git重置命令,然后把它放进了我的终端,拍了拍自己的背,生活继续着。今天我刚意识到,在安装了一些CoCoapod之后,我花了数周时间制作的所有故事板都不见了,我把它们放在了一起。我花了最后一个小时阅读了类似的问题,但在阅读了一段时间后没有发现任何问题,我想知道是否有其他xcode用户遇到过同样的问题,可以提供帮助 我还应该补充一点,我只是在舞台上添加了故事板,在重置时还没有提交它们,所以今天我使用git reflog命令,希望它们在失物招领处。我曾读到垃圾收集有一个月没有发生,所以我不认为(我希望)它们已经消失了 我今天下载了AWS SDK,这就是git reflog命令目前显示的全部内容。我需要进一步回滚git rest HEAD{}命令吗 多谢各位 您在评论中注意到您做了一个Ios git重置后如何恢复我的故事板--硬头^?,ios,swift,xcode,git,Ios,Swift,Xcode,Git,大约一周前,我将.gitignore文件推到我的存储库中,遇到了一些小问题,最终解决了这个问题,但注意到我所有的故事板也都在存储库中。天才的一笔,我研究了如何让他们离开那里,发现了上面的git重置命令,然后把它放进了我的终端,拍了拍自己的背,生活继续着。今天我刚意识到,在安装了一些CoCoapod之后,我花了数周时间制作的所有故事板都不见了,我把它们放在了一起。我花了最后一个小时阅读了类似的问题,但在阅读了一段时间后没有发现任何问题,我想知道是否有其他xcode用户遇到过同样的问题,可以提供帮助
git隐藏
这是一个关键的信息,它改变了一切。幸运的是,这也使恢复变得容易得多。特别是,这意味着您丢失的文件不是“悬挂的blob”,并且确实保存了它们的原始名称。(顺便说一句,注意,git stash
表示git stash save
;我将使用下面较长的形式将其与其他git stash
命令区分开来。)
最简单的恢复方法是使用git stash分支
。选择一个新的分支名称,一个您还没有的名称。为了便于说明,我将使用saveme
,这是一个糟糕的名称,您应该选择一个更好的名称
git stash branch saveme
这将获取现有的git stash
,使用运行git stash save
时的当前提交创建一个新分支。然后,它会将索引(暂存区)恢复到运行git stash save
时的状态,并将工作树恢复到运行git stash save
时的状态。现在可以提交索引:
git commit -m 'save index as a commit'
然后提交工作树的其余部分(如果还有其他内容要提交):
git add --all
git commit -m 'save everything else as a commit too'
在这个答案的末尾(在另一次编辑中),我将添加一个关于整个序列发生了什么的图形图,从第一个git add
s开始,经过git stash save
和git reset--hard HEAD^
直到最后一个git stash分支
有一个警告:您的索引和工作树必须是干净的,才能使用
git stash分支
。如果您有未提交的工作,您可能应该现在提交,或者使用git reset--hard
将其全部抛出。当然,任何一个都有后果:
- 如果运行另一个
,则先前保存的存储将从git stash save
向上推到stash@{0}
。然后,您必须使用:stash@{1}
将该存储转换为分支git stash branch saveme stash@{1}
- 如果您选择使用git reset--hard,您将丢失所有未提交的工作,因此请确保这是正常的
$ cd my-git-project
此时,您处于Git工作树中。工作树是您的文件以正常形式存在的地方,计算机的其他部分(和您)可以使用它,而不是仅使用Git的形式,Git保存您或任何其他人提交的每个文件的每个版本。你在某个分支上,比如说master
,只是为了具体。这个分支有一些提交集,以Git称之为该分支的tip提交结束。分支名称会记住此提示提交的哈希ID:
...--F--G--H <-- master
暂存区域,也称为索引,现在不是“干净的”:它不再匹配提交H
。相反,它具有已编辑和添加文件的副本
您的工作树可能与索引匹配,也可能与索引不匹配。如果它确实与您的索引匹配,并且如果您要运行git commit
,git将对您的索引进行新的提交(这就是索引/暂存区域的主要用途:构建下一次提交),然后您的索引将与您的提交匹配,并且是干净的。如果您的工作树与您的索引匹配,那么也将是干净的。这看起来像:
...--F--G--H--I <-- master
第一次(小写的i
)提交是与git提交
相同的提交。它只是不在分支主机上
;这是这两个“藏匿袋”的一部分。第二个提交,w
,很特别:在Git的其他部分看来,它就像一个合并提交,但实际上它只是一个工作树状态的提交,即使它与i
中的索引状态相同
完成这两个隐藏包提交后,git-stash
重置(清理)索引和工作树,一个lagit-reset——硬头。因此,现在您的索引和工作树再次匹配commitH
接下来,您说您运行了git reset--hard HEAD^
。这做了三件事:它将索引和工作树状态重置为所选提交的状态,即H
之前的状态;它使名称master
也指向所选提交。因此,现在您的存储库如下所示:
...--F--G <-- master
\
H [remembered in reflogs, *and* preserved via the stash]
|\
i-w <-- stash
索引从i
commit重新加载,工作树从w
commit重新加载。如果现在运行git commit
,您将得到:
...--F--G <-- master
\
H--I <-- saveme
现在,所有内容都以普通的提交方式永久保存(或者直到您删除saveme
分支)
...--F--G <-- master
\
H [remembered in reflogs, *and* preserved via the stash]
|\
i-w <-- stash
...--F--G <-- master
\
H <-- saveme
|\
i-w [abandoned]
...--F--G <-- master
\
H--I <-- saveme
...--F--G <-- master
\
H--I--J <-- saveme
git fsck --lost-found