有没有办法从git重置中恢复未提交的更改到工作目录-hard HEAD?
一般来说,您无法返回未提交的更改。
以前的分段更改(git add)应该可以从索引对象中恢复,所以如果你这样做了,使用git fsck——lost-found来定位与它相关的对象。(这将对象写到.git/lost-found/目录;从那里你可以使用git show <filename>来查看每个文件的内容。)
如果没有,答案是:看看你的备份。也许你的编辑器/IDE将临时拷贝存储在/tmp或C:\ temp之类的目录下
git reset HEAD@{1}
这将恢复到前一个HEAD
[1] vim例如,可选地存储持久撤销,eclipse IDE存储本地历史;这样的功能可能会节省你的**
我不小心运行git重置-对我的回购今天也很难,而今天也有未提交的更改。为了找回它,我运行git fsck——lost-found,它将所有未引用的blobs写入<path To repo>/.git/lost-found/。由于文件未提交,我在<路径repo>/.git/lost-found/的另一个目录中找到了它们。从那里,我可以使用git show <filename>看到未提交的文件,复制出blob,并重命名它们。
注意:只有当你将想要保存的文件添加到索引中时(使用git add .),这才有效。如果文件不在索引中,就会丢失。
我刚刚做了git重置-困难和丢失了所有未提交的更改。幸运的是,我使用了一个编辑器(IntelliJ),我能够从本地历史记录中恢复更改。Eclipse应该允许您做同样的事情。
答案来自这个SO
$ git reflog show
4b6cf8e (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to origin/master
295f07d HEAD@{1}: pull: Merge made by the 'recursive' strategy.
7c49ec7 HEAD@{2}: commit: restore dependencies to the User model
fa57f59 HEAD@{3}: commit: restore dependencies to the Profile model
3431936 HEAD@{4}: commit (amend): restore admin
033f5c0 HEAD@{5}: commit: restore admin
ecd2c1d HEAD@{6}: commit: re-enable settings app
# assuming you want to get back to 7c49ec7 (restore dependencies to the User model)
$ git reset HEAD@{2}
你的好日子回来了!:)
信息丢失了。
由于您没有提交,您的.git从未存储此信息。所以基本上git不能为你恢复它。
但是,如果你只是使用git diff,有一种方法可以通过以下3个简单步骤使用终端输出恢复。
滚动你的终端并寻找git diff的o/p,将o/p保存在一个名为diff.patch的文件中 搜索并替换所有7个空格和8个空格与制表符(\t)字符,并保存更改。 进入git存储库。应用diff.patch (patch -p1 < diff.patch)
注意:当您将数据从终端复制到文件时,要小心并清楚地看到数据是连续输出的,不包含任何冗余数据(由于按下向上和向下箭头)。否则你会搞砸的。
如果你使用IntelliJ:
在上下文菜单中,选择“本地历史记录”,单击子菜单上的“显示历史记录”:
项目或文件夹的本地历史视图会显示所有内容 你在过去几天所做的一切。的操作列中 在对话框的下半部分,选择要滚动的动作 回来。[…这样做,对话框的上部显示了更改文件的树状视图。如果您只想恢复已删除的文件,而不考虑此后所做的其他更改,您可以在树视图中选择文件Lost.txt,然后单击Revert按钮。
http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/
这把我救了出来!
根据定义,git reset -hard会丢弃未提交的更改,git无法恢复它们(你的备份系统可能会有帮助,但不是git)。
实际上,很少有git重置的情况——困难是个好主意。在大多数情况下,有一个更安全的命令来做同样的事情:
If you want to throw away your uncommitted changes, then use git stash. It will keep a backup of these changes, which will expire after some time if you run git gc. If you're 99.9% sure you'll never need these changes back, then git stash is still your friend for the 0.1% case. If you're 100% sure, then git stash is still your friend because these 100% have a measurement error ;-). If you want to move your HEAD and the tip of the current branch in history, then git reset --keep is your friend. It will do the same thing as git reset --hard, but will not discard your local changes. If you want to do both, then git stash && git reset --keep is your friend.
教你的手指不要使用git重置——很难,总有一天会有回报的。
当我在做一个本地项目时,我想把它移动到GitHub上,然后创建一个新的存储库。当我试图用.gitignore将所有这些文件添加到新的存储库中时,我不小心添加了一个错误的文件,然后试图清除它。
我运行了git reset -hard origin/master
然后我所有的本地文件都被删除了,因为回购是空的。我以为一切都消失了。
这招对我很管用:
git reflog show
git reset HEAD@{1}
git push
是的,你可以在git中从硬重置中恢复。
Use:
git reflog
来获取提交的标识符。 然后使用:
git reset --hard <commit-id-retrieved-using-reflog>
这招救了我几次命。
你可以在这里找到reflog的文档。
如果我丢失了一些零钱,我通常会这么做。
git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...
要将指针移回你之前的提交,但保持你在最近一次提交中所做的更改,checkout git reset -soft dadada
我发现在git重置之前任何未提交的文件——hard <commit>会从git历史中删除。然而,我很幸运,在我紧张的整个过程中,我一直保持我的代码编辑器会话打开,我发现在每个受影响的文件中,一个简单的控件+ z将文件的状态返回到Git重置之前的版本,所以我没有特别要求它重置所有内容。万岁! !
如果您正在Netbeans上开发,请查看文件选项卡和文件编辑区域之间的内容。这里有“来源”和“历史”。在“历史记录”中,你会看到使用版本控制(git/other)所做的更改,但也有本地所做的更改。在这种情况下,局部更改可以拯救您。
我也遇到了同样的问题,我几乎要疯了....最初我提交了项目并合并。 后来当我尝试运行git push——set-upstream origin master时,我得到了这个错误
致命的:拒绝合并不相关的历史
所以我运行git reset—hard HEAD,它删除了一个3周的项目,但下面的几个命令挽救了这一天:
git reset HEAD@{1} //this command unstage changes after reset
git fsck --lost-found //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
(适用于部分用户的答案)
如果你使用的是(最近的)macOS,即使你没有使用时间机器磁盘,操作系统也会每小时保存一次备份,称为 当地的快照。
进入时间机器,导航到你丢失的文件。操作系统会问你:
The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?
你应该能够恢复你丢失的文件。
IntelliJ有一个临时文件夹,可以通过history命令访问:
在导航窗格中选择要还原文件的文件夹 双击Shift键(Shift - Shift) 在弹出的输入框中输入本地历史记录并按Enter 选择显示历史记录 现在您可以恢复到所需的版本。
你只能恢复你丢失的阶段性(git add)更改。
执行此命令可以方便地恢复
步骤:1进入工程项目根目录,执行该命令
npx git-recover
步骤:2输入恢复目录路径如
/Users/apple/RecoveryDirectory
你会在RecoveryDirectory中丢失文件
对于那些丢失了未分期和未提交更改的VSCode用户
这只会工作,如果你没有广泛编辑您的文件后再次重置。
尝试在VSCode中撤销文件更改
我确实进行了重置——当我的利益相关者决定在我构建功能时重新定义功能时,这很困难。一小时后,同样的利益相关者改变了主意。
我休息了一会儿又回来了。当我看到他们改变主意后,我决定尝试撤销我正在处理的文件,它成功了!我设法拿回了所有的作业。
我遇到了这样一个场景,我签出了本地更改,但没有提交或存储它们。据我所知,没有任何命令能帮助我。对我有用的是CTRL+Z。
CTRL + Z
偶然的机会,我所有的文件都在编辑器中打开,所以在编辑器中,我只需按CTRL+Z所需的文件,这解决了我的问题
PS:我用的是Sublime文本编辑器。
嗯,据我所知,最好的解决方案是使用IDE特性。
选择丢失文件的存储库,并右键单击它 在菜单>中查找本地历史显示历史 现在检查版本版本,你所有的文件都存在>,选择它,然后点击恢复。 这就是最可能的情况。
注意:上述解决方案适用于在任何IDE(如intelliJ)中进行更改或导入存储库。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别