`
songbin0201
  • 浏览: 323578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

git引发的血案(cherry-pick找回丢失的commit)

 
阅读更多
git 的错误操作,导致丢失了重要的commit,真是痛不欲生;
最后通过git神器终于找回了丢失的commit,但是需要总结和反思的地方有一些,同时需要加深git的学习,特献上本文以供参考

执行git reset --hard HEAD~1 ,删除了commit3,但是发现reset错了,晕菜了……
还好有后悔药(感叹git的强大啊,神马意外情况都考虑到了)满血恢复commit3,执行如下步骤:
git reflog
502dd0f HEAD@{0}: HEAD~1: updating HEAD
147b3b5 HEAD@{1}: commit: test3
502dd0f HEAD@{2}: commit: test2
0692c03 HEAD@{3}: commit (initial): test1

git reset --hard 502dd0f
git cherry-pick 147b3b5


丢失的commit3终于回来啦~~~~
虽然有利器,但是需要总结和反思的是,慎用reset hard啊,实在不行reset merge也是不错的选择。

===================================================

通过这次错误的使用reset,反思需要加强对reset的了解,不能再盲目的使用了

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
作用:将当前分支reset到指定的<commit>或者HEAD(默认为最新的一次提交,即重设到最新一次提交之前的版本)

备注:
       index,执行git add的操作,会对文件创建索引,所有被跟踪的文件索引会放入index,表示文件被修改待提交
       working tree,当前工作区,被修改但未被add的文件,存储在工作区
       ORIG_HEAD,用于指向前一个操作状态,每次的commit或者pull或者reset,git 都会把老的HEAD拷贝到.git/ORIG_HEAD,通过对ORIG_HEAD的引用可    以指向前一次的操作状态

1、hard(慎用)
重设index和working tree,所有改变都会被丢弃,包括文件的修改、新增、删除等操作,并把HEAD指向<commit>,
因此通过git log查看版本提交记录,被reset的版本记录会被丢弃,但可以通过git reflog查看

2、soft
不重设index和working tree,仅仅将HEAD指向<commit>,表示已经commit的文件会取消commit,
通过git status查看,文件会处于待commit状态“Changes to be committed”

3、mixed(默认)
重设index,但不重设working tree,表示已经被add的文件,被取消add,
通过git status查看,文件会处于待添加索引状态 “Changes not staged for commit”

4、merge
重设index,重设working tree中发生变化的文件,但是保留index和working tree不一致的文件

5、keep
重设index,重设working tree中发生变化的文件
分享到:
评论
2 楼 styl_007 2015-07-13  
fuzhuo233 写道
Hi.
比较疑惑的是这些历史如reflog会什么时候会被删掉。还是git本身像熵一样只能增加不能减少,所有操作都记录在案
像就如果在HEAD打了TAG,调用git reset --hard xxx之后,还是可以通过git check TAG恢复回来

git gc 的时候会把临时信息删除 包括git apply这个命令的commit
1 楼 fuzhuo233 2014-04-14  
Hi.
比较疑惑的是这些历史如reflog会什么时候会被删掉。还是git本身像熵一样只能增加不能减少,所有操作都记录在案
像就如果在HEAD打了TAG,调用git reset --hard xxx之后,还是可以通过git check TAG恢复回来

相关推荐

    git 一个可以提高开发效率的命令:cherry-pick详解

    例如,如果你有100个commit需要从`commit1`到`commit100`,你可以执行`git cherry-pick commit1..commit100`。但需要注意,`commit1`不会被包含,而`commit100`会被包含。 ### 4. 暂存`cherry-pick` 有时候,你...

    git cherry-pick 简单使用md,学习代码

    git cherry-pick commit1^{commit}..commit2^{commit} ``` 这里,`^{commit}` 表示获取提交的父节点。 ## 三、解决冲突 当 `cherry-pick` 遇到冲突时,Git 会暂停操作,等待你解决冲突。冲突解决后,记得执行 `...

    learn-git-cherry-pick:一个展示如何使用基本的cherry-pick 命令的repo

    $ git cherry-pick commit1 commit2 commit3 ... commitN (1) 每个提交都引用一个 SHA-1 哈希值。 请注意,在命令中只给出哈希值的前七个字符(即ab8s001 )是合理的。 如果您的cherry-pick 命令在复制命令中指定...

    ZhongJinHacker#notes#git_cherry-pick总结1

    cherry-pick : 精心挑选,挑选一个我们需要的 commit 进行操作。它可以用于将在==其他分支==上的 commit 移植到==当前的分支==。

    Android代码-maven-git-commit-id-plugin

    maven git commit id plugin git-commit-id-plugin is a plugin quite similar to ...

    Git官方最新版下载 Git-2.18.0-64-bit 64位Windows版本

    - `git cherry-pick`:从一个分支挑选特定的提交应用到另一个分支。 - `git blame`:查看每一行代码是谁在何时修改的。 6. Git与GitHub、GitLab等平台的结合: - GitHub、GitLab等提供了基于Git的代码托管服务,...

    Git-2.28.0-64-bit git安装包windos64位官方下载

    3. **Cherry-pick**:`git cherry-pick`可以将某个特定的提交应用到其他分支,用于共享或复制功能。 4. **Submodule**:Git的子模块功能允许你在项目中嵌入其他Git仓库,便于管理依赖的项目。 以上就是关于Git-...

    Git-2.15.1.2-64-bit

    - 提交更改(`git commit`) - 查看状态(`git status`) - 创建和切换分支(`git branch`和`git checkout`) - 合并分支(`git merge`) - 推送到远程仓库(`git push`) - 从远程仓库拉取更新(`git pull`) 了解...

    Git-2.30.0-64-bit.exe

    - `git commit`:将暂存区的改动提交到本地仓库,附带提交信息。 - `git push`:将本地仓库的改动推送到远程仓库。 - `git pull`:从远程仓库拉取并合并最新的改动到本地。 - `git branch`:查看、创建和删除分支。 ...

    Git基本使用_嵌入式-常用知识&面试题库_大厂面试真题.docx

    * cherry-pick 一个 commit:`git fetch ssh://xxx@xxxx/xxx/xxx refs/changes/20/190820/6 && cherry-pick FETCH_HEAD` * 查看当前 commit:`git log` * 修改代码,然后提交到本地:`git add . && git commit --...

    Git-2.42.0.2-64 Window64位安装包 - 最新版

    4. 命令行工具:Git Bash提供了一个类似于Linux终端的环境,用户可以使用Git命令行工具进行各种操作,如`git clone`、`git add`、`git commit`和`git push`等。 5. 图形界面:除了命令行,Git还提供图形用户界面...

    前端开源库-git-pre-commit

    标题中的“前端开源库-git-pre-commit”指的是一个用于前端开发的开源工具,它与Git的预提交钩子(pre-commit hook)相关。Git预提交钩子是在提交代码之前执行的一段脚本,允许开发者在正式提交前进行一些检查或自动...

    git-2.18.0-3264合集

    5. 高级命令:Git提供了一系列高级命令,如`git rebase`用于整理提交历史,`git cherry-pick`用于选取特定提交应用到其他分支,以及`git bisect`用于快速定位bug。 在Git 2.18.0中,值得注意的新特性和改进包括: ...

    Git-2.19.1-64-bit.exe

    一些常用的Git命令包括:`git clone`用于克隆远程仓库,`git add`将文件添加到暂存区,`git commit`提交更改,`git push`将本地更改推送到远程仓库,以及`git pull`用来拉取并合并远程仓库的最新更改。 除了命令行...

    Git-2.24.0.2-64-bit.zip

    在协作环境中,Git的特性如代码审核(`git rebase`和`git cherry-pick`)、分支策略(如特性分支和主分支)以及冲突解决机制,都有助于团队成员有效地协同工作。同时,Git与GitHub、GitLab等平台的结合,提供了代码...

    Git-2.10.2-64-bit (windows版)

    Windows Git 2.10.2 64-bit

    Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.3

    3. 提交更改:使用`git commit -m "commit message"`将暂存区的更改保存到仓库,创建一个新的提交。 4. 创建分支:通过`git branch &lt;branch_name&gt;`创建新的分支,然后用`git checkout &lt;branch_name&gt;`切换到该分支。 ...

    Git-2.12.0-64-bit

    在实际工作中,Git的使用技巧包括合理命名分支、定期拉取更新、使用.gitignore文件排除无关文件、编写有意义的提交信息以及熟练掌握rebase、merge和cherry-pick等高级操作。同时,理解并掌握Git的工作流,如Git Flow...

    test-git-merge-cherry-squache

    标题 "test-git-merge-cherry-squash" 暗示了这个压缩包可能包含一个与Git操作相关的示例或教程,特别是关于`git merge`、`git cherry-pick`和`git squash`的实践。Git是分布式版本控制系统,这些命令在版本管理和...

    git-cheatsheet-EN-white.pdf

    从提供的文件内容来看,这是一份Git命令速查表。Git是一个版本控制系统,它可以帮助程序员对代码进行版本管理。这份速查表涵盖了基础的Git操作,包括创建分支和标签、合并与变基、处理本地更改、撤销更改、提交历史...

Global site tag (gtag.js) - Google Analytics