git撤销操作

撤销误添加暂存区文件

1
2
#无论是创建新增还是修改新增
$git reset HEAD <file>

commit覆盖

1
2
3
4
5
6
7
8
9
#处理少commit但不想多显示提交的记录
$git commit -m 会被覆盖
$git add <file>
$git commit --amend
#vim编辑前一笔提交信息
#没有会被覆盖的提交记录
$git reflog
17bd775 (HEAD -> master) HEAD@{0}: commit (amend): 忘记提交了代码,否则编译出错
589173d HEAD@{1}: reset: moving to 589173d

撤销工作区文件修改

1
2
#这些操作是非常<span color="red">危险</span>的,对这个文件的任何修改都会消失
$git checkout -- <file>

git reset命令

要理解reset命令,先理解git的结构,具体可以参考git重置

  • soft 只移动HEAD指针位置,不改变暂存区和工作区的状态
  • mixed 移动HEAD指针位置,并重置暂存区状态和本地库一致,不改变工作区状态
  • hard 移动HEAD指针位置,并重置暂存区和工作区状态,保持3者一致
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #重置指针
    $git reset --soft HEAD^
    #如果是退两步
    HEAD^^
    #如果是退n步
    HEAD~n

    #重置指针和暂存区
    $git reset --mixed HEAD^
    或者
    $git reset HEAD^

    #重置指针,暂存区及工作区
    #危险,如果工作区代码没有commit,则再也找不回!!!!!!!
    $git reset --hard HEAD^

    #重置到指定的提交
    #这边需要用到之前的日志查看命令
    $git reflog
    07876bd (HEAD -> master) HEAD@{0}: commit: 新提交2
    b104f55 HEAD@{1}: reset: moving to b104f55
    22a101d HEAD@{2}: commit: 新提交
    17bd775 (origin/master) HEAD@{3}: reset: moving to HEAD^
    0a4a26f HEAD@{4}: reset: moving to HEAD
    0a4a26f HEAD@{5}: commit: 提交
    17bd775 (origin/master) HEAD@{6}: reset: moving to 17bd775
    a45581a HEAD@{7}: revert: Revert 这个提交撤销
    17bd775 (origin/master) HEAD@{8}: commit (amend): 忘记提交了代码,否则编译出错
    589173d HEAD@{9}: reset: moving to 589173d
    b104f55 HEAD@{10}: reset: moving to HEAD
    b104f55 HEAD@{11}: commit: 忘记提交了
    589173d HEAD@{12}: commit: 提交1
    6aa8104 HEAD@{13}: commit: 动了
    26364c5 HEAD@{14}: commit: 只是一次测试
    4a3753c HEAD@{15}: commit (initial): git测试
    #重置到17bd775
    $git reset --soft 17bd775

回滚代码

1
2
3
4
5
6
7
8
9
10
11
12
#暴力回滚
$git reset --hard hash
$git push(这个时候一般是提交不上去的,需要先git pull,可能还需要merge)
#暴力回滚,会丢失本地工作区未commit的代码

#对比历史commit
$git diff hash
#找到以前的代码,进行回滚,这种修改相对比较柔和,但是需要理解逻辑

#找回删除的项目
$git branch 最新一次提交的hash
$git push
显示 Gitment 评论