Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存

相关文章:

关于验证是否存在ssh配置以及生成SSH Key的方法可以参照文章:Git使用手册:生成SSH Key
关于SSH Key的使用和公钥在gitHub、gitLab的配置等,请参考文章:Git使用手册:使用SSH Key及配置SSH key公钥
关于GIT 工作区、暂存区、本地仓库、远程仓库的概念及关系,请参考文章:Git使用手册:工作区、暂存区、本地仓库、远程仓库
关于GIT 从远程仓库下载项目到本地工作区的操作,请参考文章:Git使用手册:git clone 克隆下载远程仓库项目工程到本地工作区

关于GIT Checkout的使用,请参考文章:Git使用手册:git checkout 创建分支、切换分支

关于Git status命令使用解读,请参考文章Git使用手册:git status 查看本地工作区、暂存区中文件的修改状态

关于Git diff和Git add命令使用,请参考文章:Git使用手册:git diff 、 git add 、 git diff --cached 命令详解

关于Git commit命令使用详解,请参考文章:Git使用手册:git commit -m/-am/-a -m 提交文件至本地仓库区

关于Git fetch命令使用,请参考文章:Git使用手册:git fetch 将远程仓库的分支及分支最新版本代码拉取到本地

关于Git pull命令使用,请参考文章:Git使用手册:git pull origin 拉取代码到本地,解决拉取代码时发生的文件冲突

关于Git push命令使用,请参考文章:Git使用手册:git push 推送提交本地仓库代码文件到远程仓库

关于Git reflog命令使用,请参考文章:Git使用手册/Git教程:git reflog使用、查看历史版本记录


1)找回删除的版本代码并创建新分支

结合上一篇文章Git使用手册/Git教程:git reset使用/git reset mixed soft hard使用详解及区别/git代码版本回退,在最后进行git reset --hard 操作后,不会保留指定版本后的代码,同时git log中也无法看到指定版本后的提交版本历史,若我们想找回丢掉的某一版本的代码的话,可以使用如下命令:

命令: git checkout -b 分支名称 commit id

作用:根据指定的commit id的版本内容创建一个新分支,从而新分支的内容就是指定版本的内容。

结合上一篇文章,我们先使用git reflog 查看提交版本历史记录:

Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存

上图中,是我们使用git reset --hard 后,git reflog的结果,其中版本为7cd6092版本的代码已经不存在了。

若我们想要找回7cd6092版本的代码的话,可以使用我们之前的提到的命令,执行结果如图:

Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存

如图,此时我们已经创建了一个名为backup-code的分支,切换到指定分支后,即可看到版本7cd6092的代码内容。

或使用如下命令:

命令:git branch 分支名称 commitId

该命令同样能达到git checkout -b 分支名称 commitId 命令产生的效果,根据指定commitId版本的内容创建新分支。

至于二者的区别,请参考我之前的文章:

2)git reflog与git log的区别

看过我之前的文章Git使用手册/Git教程:git reset使用/git reset mixed soft hard使用详解及区别/git代码版本回退的小伙伴应该会有所留意,在上一篇文章中,不只一次使用了git log 和git reflog来查看提交版本历史记录,但并未对二者做出解释,这里对其解释一下:
借用上一篇文章中的图片:
当我们使用git reset命令进行回退后(这里不考虑选项,因为要说明的是git reflog和git log,且git reset的选项不影响结果),我分别使用了git log 和git reflog来查看提交版本历史记录,如下图所示:
git log执行结果:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
git reflog执行结果:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
注:此处的图片摘自上一篇文章:Git使用手册/Git教程:git reset使用/git reset mixed soft hard使用详解及区别/git代码版本回退中执行git reset --mixed HEAD~2命令部分,可以copy红色字体命令到文章中查找,查看具体内容。

从上图中我们可以看到,同样是显示了5条记录,git log中第一条记录的commit id为c3b8692,与git reflog第一条记录的commit id相同;git log中的第二条记录的commit id为33cbf73,而git reflog却为c769c03,从这里发现两条命令显示的结果不同了。

原因是因为:
git log 查看的提交版本历史记录中,不包含因git reset等回退命令导致已经消失的commit提交历史记录。
git reflog 查看的是该项目所有的提交版本历史记录,包含各种操作命令(如checkout、commit、reset、pull等等git指令)的提交版本历史记录,更为具体,相当于操作日志。

故使用场景是不同的,上一篇文章之所以要将二者均使用的原因,是想要展示常规下有效的版本记录查看的情况,同时结合 git reflog的所有提交版本历史记录,一同在进行reset操作时更为直观的看到发生的变化。

当需要进行回退时,同样建议小伙伴也结合2个命令一同使用。


3)取消暂存区文件的暂存

当我们在当前工作区对若干个文件进行编辑,并存入了暂存区后,发现其中存在未完成功能代码或编写错误的内容的情况,不能将涉及到这些问题的文件提交到本地仓库时,可以将指定的文件从暂存区中撤回,这样不会影响到其他文件的提交,便于后续使用。
命令: git reset HEAD fileName
其中fileName可以为绝对路径,也可以为相对路径。
首先我们先对文件进行修改,修改后查看文件状态:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
图中我们看到,文件已经发生了修改,并未存入暂存区中。
此时我们再进行存入暂存区操作,并查看当前工作区的状态,如图:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
可以看到,存入暂存区后,查看状态时提示,变更可以被提交。证明修改的文件已经存入了暂存区中。
此时若我们发现文件内容出现了问题,无法提交的话,需要执行上面提到的命令:git reset HEAD fileName,
执行后如图所示:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
执行后,可以看到,出现了一行提示:Unstaged changes after reset ,表示变更未暂存。
我们再次查看本地工作区,如图:
Git使用手册/Git教程:找回删除的版本代码/git reflog与git log的区别/取消暂存区文件的暂存
发现确实文件已经回到了工作区中,处于待暂存状态。






如您有其他问题,希望可以通过留言得形式及时交流,有书写错误和可优化的地方也希望及时提出,感谢。