我正在做一个变基,当一些提交有冲突。在解决冲突的过程中,我不小心添加了 * 所有 * 未跟踪的文件。因为我也不跟踪未跟踪的文件,所以我不记得哪些文件要取消舞台。或者哪些文件作为冲突提交的一部分被暂存。而不是弄清楚它,我决定git rebase --abort希望只是重新开始。但是,那些错误添加的文件现在已经消失。我想知道发生了什么事。以及为什么git rebase --abort不能将我的工作树恢复到原始状态。如果可能的话,在哪里可以找到这些文件。他们中的一些人有很有价值的工作。
git rebase --abort
kb5ga3dv1#
什么都没丢!Git reflog记录了本地分支上的所有提交(简称为“references”或“refs”),以及HEAD指向的所有提交。运行git reflog,你应该会看到在你中止的rebase过程中所做的所有提交。reflog应该包含一个条目“rebase(abort):回到……”。使用git log或gitk检查这个提交(或refog的任何其他提交),然后使用git branch hash-of-that-commit创建一个指向该提交的新分支。然后,您可以切换到该分支以提取文件。至于为什么在中止rebase时删除文件:Git只会在运行过程中留下未跟踪的文件。一旦你跟踪了这些文件(有意或无意),它们就由Git管理了。切换分支或 checkout 不同的提交将从你的工作树中删除(跟踪)文件,这些文件是“上一次”提交的一部分,但不是要 checkout 的提交的一部分。好的一面是Git不会轻易丢失已经提交过一次的数据。如果文件从未提交,但文件的内容被暂存(使用git add),那么仍然可以恢复内容,但这是一个有点多的工作。运行git fsck查找任何悬空的 * blob *,然后使用git cat-file -p或git show以及相应blob的对象ID。找到正确的blob后,将cat-file/show的输出重定向到具有所需名称的文件。对所有文件重复此操作。
HEAD
git reflog
git log
gitk
git branch hash-of-that-commit
git add
git fsck
git cat-file -p
git show
cat-file
show
1条答案
按热度按时间kb5ga3dv1#
什么都没丢!
Git reflog记录了本地分支上的所有提交(简称为“references”或“refs”),以及
HEAD
指向的所有提交。运行
git reflog
,你应该会看到在你中止的rebase过程中所做的所有提交。reflog应该包含一个条目“rebase(abort):回到……”。使用
git log
或gitk
检查这个提交(或refog的任何其他提交),然后使用git branch hash-of-that-commit
创建一个指向该提交的新分支。然后,您可以切换到该分支以提取文件。至于为什么在中止rebase时删除文件:Git只会在运行过程中留下未跟踪的文件。一旦你跟踪了这些文件(有意或无意),它们就由Git管理了。切换分支或 checkout 不同的提交将从你的工作树中删除(跟踪)文件,这些文件是“上一次”提交的一部分,但不是要 checkout 的提交的一部分。
好的一面是Git不会轻易丢失已经提交过一次的数据。
如果文件从未提交,但文件的内容被暂存(使用
git add
),那么仍然可以恢复内容,但这是一个有点多的工作。运行git fsck
查找任何悬空的 * blob *,然后使用git cat-file -p
或git show
以及相应blob的对象ID。找到正确的blob后,将cat-file
/show
的输出重定向到具有所需名称的文件。对所有文件重复此操作。