Git 撤消操作(分布式版本控制系统)

1、覆盖提交

  • 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有 --amend 选项的提交命令尝试重新提交。

    1
    2
    3
    4
    5
    6
    $ git commit --amend



    # git commit --amend -m [提交内容说明]
    $ git commit --amend -m "Amend commit dsc"
    • 这个命令会将暂存区中的文件提交。如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

    • 文本编辑器启动后,可以看到之前的提交信息。编辑后保存会覆盖原来的提交信息。

  • 例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作。

    1
    2
    3
    4
    5
    $ git commit -m 'initial commit'

    $ git add forgotten_file

    $ git commit --amend
    • 最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。

2、取消暂存的文件

  • 接下来的两个小节演示如何操作暂存区域与工作目录中已修改的文件。这些命令在修改文件状态的同时,也会提示如何撤消操作。

  • 例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了 git add * 暂存了它们两个。如何只取消暂存两个中的一个呢?git status 命令提示了你。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git add *

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

    renamed: README.md -> README
    modified: CONTRIBUTING.md
  • 在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD <file>... 来取消暂存。所以,我们可以这样来取消暂存 CONTRIBUTING.md 文件。

    1
    2
    # git reset HEAD [文件名]
    $ git reset HEAD CONTRIBUTING.md
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Unstaged changes after reset:
    M CONTRIBUTING.md
    $ git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)

    renamed: README.md -> README

    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: CONTRIBUTING.md
  • 虽然在调用时加上 --hard 选项可以令 git reset 成为一个危险的命令(可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。不加选项地调用 git reset 并不危险 — 它只会修改暂存区域。

3、撤消对文件的修改

  • 如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办?你该如何方便地撤消修改 - 将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)?幸运的是,git status 也告诉了你应该如何做。在最后一个例子中,未暂存区域是这样。

    1
    2
    3
    4
    5
    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: CONTRIBUTING.md
  • 它非常清楚地告诉了你如何撤消之前所做的修改。

    1
    2
    # git checkout -- [文件名]
    $ git checkout -- CONTRIBUTING.md
    1
    2
    3
    4
    5
    6
    $ git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)

    renamed: README.md -> README
  • git checkout -- [file] 是一个危险的命令。对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。除非你确实清楚不想要那个文件了,否则不要使用这个命令。

文章目录
  1. 1. 1、覆盖提交
  2. 2. 2、取消暂存的文件
  3. 3. 3、撤消对文件的修改
隐藏目录