美文网首页
Git reset revert区别

Git reset revert区别

作者: 怎样m | 来源:发表于2018-01-24 21:00 被阅读90次

    昨天手残 然后在GitHub for windows 上点了revert 然后就给重置了 更手残的是又给同步了 . 但是 GitHub 会保留之前的版本 . 只要删掉本次修改就可.

    解决方案: gitshell ->> git revert HEAD

    还原已经提交的修改
    此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交
    git revert HEAD 撤销前一次 commit
    git revert HEAD^ 撤销前前一次 commit
    git revert commit-id (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
    git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。

    1.reset revert区别

    • git reset是直接删除指定的commit,把HEAD后移动了一下

    • git revert是一次新的特殊的commit,HEAD继续前进,本质和普通add commit一样,仅仅是commit内容很特殊:提交的内容是与前面普通commit文本变化的反操作。比如前面普通commit是增加一行a,那么revert内容就是删除一行a

      由于reset方式HEAD指针后移,推送到远端时需要有强制更新权限或者删除分支权限,公司gforge设有权限限制,走不通。

    2.revert commit

    仅仅用于非merge操作的普通commit

    假设按时间顺序依次有commit1, commit2, commit3,commit4,对应有version1, version2, version3, version4四个状态.

    • revert某次commit(例子中commit4,commit4不是merge,那么revert后包括commit4以及后面的commit都会被抵消,最终文件状态为commit4前,即version 3状态)

      git revert commit4

    [master 3a2ea91] Revert "version 4"
    1 file changed, 1 insertion(+), 2 deletions(-)</pre>

    git status
    

    位于分支 master

    #您的分支领先 'origin/master' 共 1 个提交。#   (使用 "git push" 来发布您的本地提交)
    #
    无文件要提交,干净的工作区</pre>
    
    此时git push即可推送至远端
    
    push后有commit5(commit5即本次convert操作),对应着version5,刚好version5与version3的文件状态一致,因为version4及以后的修改被抵消掉了.
    
    revert过程有可能遇到冲突,要么git revert --abort终止此次revert操作,代码还原至revert命令前。要么手动消除冲突(同普通的冲突解决),然后add commit
    

    3.revert merge

    适用于merge操作的commit

    假设当前状态:

    commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e
    Merge: a2471f3 6a17d85
    本次属于merge commit,注意Merge 标注
    Author: 罗** luo**@youku.com
    Date: Fri May 20 11:03:53 2016 +0800

    merge
    

    commit a2471f331c36a21d25aa158668cdc05987eef114
    Author: 罗** luo**@youku.com
    Date: Fri May 20 11:03:01 2016 +0800

    verison 9
    

    commit 6a17d85b04e52eddeb2ecb2a311804e10dada1e6
    Author: 罗** luo**@youku.com
    Date: Fri May 20 11:02:10 2016 +0800

    version 8
    

    commit 9441871ec2ff071e1a5be41646a32b2aea0b5502
    Author: 罗** luo**@youku.com
    Date: Fri May 20 10:56:08 2016 +0800

    version 7
    

    </pre>

    可以看到94ce4b8是一次merge commit,Merge 标注为Merge: a2471f3 6a17d85,意思是说当前分支commit a2471f3(version 9),加上来自其他分支的commit 6a17d85(version 8).此时要撤销94ce4b8所表示的merge.

    如果不指定-m参数

    git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e
    error: 提交 94ce4b8dcb898f730e6eecd73c00491f8020b67e 是一个合并提交但未提供 -m 选项。
    fatal: 还原失败
    </pre>

    指定-m参数

    git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e -m 2

    位于分支 develop

    无文件要提交,干净的工作区
    </pre>

    -m参数含义:Merge 标注为Merge: a2471f3 6a17d85,传1表示撤销到a2471f3所代表的commit,传2表示撤销到6a17d85所代表的commit。数字1,2表示的是标注冒号后的位置编号

    上面例子中传参-m 2,所以撤销到6a17d85,最终文件状态与6a17d85 commit后一致(注意与上文差异),本例子中结果状态是“version 8”,不是version 7, git log确认结果如下:

    commit 290c2f72d8d56d6be1008807450d4635095a549b
    Author: 罗** luo**@youku.com
    Date: Fri May 20 11:32:34 2016 +0800

    Revert "merge"
    
    This reverts commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e, reversing
    changes made to 6a17d85b04e52eddeb2ecb2a311804e10dada1e6.</pre>
    

    相关文章

      网友评论

          本文标题:Git reset revert区别

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