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