撤销修改
如果我们在修改了某个文件之后,想要撤销修改,可能遇到的情况有以下三种:
- 撤销工作区的修改
- 如果已经提交到暂存区,撤销暂存区的修改
- 如果已经commit 到本地仓库,撤销本地仓库的修改
撤销工作区的修改###
使用命令行 git checkout -- file
,一定要记得加上 --
首先我们修改 README 文件,然后调用 git status
查看状态
$ git status
On branch master
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: README.md
no changes added to commit (use "git add" and/or "git commit -a")
git 告诉我们,这时候我们可以有两个操作,一个就是 add 到暂存区,另一个就是撤销对工作区这个README文件的修改。我们执行 git checkout -- <file>
看看有什么效果
$ git checkout -- README.md
$ git status
On branch master
nothing to commit, working tree clean
我们再次查看状态,发现 git 告诉我们,工作区很干净,说明我们的撤销成功了。
撤销暂存区的修改###
如果我们已经将修改的文件 add 到了暂存区。这时候可以使用命令行 git reset HEAD <file>
首先修改 README 文件,然后 add 到暂存区,查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
git 告诉我们,这个时候可以继续进行 commit 操作,也可以使用命令行 git reset HEAD <file>
进行撤销,我们操作下试试。
$ git reset HEAD README.md
Unstaged changes after reset:
M README.md
$ git status
On branch master
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: README.md
no changes added to commit (use "git add" and/or "git commit -a")
可以看到已经将我们的修改从暂存区撤销了。再继续调用 git checkout -- <file>
,就可以将工作区的修改也撤销了。
撤销本地仓库的修改###
如果我们已经将修改提交到了本地仓库的话,就需要使用前两节笔记中的 git reset HEAD commit_id
命令行了。
$ git reset HEAD^
Unstaged changes after reset:
M README.md
$ git status
On branch master
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: README.md
no changes added to commit (use "git add" and/or "git commit -a")
从上面的结果我们可以看到,我们已经提交到本地仓库的修改,已经被撤销,现在的状态是我们的修改在缓存区了。如果要继续撤销的话,参考前面两个步骤就行了。
总结
- 从工作区撤销:
git checkout -- <file>
- 从暂存区撤销:
git reset HEAD <file>
- 从本地仓库撤销:
git reset HEAD commit_id
删除文件
如果我们直接在工作区将某个文件删除,这时候,工作区和本地仓库的版本就不一样了,来看看 git status 查看状态的效果:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: hi.txt
no changes added to commit (use "git add" and/or "git commit -a")
git 提示我们,我们在本地删除了文件,但是没有提交修改到暂存区。这时候我们可以通过 git checkout --<file>
从暂存区恢复我们的文件,也可以通过 git add/rm <file>
将我们的修改提交到暂存区。
首先验证 git add
方式提交删除修改
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: hi.txt
$ git commit -m "delete hi.txt"
[master 49b52ba] delete hi.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 hi.txt
$ git status
On branch master
nothing to commit, working tree clean
可以看到正确的从本地仓库删除了文件 hi.txt。
我们被删除的文件恢复以后再尝试使用 git rm <file>
看看效果
首先是使用我们前面学到的两种撤销修改的方式恢复删除文件
$ git reset HEAD^
Unstaged changes after reset:
D hi.txt
$ git checkout -- hi.txt
查看本地仓库文件夹,被删除的 hi.txt 确实恢复了。那么删除它,看看 git rm <file>
指令的效果。
$ git rm hi.txt
rm 'hi.txt'
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: hi.txt
$ git commit -m "delete hi.txt"
[master 8e7a71b] delete hi.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 hi.txt
$ git status
On branch master
nothing to commit, working tree clean
和使用 git add
方式一样。
总结
手动删除文件以后,调用git rm/add <file>
命令行可以将 删除修改
提交到暂存区。
网友评论