我丢失了在“合并冲突”阶段添加到git的文件。一步一步:
git pull git status
Git通知我“合并冲突”,没关系。然后我创建一个新文件并将其添加到Git。
vi test.txt git add test.txt
之后,中止合并:
git merge --abort
我没有找到文件“test.txt”,无论是在目录中,也没有通过“git fsck”,也没有“git reflog”。是否可以恢复该文件?
6kkfgxo01#
你用git fsck试过什么?请参阅此SO问题:Recover files that were added to the index but then removed by a git reset一般的答案是:你键入的指令序列已经从跟踪(和磁盘)中删除了文件,因此不能保证你的文件内容可以被检索。但是,git有很多安全机制,其中之一是:如果在库内某处输入了某些数据,则在两周前不会删除。(git具有垃圾收集机制,请参见git help gc)如果你确实运行过git add test.txt,而且这个操作是最近才执行的,那么git中应该还能找到文件内容的痕迹:
git fsck
git
git help gc
git add test.txt
git fsck --full --unreachable --no-reflog
用git说法,文件是blob:
blob
git fsck --full --unreachable --no-reflog | grep blob
这会给予你一个内部git哈希列表:
unreachable blob 08bf360988858a012dab3af4e0b0ea5f370a2ae8 unreachable blob 21bf7ea93f9f9cc2b3ecbed0e5ed4fa45c75eb89 unreachable blob 08c12ef37075732cf4645269ab5687ba6ba68943 ...
注意git add file.txt存储文件的 * 内容 *,而不是文件的 * 名称 * ...如果您记得文件中的特定字符串,可以尝试使用git grep <string> <hash>缩小搜索范围:
git add file.txt
git grep <string> <hash>
$ git fsck --full --unreachable --no-reflog | grep blob | awk '{ print $3 }' > list.txt $ cat list.txt | while read blob; do if git grep -q "string" $blob; then echo $blob fi done
然后,您可以使用以下命令查看blob的全部内容:
git show $blob
希望能找到你要的文件。
sy5wg1nm2#
对不起,我的英语很差。感谢回复#1。我恢复了我的文件!!!快乐^.^我是这样做的:
git fsck --full --unreachable --no-reflog | grep blob | awk '{ print $3 }' > ~/Downloads/git.txt
然后,我保存文件到命名的文件夹与不同的关键字,我记得:
# execute it in your git project cat ~/Downloads/git.txt | while read blob; do if git grep -q "keyword in your lost content" $blob; then echo $blob; git show $blob > ~/Downloads/git-above-keyword/$blob.ts fi done
如果你失去了更多的内容,你应该用不同的关键字多次执行上述命令。你会得到许多关键字文件夹。我打开了另一个vscode和打开每个关键字文件夹,复制每一个$bold.ts代码到我的项目文件。这样做很小心,因为$bold.ts可能有重复的代码,你应该区分最后的代码。
xqk2d5yq3#
在编辑这个答案之前,我并不知道(另一个解决方案正确地指向git fsck)。如果遇到同样的情况,您应该创建git commit而不是git merge --abort。正如@Muneer Bits所说,我建议你阅读一些git的基础知识。official site包含了很多文档和示例。你甚至可以使用try it online with an interactive tutorial。关键是,如果你的工作已经提交或隐藏,你不会丢失它。我强烈建议你阅读git一直输出的建议(除非你有一个旧版本,在这种情况下你也应该升级).这些提示应该告诉你通过先添加文件来标记提交已解决,然后通过执行git commit来完成合并。合并提交是有两个父提交的特殊提交。这意味着它们需要在某个时候提交,无论是自动提交(如果没有冲突)还是手动提交。当您中止合并时,您将所有更改恢复(重置)到合并前的状态,因此您丢失了所做的所有更改。可能的解决方案(取决于您的工作流程):
git commit
git pull #merge conflict, solve it manually git add modified_files_for_merging git commit touch test.txt git add test.txt git commit
请注意,合并未中止。还要注意合并并不总是拉取的最佳解决方案,你也可以 pull with rebase,但我强烈建议你在尝试冒险之前先熟悉一下git,而且,和往常一样,你最终选择的解决方案将取决于你的工作流程。
3条答案
按热度按时间6kkfgxo01#
你用
git fsck
试过什么?请参阅此SO问题:Recover files that were added to the index but then removed by a git reset
一般的答案是:你键入的指令序列已经从跟踪(和磁盘)中删除了文件,因此不能保证你的文件内容可以被检索。
但是,
git
有很多安全机制,其中之一是:如果在库内某处输入了某些数据,则在两周前不会删除。(
git
具有垃圾收集机制,请参见git help gc
)如果你确实运行过
git add test.txt
,而且这个操作是最近才执行的,那么git中应该还能找到文件内容的痕迹:用
git
说法,文件是blob
:这会给予你一个内部git哈希列表:
注意
git add file.txt
存储文件的 * 内容 *,而不是文件的 * 名称 * ...如果您记得文件中的特定字符串,可以尝试使用
git grep <string> <hash>
缩小搜索范围:然后,您可以使用以下命令查看blob的全部内容:
希望能找到你要的文件。
sy5wg1nm2#
对不起,我的英语很差。
感谢回复#1。我恢复了我的文件!!!快乐^.^
我是这样做的:
然后,我保存文件到命名的文件夹与不同的关键字,我记得:
如果你失去了更多的内容,你应该用不同的关键字多次执行上述命令。你会得到许多关键字文件夹。
我打开了另一个vscode和打开每个关键字文件夹,复制每一个$bold.ts代码到我的项目文件。这样做很小心,因为$bold.ts可能有重复的代码,你应该区分最后的代码。
xqk2d5yq3#
在编辑这个答案之前,我并不知道(另一个解决方案正确地指向
git fsck
)。如果遇到同样的情况,您应该创建
git commit
而不是git merge --abort
。正如@Muneer Bits所说,我建议你阅读一些git的基础知识。official site包含了很多文档和示例。你甚至可以使用try it online with an interactive tutorial。关键是,如果你的工作已经提交或隐藏,你不会丢失它。我强烈建议你阅读git一直输出的建议(除非你有一个旧版本,在这种情况下你也应该升级).这些提示应该告诉你通过先添加文件来标记提交已解决,然后通过执行
git commit
来完成合并。合并提交是有两个父提交的特殊提交。这意味着它们需要在某个时候提交,无论是自动提交(如果没有冲突)还是手动提交。当您中止合并时,您将所有更改恢复(重置)到合并前的状态,因此您丢失了所做的所有更改。
可能的解决方案(取决于您的工作流程):
请注意,合并未中止。
还要注意合并并不总是拉取的最佳解决方案,你也可以 pull with rebase,但我强烈建议你在尝试冒险之前先熟悉一下git,而且,和往常一样,你最终选择的解决方案将取决于你的工作流程。