Git系列: 撤销操作详解:从取消暂存到撤销提交

 


撤销操作一 撤下暂存命令(总结文件恢复到暂存前的状态)

修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add * 暂存了它们两个。如何只取消暂存两个中的一个呢? git status 命令提示了你。它不会影响工作目录中的实际文件内容,只是将指定文件的暂存状态重置,使其回到未暂存的状态

touch E.c
touch F.c
git add *.c
root@osboxes:/home/user/my_project# git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

      new file:   E.c
      new file:   F.c

root@osboxes:/home/user/my_project# git reset HEAD E.c
root@osboxes:/home/user/my_project# git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

      new file:   F.c

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

      E.c

注意:如果文件是由untracked 被add 到暂存区,那么会撤回,如果是修改,那么会放弃修改。

撤销操作二 撤销修改对文件的修改

你该如何方便地撤消修改——将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 幸运的是,git status 也告诉了你应该如何做。

请务必记得 git checkout — <file> 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。

git checkout -- example.txt

暂存区的作用如果文件已被暂存(使用 git add),git checkout -- <file> 将文件恢复到暂存区的状态,而不是提交的状态。

这也是我们常见的错误点:git checkout 如果被暂存了,那么会将文件恢复到暂存区的状态,而不是提交的状态。

实用案例

在工作区修改文件,git status查看内容, 然后 git checkout 撤销操作,再一次执行git status

git status
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

它非常清楚地告诉了你如何撤消之前所做的修改。 让我们来按照提示执行:

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

  renamed:   README.md -> README

可以看到那些修改已经被撤消了。

撤销最近一次 commit(还未推送)

保留修改(只撤销 commit):

git reset --soft HEAD~1

撤销 commit 和暂存(保留工作区文件):

git reset --mixed HEAD~1

撤销 commit 和修改(彻底回滚,慎用):

git reset --hard HEAD~1

记住

由于存入暂存区的行为不会发生提交记录,一般如果暂存区错误,那么修改完成,直接覆盖即可。如果想回复暂存区的数据,那么使用git checkout 即可。

由于暂存区不存在记录,所以,对于除了撤销覆盖工作区。以及提交的行为的撤销,其他部分很少涉及。

对于的常见的提交后发生错误的行为,一般会使用的git commit --amend 进行覆盖提交。

git commit --amend
git push origin main --force-with-lease

发表评论

后一页 前一页