`
dbp_cn
  • 浏览: 85605 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

恢复 git reset -hard 的误操作

    博客分类:
  • git
git 
阅读更多

转自:http://www.cnblogs.com/mliudong/archive/2013/04/08/3007303.html

有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 reset, rebase 和 merge。甚至一些很小的操作,例如删除一个分支,我都担心数据丢失。

不 久之前,我在做一些大动作(rebasing)之前,我总是备份整个版本库,以防万一。直到最近我才发现git的历史记录是不可修改的,也就是说你不能更 改任何已经发生的事情。你做的任何操作都只是在原来的操作上修改。也就是说,即使你删除了一个分支,修改了一个提交,或者强制重置,你仍然可以回滚这些操 作。

让我们来看一些例子:

$ git init
$ touch foo.txt
$ git add foo.txt
$ git commit -m "initial commit"

$ echo 'new data' >> foo.txt
$ git commit -a -m "more stuff added to foo"

你现在看git的历史记录,你可以看到两次提交:
$ git log
* 98abc5a (HEAD, master) more stuff added to foo
* b7057a9 initial commit

现在让我们来重置回第一次提交的状态:
$ git reset --hard b7057a9
$ git log
* b7057a9 (HEAD, master) initial commit

 

将重置推送到远程分支:git push -f -u origin pj_migrate_1(分支)


这看起来我们是丢掉了我们第二次的提交,没有办法找回来了。但是 reflog 就是用来解决这个问题的。简单的说,它会记录所有HEAD的历史,也就是说当你做 reset,checkout等操作的时候,这些操作会被记录在reflog中。

$ git reflog
b7057a9 HEAD@{0}: reset: moving to b7057a9
98abc5a HEAD@{1}: commit: more stuff added to foo
b7057a9 HEAD@{2}: commit (initial): initial commit

所以,我们要找回我们第二commit,只需要做如下操作:
$ git reset --hard 98abc5a

再来看一下 git 记录:
$ git log
* 98abc5a (HEAD, master) more stuff added to foo
* b7057a9 initial commit

所以,如果你因为reset等操作丢失一个提交的时候,你总是可以把它找回来。除非你的操作已经被git当做垃圾处理掉了,一般是30天以后。

分享到:
评论

相关推荐

    Git的一些高级用法,你应该不知道?.docx

    - 如果误操作重置了一个不想丢失的提交,可以通过`git reflog`找出该提交,然后用`git reset --hard <commit>`恢复。 - `git fetch -p`和`git push origin --delete`组合可以删除远程仓库中不存在的分支。 5. **...

    git常用命令总结.txt

    ### git常用命令总结 在日常开发工作中,Git作为版本控制系统被广泛使用,它能帮助团队高效地管理代码版本,提高...需要注意的是,在实际操作过程中,应仔细确认命令执行的结果,避免误操作导致的数据丢失或其他问题。

    git常用操作

    **命令:git reset --hard <commit_id> / git reset --hard HEAD^** - **功能**:将工作目录恢复到指定提交的状态,同时更新暂存区。 - **应用场景**:当你想要放弃最近的一些提交并回到之前的某次提交状态时使用。...

    Git速查手册.pdf

    - `git reset --hard commit_id` (其中commit_id是通过`git log`获取的特定提交ID) #### 六、工作区和暂存区 - **工作区**:实际工作的目录,存放项目文件。 - **暂存区**:位于`.git`目录下的一个文件,保存即将...

    Git-SVN面试题,都是来自工作中的笔记

    撤销操作是Git中非常重要的一项功能,可以帮助开发者在误操作后恢复项目状态。 1. **撤销提交到索引区的文件**: - 使用 `git reset HEAD <file>` 可以将文件从索引区移除,回到工作目录状态。 2. **撤销提交到...

    GIT入门常用指令(PDF带标签图解命令)

    可以使用`git reset --hard commit_id`命令将HEAD指针回退到指定的历史版本。如果想返回到上一个版本,可以使用`git reset --hard HEAD^`。若要查看提交历史,可以使用`git log`。如果误删除文件,可以使用`git ...

    git总结1

    5. **误操作恢复**:若使用`git reset --hard`后丢失了工作区的更改,可以通过`git reflog`查看历史操作,找到丢失的提交哈希,然后使用`git reset --hard <commit-hash>`恢复。 ### 提交代码 6. **补充提交**:...

    Git学习资料

    - **命令**: `git reset --hard <commit_id>` - `<commit_id>`为需要回退的目标版本ID。 - **检查历史命令**: `git reflog` - 提供了一个快速找回误操作的方法。 - **比较文件**: `git diff HEAD -- <filename>` ...

    git 命令的收集以及总结分享学习

    - **应用场景**:当你误操作后,可以通过`git reflog`找到对应的commit ID来恢复到特定的状态。 2. **`git reset --hard HEAD^`** —— 将当前分支回退到上一个提交版本。这里的`HEAD^`表示当前分支的上一个提交。...

    git.zip配置

    - 版本回退:`git reset --hard <commit_id>`可以回退到指定版本。 4. ZIP文件与Git: - 通常,Git不跟踪二进制文件,如ZIP,因为它们变化不易察觉且占用大量存储空间。 - 如果必须版本控制ZIP文件,可以考虑将...

    github使用31

    例如,当你执行 `git reset --hard <commit_id>`,你的代码库将立即回到指定的提交状态,所有后续的提交都会丢失。 相比之下,`git revert` 是创建一个新的提交,这个提交的内容与要revert的提交正好相反,以此达到...

    Git使用技巧.docx

    在需要回溯或前进版本时,`git reset --hard`配合特定的版本号(从`git log`获取)可以实现。如果忘记了版本号,`git reflog`会记录所有Git操作,帮助你找回丢失的版本信息。 此外,Git还提供了撤销更改的功能。...

    学习Git基础的第一天

    如果误删除的文件是最新版本,可以利用`git reset`命令回到删除操作之前的状态。 在Git中,分支是一种很重要的概念。分支可以理解为指向版本库中某个提交点的指针。在默认情况下,Git会创建一个名为master的分支。...

    Git常用命令

    如果某个文件被误修改,可以撤销对它的修改,恢复到最后一次提交的状态。 4. 查看分支引用记录:`git reflog` 这个命令可以帮助开发者查找和切换到任何之前的版本。 **五、查看文件修改记录** 为了方便追踪代码...

    SVN,HG,GIT命令对照.pdf

    - 检出某个修订版本:git reset --hard -r - 新增被跟踪文件:git add [file_path] - 移除被跟踪文件:git rm [file_path] - 生成补丁:git diff > patch_file - 提交更改:git commit - 查看当前状态:git status ...

    Git恢复之前版本的两种方法reset、revert(图文详解)

    在开发过程中,由于误操作或者需要撤销某些提交,Git 提供了两种恢复之前版本的方法:`git reset` 和 `git revert`。这两种方法各有其适用场景,理解它们的区别和使用方法对于有效地管理代码历史至关重要。 1. **...

Global site tag (gtag.js) - Google Analytics