zoukankan      html  css  js  c++  java
  • git使用笔记(七)版本回退和撤销

    By francis_hao    Nov 21,2016

    从版本库初始化开始,每一步的撤销操作

    添加第一个文件

    在空的版本库中创建了一个文件并git add到了缓存区,这时候怎么撤销呢?

    撤销单个文件和整个目录

    $ git rm --cached a
    $ git rm --cached . -r

    首次commit内容不能撤销,不过一旦提交了一次之后,git就能发挥它强大的版本控制作用了

    修改了文件

    在本地修改了文件,但是还没有add操作,也就是撤销本地的修改

    撤销单个文件和整个目录,"--"虽然可以省略,但还是以规范为重。表示检出文件,而不是分支

    $ git checkout -- a
    $ git checkout -- .

    add了修改的文件

    将修改的文件add到了缓存区,后悔了想撤销但本地的修改不变

    撤销单个文件和整个目录

    $ git reset HEAD c
    $ git reset HEAD .

    reset有几种模式,默认模式为mixed,也就是将版本库和缓存区里的重置,但本地文件不动。

    commit了修改的文件

    将修改的文件commit到版本库里了,若需要撤回到之前的版本,如下图,共有5次提交,目前在E位置,想回到C位置

    $ git reset --hard C_value

    这样就直接回到C位置,后面的两次提交被舍弃了。当然还可以通过git reflog查看哈希值再返回。

     

    还有一种方式是,HEAD保留在E位置,但是,工作目录里的所有文件替换称C位置的。

    $ git checkout C_value -- .

     

     

    撤销某次提交

    还是以上面的5次提交为例,发现在C提交的内容中引入了错误,需要取消C的提交,但是C之后的D和E提交需要保留。

    以我的理解,git的具体做法是将B、C和E三者进行比较(至于如何比较参考下文附注),如果可以合并,git会自动合并,如果不能自动合并,就需要手动解决冲突了。

    $ git revert C_value

     

     

    如果有冲突,不想解决,想取消revert

    $ git revert --abort

    有冲突,解决了之后

    $ git add <file_that_conflict>
    $ git revert --continue

    其中add为了让git知道冲突已经解决了,根据需要add也许是rm或mv

    附注

    在使用git revert时,有一个问题困扰了我很久,就是git是如何实现合并的,因为有时候觉得明明可以合并的却出现了冲突,下面以几个实验说明自己的猜想

    自动合并成功举例

    第一个例子是可以成功合并的,没有冲突发生,选取了B、C、D和E四个位置的文件内容。其中D位置认为没有作用。认为文件有两处差别,分别用1和2表示,1B表示第一处差别的B位置。

    合并后的结果如下

    根据合并后的结果推断合并过程

    1B≠1C=1E    =>差别删除

    2B=2C≠2E    =>差别保留

    自动合并失败举例

    第二例自动合并失败,提示有冲突,此处认为仅有一处差别

    推断合并过程

    1B≠1C≠1E    =>自动合并失败

    自动合并成功-补充

    本例也是和并成功的例子,和第一例不同处仅仅为1C处的修改,但并不会影响结果。是不是就可以说明D位置不会参与比较合并的过程呢?

     

     


    本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
    转载自:http://www.cnblogs.com/yinghao1991/p/6091613.html

     

    参考

    [1] git help revert

    [2] 廖雪峰 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git教程

    [3] geeeeeeeeek/git-recipes https://github.com/geeeeeeeeek/git-recipes/wiki/ 代码回滚:Reset、Checkout、Revert的选择

  • 相关阅读:
    [bzoj1280]卖猪
    [51nod1237]最大公约数之和V3
    [cf741C]Arpa’s overnight party and Mehrdad’s silent entering
    [bzoj1576]安全路径
    [bzoj1143]祭祀
    db_writer_processes默认大小
    oracle审计功能启动关闭
    db_writer_processes默认大小
    手机发博客
    第27课 .net程序破解
  • 原文地址:https://www.cnblogs.com/yinghao-liu/p/6091613.html
Copyright © 2011-2022 走看看