git add 如何撤销 和 git commit 撤销方法,如何撤销git push
2017-08-09| 程成| 3993| 3| Git

在操作git时候,有时候在add或者commit后,想要撤销刚才的操作。接下来,我将介绍一些撤销命令。


注意:这些命令操作时不可逆的,一定要小心操作,避免数据的丢失。


一、撤销add操作


git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]:将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。


1)版本回退


可以使用git reset --hard 版本号


git reset --hard 139dcdfaa58ef376b3016b2e5cbab901bbdda96


查看版本号可以通过git log查看




2)撤销add修改(绿字变红字)


可以使用 git reset HEAD <file>... 的方式取消暂存


$ git reset HEAD benchmarks.rb
Unstaged changes after reset:
M       benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   README.txt
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   benchmarks.rb




3)撤销没add修改(红字变无)


可以使用 git checkout -- 文件名 撤销没有add过的文件


$ git checkout -- benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   README.txt





二、撤销commit操作


1) 找到上次Git commit的 id

     git log 

     找到你想撤销的commit_id


2)git reset --hard commit_id

      完成撤销,同时将代码恢复到前一commit_id 对应的版本。


3) git reset commit_id 

     完成Commit命令的撤销,但是不对代码修改进行撤销,可以直接通过git commit 重新提交对本地代码的修改。




三、撤销push到远端后的操作


以上命令可以完美解决git中撤销问题,如果你已经git push到远端了,可以执行下面步骤回退:


1)先在本地回退到相应的版本


git reset --hard <版本号>
// 注意使用 --hard 参数会抛弃当前工作区的修改
// 使用 --soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交


2)为了覆盖掉远端的版本信息,使远端的仓库也回退到相应的版本,需要加上参数--force


git push origin <分支名> --force


你也可以用 git revert 版本号 回退


git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61


git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit


看似达到的效果是一样的,其实完全不同.


第一:


上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.


第二:


如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.


第三:


reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.




×
作者:程成
QQ:492245711