美文网首页
git reset --hard xxx 、 git reset

git reset --hard xxx 、 git reset

作者: 饥人谷_目子夏 | 来源:发表于2018-12-15 11:24 被阅读0次

    这三条命令都是撤销命令

    背景知识

    • HEAD

    这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交

    • Index

    index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit

    • Working Copy

    working copy代表你正在工作的那个文件集

    使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。

    1.git reset --soft xxx

    • 移动HEAD所指向的分支,使分支指向该提交,而不改变索引和工作目录,即此时的暂存区、工作目录与使用该命令前一致。如下:
      git reset --soft <commit>

    • 刚开始有三个commit,对应三个消息,然后我们创建一个READ.md文件添加上去,在添加消息"add READ".


      1
    • git log命令显示当前分支的历史commit

      2
    • 显示工作区与HEAD指向的commit之间的差异'git diff HEAD'

    • 然后我们使用git reset --soft 02797b命令,到消息为add d这个版本,然后在使用git diff HEAD查看,发现HEAD指向的02797b这个commit跟我们的现在工作区的差异,我们的工作区比HEAD指向的版本多了一个READ.md文件
    3
    • 所以--soft参数告诉Git重置HEAD到另外一个commit,但也到此为止。如果你指定--soft参数,Git将停止在那里而什么也不会根本变化。这意味着index,working copy都不会做任何变化,所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中。


      图片.png

    2.git reset --hard xxx

    移动HEAD所指向的分支,使分支指向commit,并用commit快照的内容更新暂存区、工作目录。--hard标记是reset命令唯一危险的用法,它会强制覆盖工作目录、暂存区中的修改。这也是Git会真正销毁数据的仅有几个操作之一。如下:
    git reset --hard <commit>

    • git log命令显示当前分支的历史commit

      2
    • git reset --hard 02797命令回到02797commit,用git diff HEAD查看,发现HEAD指向的02797b这个commit跟我们的现在工作区没有差别。

      3
    • 所以--hard参数将重置HEAD返回到另外一个commit,重置index以便反映HEAD的变化,并且重置working copy也使得其完全匹配起来。这是一个比较危险的动作,具有破坏性,数据因此可能会丢失!


      4

    3.git revert

    • git revert 的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。
    • 我使用git revert -n版本号反做

      5
    • 这里可能会发生冲突,所以我touch READ.md,然后git add .,然后git commit -m "revert"

    6
    • 最后的效果


      7

    相关文章

      网友评论

          本文标题:git reset --hard xxx 、 git reset

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