在玩git的过程中,常有失误的时候,有时把需要的东东给删了。
不过没有关系,git给了我们一层安全网,让我们能有机会把失去的东东给找回来。
Let’s go!
准备
我们先创建一个用以实验的仓库,在里面创建了若干个提交和分支。
BTW:你可以直接把下面的命令复制到shell里执行。
mkdir recovery;cd recovery
git init
touch file
git add file
git commit -m "First commit"
echo "Hello World" > file
git add .
git commit -m "Greetings"
git branch cool_branch git checkout cool_branch
echo "What up world?" > cool_file
git add .
git commit -m "Now that was cool"
git checkout master
echo "What does that mean?" >> file
恢复已删除分支提交
现在repo里有两个branch
$ git branch
cool_branch
* master
存储当前仓库未提交的改动
$ git stash save "temp save"
Saved working directory and index state On master: temp save
HEAD is now at e3c9b6b Greetings
删除一个分支
$ git branch -D cool_branch
Deleted branch cool_branch (was 2e43cd5). $ git branch * master
用git fsck --lost-found
命令找出刚才删除的分支里面的提交对象。
$git fsck --lost-found dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
用git show命令查看一个找到的对象的内容,看是否为我们所找的。
git show 2e43cd56ee4fb08664cd843cd32836b54fbf594a commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a Author: liuhui <liuhui998[#]gmail.com> Date: Sat Oct 23 12:53:50 2010 +0800 Now that was cool diff --git a/cool_file b/cool_file new file mode 100644 index 0000000..79c2b89 --- /dev/null +++ b/cool_file @@ -0,0 +1 @@ +What up world?
这个提交对象确实是我们在前面删除的分支的内容;下面我们就要考虑一下要如何来恢复它了。
使用git rebase 进行恢复
$git rebase 2e43cd56ee4fb08664cd843cd32836b54fbf594a First, rewinding head to replay your work on top of it... Fast-forwarded master to 2e43cd56ee4fb08664cd843cd32836b54fbf594a.
现在我们用git log命令看一下,看看它有没有恢复:
$ git log commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a Author: liuhui <liuhui998[#]gmail.com> Date: Sat Oct 23 12:53:50 2010 +0800 Now that was cool commit e3c9b6b967e6e8c762b500202b146f514af2cb05 Author: liuhui <liuhui998[#]gmail.com> Date: Sat Oct 23 12:53:50 2010 +0800 Greetings commit 5e90516a4a369be01b54323eb8b2660545051764 Author: liuhui <liuhui998[#]gmail.com> Date: Sat Oct 23 12:53:50 2010 +0800 First commit
提交是找回来,但是分支没有办法找回来:
liuhui@liuhui:~/work/test/git/recovery$ git branch * master
使用git merge 进行恢复
我们把刚才的恢复的提交删除
$ git reset --hard HEAD^ HEAD is now at e3c9b6b Greetings
再把刚删的提交给找回来:
git fsck --lost-found dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
不过这回我们用是合并命令进行恢复:
$ git merge 2e43cd56ee4fb08664cd843cd32836b54fbf594a Updating e3c9b6b..2e43cd5 Fast-forward cool_file | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 cool_file
git stash的恢复
前面我们用git stash把没有提交的内容进行了存储,如果这个存储不小心删了怎么办呢?
当前repo里有的存储:
$ git stash list
stash@{0}: On master: temp save
把它们清空:
$git stash clear
liuhui@liuhui:~/work/test/git/recovery$ git stash list
再用git fsck –lost-found找回来:
$git fsck –lost-found
dangling commit 674c0618ca7d0c251902f0953987ff71860cb067
用git show看一下回来的内容对不对:
$git show 674c0618ca7d0c251902f0953987ff71860cb067 commit 674c0618ca7d0c251902f0953987ff71860cb067
Merge: e3c9b6b 2b2b41e
Author: liuhui <liuhui998[#]gmail.com> Date: Sat Oct 23 13:44:49 2010 +0800 On master: temp save diff --cc file
index 557db03,557db03..f2a8bf3
--- a/file
+++ b/file
@@@ -1,1 -1,1 +1,2 @@@ Hello World ++What does that mean?
看起来没有问题,好的,那么我就把它恢复了吧:
$ git merge 674c0618ca7d0c251902f0953987ff71860cb067
Merge made by recursive. file | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
备注
这篇文章主要内容来自这里:The illustrated guide to recovering lost commits with Git
,我做了一些整理的工作。
如果对于文中的一些命令不熟,可以参考Git Community Book中文版
其实这里最重要的一个命令就是:git fsck –lost-found,因为git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来,用git rebase
也好,用git merge
也行就能把它们给恢复。
分享到:
相关推荐
在Git仓库管理中,有时出于隐私、安全或者代码版本重置等需求,我们可能需要清除commit历史记录,将仓库恢复到初次commit的状态。这个过程涉及到对Git仓库的深入操作,包括创建新分支、添加文件、删除旧分支以及强制...
git commit -m "第一次提交" ``` 这条命令中的`-m`选项后面跟的是提交信息。提交信息应该简洁明了,便于以后查看历史记录时理解每次提交的意义。 #### 二、关联远程仓库与推送 当本地仓库建立好并且已经有一些...
在Git的使用过程中,有时可能会遇到git server“丢失”commit的问题,这往往会给开发团队带来困扰,因为丢失的commit可能包含重要的代码更改。本篇文章主要分析了这种情况的原因和解决策略。 1. **问题现象** 当某...
然而,在忙碌的工作流程中,开发者有时可能会忘记进行`git commit`和`git push`操作,这可能导致丢失或遗漏代码更改。为了解决这个问题,出现了名为"Go-git-remind"的命令行工具。 "Go-git-remind"是一个用Go语言...
- **故障排查**:学习如何诊断和修复常见的Git问题,如错误的提交历史、丢失的提交记录等。 #### 总结 - 本教程《看日记学Git》是一份详尽而实用的学习资料,不仅适合Git初学者,也适合有一定基础的开发者进阶学习...
9. **撤销操作**: Git提供了`git reset`和`git revert`来撤销错误的提交或恢复丢失的更改。理解这些命令的风险和用法是非常重要的。 10. **图形化界面**: 除了命令行工具,许多图形用户界面(如SourceTree、Git...
* git commit:提交 * git branch -a:查看所有的分支 * git branch -r:查看远程所有分支 * git commit -am "init":提交并且加注释 * git remote add origin:添加远程库 * git push origin master:将文件推送到...
而`git reflog` 可以帮助找回丢失的分支或提交。 总之,Git 2.32.0.2的64位版本提供了稳定且强大的版本控制功能。无论是个人项目还是团队协作,Git都能提供高效的工作流程。通过学习和熟练掌握Git,你可以更有效地...
在Git版本控制系统中,有时我们需要撤销已做出的提交,但还未推送到远程仓库...同时,利用`git reflog`作为保险措施,可以在必要时找回丢失的版本。在日常开发过程中,合理使用这些功能可以有效地管理你的Git版本历史。
同时,错误处理和调试技巧也是重要的部分,例如如何解决常见的Git错误,或者如何通过`git reflog`找回丢失的提交。 总的来说,这份“Git使用手册中文版”是Git初学者和进阶用户的宝贵资源,它将引导用户逐步掌握Git...
9. **撤销更改**:`git reset --hard`可以回滚到某个提交状态,但需谨慎操作,因为它会丢失未提交的更改。 10. **标签**:`git tag`用于添加、查看和管理标签,常用在标记重要版本。 对于初学者来说,了解这些基本...
在误操作时,Git提供了一些恢复工具,如`git reset --hard`、`git checkout`和`git reflog`,帮助找回丢失的更改。 **10. 代码同步** 开发者常使用`git pull`和`git push`同步本地和远程仓库。`git pull`合并远程...
如果你已经推送了不希望的提交,但尚未被其他人拉取,可以使用`git revert <commit>`创建一个新的反向提交来撤销它,然后再次推送。这将保留历史记录,表明有一个提交是用来修复之前的错误。 总之,Git的撤销功能...
综上所述,Git不仅解决了传统版本控制系统中存在的诸多问题,还凭借其分布式架构设计成为当今软件开发不可或缺的一部分。对于任何希望提高工作效率、保障代码质量的开发者来说,掌握Git的基本操作及其高级功能都是...
4. **提交**:通过`git commit`将暂存区的变更保存到历史记录中,附带提交信息。 5. **远程操作**:使用`git push`将本地变更推送到远程仓库,`git pull`用来获取并合并远程仓库的最新变更。 Git的学习曲线可能稍显...
如果需要回退到某个历史版本,可以使用`git reset --hard commit_hash`,但请注意这会丢失未提交的更改。 分支操作包括创建新分支`git branch new_branch`,切换分支`git checkout new_branch`,以及合并分支`git ...
进行版本控制的基本操作包括添加文件到暂存区(Stage)——使用`git add [filename]`,提交更改到本地仓库——`git commit -m "commit message"`,以及将本地更改推送到远程仓库——`git push origin [branchname]`...
- `git commit -m "Commit message"`:提交暂存区中的文件到仓库,并附带提交信息。 4. **版本查看** - `git log`:查看仓库的历史提交记录。 - `git log --pretty=oneline`:以简洁的方式显示历史记录。 - `...