美文网首页L_Git开发环境ios
Git后悔药之代码回退

Git后悔药之代码回退

作者: Sunny旋律 | 来源:发表于2016-08-25 16:06 被阅读7503次

1、撤销操作

git.png

一来就是一张大图,如果不太了解git的人会有点蒙,下面简单解释一下(都是我个人的理解,如果不妥还请指正),git仓库的初始化以及clone这些在这里就不讲了,请自行百度。

远程仓库:就是在github或者在gitlab上的代码。可以用git pullgit push来进行本地仓库和远程仓库的同步操作。

版本库:每一次的commit都会生成一个记录,每个记录都有一个hash值来唯一标识,很多很多的commit就形成了版本库。为什么图上有两个版本库?那是因为上面那个版本库是commit前,下面那个版本库是commit后。

工作区:当我们把远程仓库的代码clone下来后,一般会默认在分支master上,此时,该分支的所有代码都在本地,这就是当前的工作区,以后的每一次commit都会在这个分支上记录。

暂存区:这个应该大家最容易理解错的,也是用习惯了svn的朋友最不理解的地方。每次修改了代码后,都需要用git add来讲工作区的修改记录到暂存区,然后我们再用git commit来讲暂存区的内容提交到版本库,当然这里也可以用git commit -a命令一步到位

上面这张图就简单描述了我们每次的修改,用什么命令流转到什么区的一个示意图。

2、版本回退

前提条件:已经执行git commit命令了,但是没有push到远程仓库,用以下命令可以回退

git reset --hard HEAD^

上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100其实这个回退就是将本地的HEAD指针移动到某个版本上而已,所以这个操作是非常快的。

git log    [查看commit记录]
//这个3628164 是一个commit版本号,可以指定回退到那个版本
git reset --hard 3628164 

查看提交记录,也能看到每一次提交的版本号,这是一个很长的哈希值,这个时候我们通过这个版本号可以指定回退到某个版本上,用这个版本号的时候可以只用它前面几位,具体几位看你心情咯,只要能唯一标识这个版本就ok。

git reflog [查看本地会影响HEAD指针的命令操作记录,这个不会同步到远程仓库]

强调一下,注意这里是记录的会影响HEAD指针的操作记录。
简单举例说一下这个git reflog的使用场景。git reflog
假如当前我有三次提交,再假设三次提交的版本号分别为commitnum1,commitnum2,commitnum3,并且我当前处于commitnum3这个版本上(也就是HEAD指向了commitnum3),这个时候我用命令git reset --hard commitnum2就回退到了comminum2了,好,问题来了,如果突然又想回到commitnum3怎么办呢,当然你可以翻看上去看记录,那个版本号还能看到,但是如果这是第二天了,已经翻不上去了就麻烦了,这个时候git reflog就出场啦,他可以看到你昨天执行git reset --hard commitnum2命令的时候的所在版本号,这个时候就可以用git reset --hard commitnum3来恢复回去。

git_reflog.png

这个结果分三部分,前面黄色的文字就是执行那次命令时所在的版本号,中间的HEAD@[0]是就是HEAD指针变更记录,最后面就是那次命令所做的事情。

最后再啰嗦一点,如果这些commit都还没有同步到远程仓库,你reset后那些commit记录是不会被同步上去的。但是,如果已经同步上去了,就算你本地reset了,虽然本地工作区内容变成了你想要的了,但是记录就抹不去了。

参考:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

相关文章

  • Git后悔药之代码回退

    1、撤销操作 一来就是一张大图,如果不太了解git的人会有点蒙,下面简单解释一下(都是我个人的理解,如果不妥还请指...

  • git回滚和强制提交

    Git回滚代码到某个commit 回退命令:git reset --hard HEAD^ 回退到上个版本 git ...

  • git强制回滚版本

    Git回滚代码到某个commit回退命令: git reset --hard HEAD~3 回退到前...

  • git实践总结

    场景一:代码回退 情景二:回退代码丢失找回代码 git reset –hard HEAD^的锅 情景三:Merge...

  • git 代码回滚

    Git回滚代码到某个commit 回退命令:

  • Git版本回退

    当我们对当前版本的代码不满意时,想要回到以前某个版本时,Git有后悔药让我们吃,下面就介绍几个版本回退的命令。 在...

  • 常用git命令

    1.git版本回退命令: git reset --hard HEAD~4(一旦修改所有代码回到该版本,数字代表回退...

  • git  提交代码常用命令

    代码回退: git reset --hard HEAD^切换分支:git checkout name撤销修改:gi...

  • 【Git】reset

    git reset HEAD^0 上一次提交--hard 回退commit+本地代码--soft:回退commit...

  • git 本地代码回滚&&强制更新远端代码 / 本地不想回滚&

    文章参考 git本地版本回退与远端版本回退(回滚) 本地代码回滚&&强制更新远端代码 如果已经提交代码到maste...

网友评论

  • 072affb5bd91:评论区不能贴图片,我想请教一下楼主,reflog里面多个HEAD->master代表啥意思,提问链接是https://segmentfault.com/q/1010000016591925
    Sunny旋律:HEAD你理解为一个指针,代表当前指向的是哪个分支或者哪一个commit
  • 红叶XI:学习了:
    1.git reset --hard HEAD^

    话说 git reset --hard 3628164 是什么鬼?

    2.git reflog
    红叶XI:@Sunny玄子 可以 很强
    Sunny旋律:@HappyGui
    1、那一串数字其实是commit的版本号,取前几位只要能唯一标识就ok,就是说回退到那一次的commit。
    2、git reflog就是查看本地的会影响HEAD指针变更的命令操作记录,每执行一次相关命令就会记录一次,并且记录你那次命令执行时所在的版本号。
    感谢你的阅读和提问,针对你的提问我重新丰富了一下这方面的内容,你可以再看一下,如果有不清楚的地方,欢迎再提问
    Syuusuke:@HappyGui commit的Id
  • hainuo:讲的很好
    Sunny旋律:@hainuo 谢谢

本文标题:Git后悔药之代码回退

本文链接:https://www.haomeiwen.com/subject/gvlasttx.html