zoukankan      html  css  js  c++  java
  • Git-撤销(回退)已经add,commit或push的提交

    本文只阐述如何解决问题,不会对git的各种概念多做介绍,如果有兴趣可以点击下面的链接,进行详细的学习:
    Pro Git
    本文适用的环境

    现在先假设几个环境,本文将会给出相应的解决方法:
    1. 本地代码(或文件)已经add但是还未commit;
    2. 要回退的commit的代码已经commit了,但是还未push到远程个人repository
    3. 要回退的commit的代码已经push到远程的个人分支,但是还未merge到公共的repository
    4. 要回退的commit的代码已被merge(合入)到公共的repository
    关键的几个命令

    git reset [commit]
    git revert [commit]

    git reset有三个参数soft,mixed,hard分别对应head的指针移动,index(暂存区)、以及工作目录的修改,当缺省时,默认为mixed参数。
    git revert与reset的区别是git revert会生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留,也就是说对于项目的版本历史来说是往前走的。而git reset 则是回到某次提交,类似于穿越时空。
    相应的解决方法

    1、 对于上面的前两种情况,我们可以直接使用git reset命令。根据需要的不同使用,不同的参数。但是要注意

    git reset –hard 

    是一个危险的命令,他是git少数几个会销毁数据的命令之一,如果你不小心放了错,你也许可以使用

    git reflog

    命令来找回你的数据。
    2、 对于第三种情况,如果你的远程分支只有你一个人用的话,那么可以在先使用git reset [commit]回退,如何使用git push -f [commit]来强制更新你的远程库2

    3、 对于最后一种情况,考虑到其他人的版本历史,使用git reset [commit]是不建议的,此时我们应该使用git revert [commit]改命令不会修改之前的提交历史,相当于对数据做了一次逆操作,然后再执行add,commit等命令。
    总结

    对于前三种情况,虽然git revert也适用,但是如要要保持版本历史干净的话,建议还是用 git reset3,但是希望保留完整的历史的话,还是使用git revert为好。对于和其他人协同的项目,使用git rever是最好的。

  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/9945732.html
Copyright © 2011-2022 走看看