我知道这是一个愚蠢的错误,但请听我说。
我有一个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小时,但未成功。
以下是一些命令的输出:
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
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说:“哦,好吧,您对另一个分支所做的更改与我们要切换到的该分支无关”-因为这就是分支。
因此,您实际上有两个相关的问题:
您已将更改提交给伴侣的分支机构,而该更改可能不属于该分支机构
您需要在工作树中进行这些更改
因此,您应该可以通过与合作伙伴之间的差异来找到分支机构。从那里,您可以从他的分支签出单个文件,以将那些更改恢复到您的工作树中。
git checkout other_branch -- path/to/file
恢复工作状态后,还需要清理另一个分支。一个类似的过程(将文件从先前的提交状态检出到该分支上的工作树中)就足够了。
我也将保留原始答案,因为最后提出的建议仍然适用。
====
git绝对不知道从未进行过的更改。报告此类更改的命令是直接从工作文件中获取其信息,因此,如果这些信息不存在,则git不会告诉您任何内容。如果有备份,则可以从中还原。
您提到git没有给出任何警告。由于您正在执行的命令(切换到指向与当前分支相同的提交的另一个分支HEAD
)不会影响工作树,因此git没有理由认为您在做任何危险的事情。直到随后rm
的非git命令,所有数据都丢失了。
我的建议是:
如果您打算做一些需要您的工作状态的事情,请使用git stash
(甚至是git stash -u
)进入一个干净的工作树状态,同时能够恢复您的工作状态。https://git-scm.com/docs/git-stash
对于此操作,通过创建新工作树(https://git-scm.com/docs/git-worktree)或简单地再次克隆,就完全可以避免涉及工作树。这将为您提供一个单独的工作区,在其中创建新分支。
无论如何,您的工作树是最容易丢失数据的存储区域,因为尚未将其更改添加到git的数据库中。因此,如果您要对工作树进行任何破坏性的操作(如rm
命令),则可以使用它git status
再次检查您是否知道可能会丢失的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句