git基础(4)-撤销与回滚

在任何一个阶段,都可能想要撤销某些操作,来取消对某文件的修改。注意,有些操作是是不可逆的.

检查修改

  • git diff 检查工作区和暂存区之间的差异
  • git diff --cached 检查暂存区和本地仓库之间的差异
  • git diff master origin/develop 检查本地仓库与远程仓库 develop 分支之间的差异

重新提交 git commit --amend

有时提交完了发现漏掉几个文件没添加、或者提交信息写错,需要重新提交. git commit --amend 会将暂存区的文件提交,并覆盖原来的提交信息

取消暂存的文件 git reset HEAD <file>...

例如: 修改了两个文件并想将它们做为 2 次独立的修改提交,但却意外地输入 git add * 暂存了它们两个,如何取消暂存中的文件? 正如 git status命令提示的 使用git reset HEAD <file> ... 来撤销暂存

1
2
3
4
5
6
7
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: a.md
new file: b.md

git reset HEAD a.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git reset HEAD a.md

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: b.md

Untracked files:
(use "git add <file>..." to include in what will be committed)

a.md

撤销对文件的修改 git checkout -- <file>...

撤销修改,将其还原成上次提交时的样子.但git checkout -- <file>是一个危险命令,它只是拷贝了一个文件来覆盖原文件,原文件所做的修改都会消失。

不同场景下的撤销(未 push 到远程仓库还原操作)

  1. 文件被修改,未执行git add

    1
    2
    3
    git checkout <fileName>

    git checkout .
  2. 同时对多个文件执行git add ,但本次提交只想提交其中部分文件

    1
    2
    3
    4
    5
    $ git add *
    $ git status

    # 取消部分暂存文件
    $ git reset HEAD <fileName>
  3. 文件执行了 git add, 但想撤销对其中部分文件的修改

    1
    2
    3
    4
    5
    # 取消暂存
    $ git reset HEAD <fileName>

    # 取消修改
    $ git checkout <fileName>
  4. 已经 git commit, 想再次修改,但不想产生新的 commit 记录

    1
    2
    3
    # 修改的最后一次暂存
    $ git add <fileName>
    $ git commit --amend -m "comment"
  5. 已经在本地多次提交记录git commit,但想撤销到其中某次 Commit

    1
    2
    git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]

不同场景下的回滚(已 push 到远程仓库的还原操作)

回滚有风险,需要提前做好备份,通知其他团队成员

  1. 撤销指定文件到指定版本

    1
    2
    3
    4
    5
    # 查看指定文件的历史版本
    $ git log <fileName>

    # 回滚到指定commitID
    $ git chekcout <commitID> <fileName>