git 的几种撤销操作
2018-03-08 本文已影响16人
崇山峻岭
git 撤销更改
总结一下希望以后不再记混淆, 也希望看到这里的同学不犯同样的错, 这里主要介绍一下几种错误的解决方案:
- 已修改未暂存内容的撤销
- 已暂存未提交内容的撤销
- 已提交未推送内容的撤销
- 已推送服务器内容的撤销
以上几种情况几乎覆盖到工作中常用的所有情况, 当然你要是有更复杂的情况, 那就只能再想想别的办法, 因为我这边只有两个人同时开发, 所以遇到的情况就这些, 下面说一下解决方案:
-
已修改未暂存内容的撤销. 这种情况一般是自己修改了很多东西, 但是突然领导说这些东西都不用了, 并且未来也不用了, 那么你很多修改过的文件想一下子撤回, 只需要用下面的一个命令即可,
//--hard 表示强制回到某个版本, head是指当前版本的原始状态, 这行完之后就完全回到了最后一次pull之后的状态 git reset --hard head
当然执行这个代码之前一定要先看看自己修改了那些内容, 在这中状态下执行下面的命令即可
git diff 执行结果如下 wangjunlingdeMacBook:MyDemo wangjunling$ git diff diff --git a/MyDemo/MyDemo/ViewController.m b/MyDemo/MyDemo/ViewController.m index 2c4d434..844ebbf 100644 --- a/MyDemo/MyDemo/ViewController.m +++ b/MyDemo/MyDemo/ViewController.m @@ -79,6 +79,9 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath NSLog(@"测试"); + NSLog(@"测试"); + + }
在终端中可以清晰看得出这次进行的增删改查的具体信息
-
已暂存未提交内容的撤销. 这种情况很少有但是如果发生了要有方法解决, 如果采取第1中情况的解决方案也是可以的, 但是有时候有些更改我们并不想全部放弃, 对于这种情况执行以下操作 :
//1. 可以先看看更改了什么, 这时候再执行 git diff 就什么都看不到了, 因为git diff 不带参数的时候对比的是当前版本的变化, 而通过 git add . 之后则需要对比的是 暂存区和当前分支的变化, 所以需要加一个head参数即: git diff head //2. 执行下面的命令可以撤销暂存, 保留当前的修改状态, 等调整之后再暂存提交即可 git reset head //执行上面的命令后, 再执行 git diff 如果有更改说明修改的内容已经从暂存区挪出来了
-
已提交未推送内容的撤销, 已经commit的更改, 突然发现某个地方修改错了, 想撤销, 但是又不能全部撤销, 所以我们可以通过下面的命令撤销commit
//同样的我们先去执行git diff 没内容, 再执行 git diff head 仍然没有信息, 为什么呢, 因为我们现在要对比的是 commit和head之间的不同, 所以我们需要加入两个要对比的版本的参数, 如下 git diff head^ head 执行完就能看到当前提交内容的修改, 然后执行 撤销操作 git reset head^ 这样代码就会回到上此来回来的状态, 并且新修改的代码都还在 如果执行 git reset --hard head^ 这样直接把修改的东西全都抛弃了, 并回到未修改前的状态
-
已推送服务器内容的撤销. 这种情况虽然比较危险但是如果抢救及时还是没问题的, 首先还是查看变化
//下面这条命令是查看你刚提交到远程端的代码和本地上个版本的不同, 也即是你提交的那部分代码的变化 git diff origin/head head^ //解决问题的思路是将本地的内容回退的上个版本, 修改之后再提交到远程端, 命令和第三种情况一样, 如果需要保留修改的代码, 那就不要加--hard, 如果不需要保留则需要加 --hard, 这里我们暂定需要保留 git reset head^ 执行完之后你的文件全部变成了未提交的状态, 这时候实际上你的版本已经落后服务器一个版本了, 所以当你修改完之后, git push 会被服务器拒绝, 信息如下 To github.com:wangjunling888/MyDemo.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@github.com:wangjunling888/MyDemo.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 解决方案 就是 用-f参数(force)强制执行覆盖操作, 当然这个操作之前一定要确定你的同事没有提交其他的代码, 要不然你把被人的代码都覆盖掉了就麻烦了, 命令如下 git push -f
好了, 就总结到这里, 技术有限, 如有疏漏或错误,欢迎留言区留言交流.