恢复由于git checkout丢失的文件(未暂存/未提交)

ay草

我知道这是一个愚蠢的错误,但请听我说。

我有一个git repo(在GitHub上有一个远程服务器),我想创建一个新分支。我不会说我对git并不陌生,我已经使用了很长时间,并且想认为我可以做一些体面的回购工作。

现在,此存储库中大部分都是二进制数据,这是因为该存储库中没有代码,而是拥有我的软件使用的二进制专有数据文件。

回到问题,我决定为我的合作伙伴创建一个新分支,该合作伙伴使用不同的数据文件。我的工作树不干净,大约有2或3个修改过的文件和1个新文件。我执行以下操作:

git branch kicad
git checkout kicad

(no error is shown about dirty working tree/uncommitted changes)

rm ./my_data_files
md partners_data_files

git add .
git commit

这删除了我的项目和数据文件,并为我的伴侣准备。当我切换回主分支时,我因为工作的损失而被枪杀。我的数据文件仍然存在,但是我所做但未暂存/提交的更改已消失。

我尝试将其恢复大约2小时,但未成功。

以下是一些命令的输出:

  1. git reflog
0fad3c8 ... checkout: moving from kicad to main
3b0a8dc ... checkout: moving from kicad to kicad
3b0a8dc ... checkout: moving from main to kicad
0fad3c8 ... reset: moving to HEAD

(This is when I realized changes were gone)

0fad3c8 ... checkout: moving from kicad to main
3b0a8dc ... commit: Initial Kicad Commit

0fad3c8 ... checkout: moving from main to kicad
0fad3c8 ... commit: Connected VCC, might have to redo due to uC stuff
  1. git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1266/1266), done.
dangling blob acd050aef0bd6151b46f99ea038af062110622ad
dangling blob dae060387c5998e4c2461fbaf003558222eb30d0
dangling tree 1f21c30039821372359108c6bc747a7510f93ce7
dangling blob c53216ba759028d68c64ca80bb1cc23a3aa025a9
dangling commit d8b2cf1f8c088f9fcc6990bd788bbc18615ebe41
dangling blob e642369390cb27753f17fee430a60db08719115a
dangling blob 7004c58d393d1e54c6080a8bf4eae9a56f25c160
dangling blob 8914c8d1aa0d9857fc9dfd7680db9590916827b1
dangling blob aa9433c2a651ad8c9878274007f39e61562570d8
dangling blob 5fa66c17c63b384a8120dee4dbadb726427e372e
dangling blob 22b71a4553fe6af87528aafaeb50133e21ca9938
dangling blob 3197630158eb88f93d2626a3cca8c1dab52d50b8
dangling blob 0308d60f2b21f83d941fdff735888549d19f17b1
dangling blob 7f68dac2ec15393bea041d87541d1fbb360bc065
dangling tree 8588ef3d5242870e9aedf782674122ab20b8f28f
dangling commit 35d9c0eb3b49b808ffa2178a3f098fe7a4b44d91
dangling commit 38ed38b357bb113d6bd43d99b391711933db123b
dangling commit 371d767b784a7119b3523de88aeee85748f83230
dangling blob 539dccc2799619ccd7bd588b0615415f25f62bed
dangling blob c5fd0dc4261c1481f3a3991c2311440643df9aac
dangling blob 087ed8e94498048c6702fd098e0d948593d9d93b
dangling blob 2b5e415606b875839c782cb226762273b023793d
dangling blob c14e5265de71f27b74cc06fb461886753b495021
dangling blob db4f32caf30cdf922918315954ffa3d1d0e775d8

我尝试重置,还原,签出,但没有任何效果。

回购在这里我读了一些答案,说不可能,但是我不确定这个答案。任何回应都将受到欢迎,我将乐意提供详细信息。

编辑1:我不试图恢复那些已删除的文件。我要恢复的是当我从主分支签出到另一个分支(kicad)并丢失文件时丢失的更改。

马克·阿德尔斯伯格

编辑2:

只是要回顾-问题中列出的步骤是

git branch kicad
git checkout kicad

(no error is shown about dirty working tree/uncommitted changes)

rm ./my_data_files
md partners_data_files

git add .
git commit

当多个人告诉他们rm删除了数据(而不是任何git操作)时,OP指示rm'd文件不是包含有问题更改的文件。

现在,根据他们的最新评论,事实似乎并非如此。坦率地说,如果可以的话,我会删除答案,因为我很少耐心等待别人改变他们的故事,并在我自愿提供帮助时浪费时间。

====

编辑:我一直在阅读您关于rm'd文件不是您要恢复的文件的评论我花了一些时间来理解发生了什么,因为您一直暗示着不正确的事情:更改分支时,更改会丢失。

完成之后git checkout,更改作为未上演的Chagnes保留在其中。

当你说git add .你上演他们。

当您提交了合作伙伴的分支机构时,您便与他们一起进行了这些更改。

当您切换回自己的分支时,git说:“哦,好吧,您对另一个分支所做的更改与我们要切换到的该分支无关”-因为这就是分支。

因此,您实际上有两个相关的问题:

  1. 您已将更改提交给伴侣的分支机构,而该更改可能不属于该分支机构

  2. 您需要在工作树中进行这些更改

因此,您应该可以通过与合作伙伴之间的差异来找到分支机构。从那里,您可以从他的分支签出单个文件,以将那些更改恢复到您的工作树中。

git checkout other_branch -- path/to/file

恢复工作状态后,还需要清理另一个分支。一个类似的过程(将文件从先前的提交状态检出到该分支上的工作树中)就足够了。

我也将保留原始答案,因为最后提出的建议仍然适用。

====

git绝对不知道从未进行过的更改。报告此类更改的命令是直接从工作文件中获取其信息,因此,如果这些信息不存在,则git不会告诉您任何内容。如果有备份,则可以从中还原。

您提到git没有给出任何警告。由于您正在执行的命令(切换到指向与当前分支相同的提交的另一个分支HEAD)不会影响工作树,因此git没有理由认为您在做任何危险的事情。直到随后rm的非git命令,所有数据都丢失了。

我的建议是:

  1. 如果您打算做一些需要您的工作状态的事情,请使用git stash(甚至是git stash -u)进入一个干净的工作树状态,同时能够恢复您的工作状态。https://git-scm.com/docs/git-stash

  2. 对于此操作,通过创建新工作树(https://git-scm.com/docs/git-worktree)或简单地再次克隆,就完全可以避免涉及工作树这将为您提供一个单独的工作区,在其中创建新分支。

  3. 无论如何,您的工作树是最容易丢失数据的存储区域,因为尚未将其更改添加到git的数据库中。因此,如果您要对工作树进行任何破坏性的操作(如rm命令),则可以使用它git status再次检查您是否知道可能会丢失的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

git恢复删除的文件,删除后未提交任何文件

GIT合并错误“由于未合并文件而无法提交”

可以git撤消未暂存文件的签出

git reset --hard后未暂存的文件消失了

git尝试上传未暂存的已删除文件

Git合并和未暂存的文件

git添加了很多文件,但不是“未暂存的更改未提交”中的所有文件

防止git提交未暂存的文件

Git隐藏未提交的文件

Git commit提交已暂存和未暂存的文件

检出其他分支时,请在git中删除未暂存,未提交的文件

Visual Studio Git-是否有防止提交未暂存文件的设置

git恢复本地未提交的更改

为什么“ git reset HEAD”不会撤消我未提交的,未暂存的更改?

GIT:恢复到先前的提交后还原未跟踪的文件

由于reflog中的相同原因,无法从Git恢复提交

git checkout将未暂存的文件携带到新分支

git add的未暂存文件成功添加,但未暂存文件

如果由于某种原因提交失败,是否可以恢复git commit消息?

git:如何从暂存删除的文件中恢复未提交的更改?

Git rebase 分支,因此提交和未暂存的更改不会被删除或丢失

未针对提交和未跟踪文件暂存 Git 更改

更改未暂存以使用 git bash 提交

git 错误:“未为提交暂存更改:”

为什么 git 提交未暂存到索引的文件的大块?

git stash 是否仅存储暂存文件甚至未暂存和未跟踪文件?

用于未暂存更改/文件更改的 Git 挂钩

git 中暂存和未暂存文件的变化性质

如何使用python检查git repo中是否存在未暂存/未提交的更改或未推送的提交