介绍
在任何一个阶段,你都有可能想要撤销某些操作。 需要注意的是有些撤销是不可逆的,所以要小心,有可能一个命令就导致你的一天的工作成为泡影。
重新提交
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时可以运行带有--amend选项的提交命令尝试重新提交。这个命令会将暂存区中的文件提交,如果自上次提交以来你还未做任何修改,那么快照会保持不变,而你所修改的只是提交信息。此时自动启动文本编辑器,可以看到之前的提交信息,编辑后保存会覆盖原有的提交信息。如果你提交后发现忘记了暂存某些需要的修改,可以像这样:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
这样操作的结果就是最终你只会有一个提交,第二次的提交将代替第一次提交的结果。
重新提交主要是为了避免由于疏漏而造成的无意义提交。
撤销对文件的修改
假设仓库中有一个readme.md文件,这是你修改了这个文件
(base) [hncjygd@VM_0_11_centos test]$ echo "this is a readme file" > readme.md
(base) [hncjygd@VM_0_11_centos test]$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.md
no changes added to commit (use "git add" and/or "git commit -a")
如果这个时候你想放弃这个修改,你可以看到git status已经提示你了,使用git restore <file>命令来放弃在工作区的更改。
(base) [hncjygd@VM_0_11_centos test]$ git restore readme.md
(base) [hncjygd@VM_0_11_centos test]$ cat readme.md
(base) [hncjygd@VM_0_11_centos test]$ git status
On branch master
nothing to commit, working tree clean
这个时候你发现你的修改已经被还原(空),而工作区干净了。但是需要注意的是这个命令非常危险,这个命令实际上就是从最新的快照中找到这个文件来覆盖它,你对这个文件的所有修改因为并没有提交到版本库所以会消失无法早到了。所以在不确定的时候不要使用这个命令,git的一个用处就是始终保持后悔药。
注:git restore 这个名是在git 2.23版本中新定义的,以前撤销修改的命令为git checkout -- <file>
取消暂存的文件
让我们再次更改readme.md文件,不过这次我们把它add到暂存区:
(base) [hncjygd@VM_0_11_centos test]$ echo "this is a readme file" > readme.md
(base) [hncjygd@VM_0_11_centos test]$ git add readme.md
(base) [hncjygd@VM_0_11_centos test]$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.md
这个你在commit的时候发现readme文件书写的格式不对,需要退回来从新编写。此时你也看到了git status已经告诉你了,使用git restore --staged命令来取消暂存。
(base) [hncjygd@VM_0_11_centos test]$ git restore --staged readme.md
(base) [hncjygd@VM_0_11_centos test]$ cat readme.md
this is a readme file
(base) [hncjygd@VM_0_11_centos test]$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.md
no changes added to commit (use "git add" and/or "git commit -a")
可以看到已经回退了,此时暂存区中没有文件,而工作区中有一个更改了文件。这个命令相对安全,因为你做的更改并不会被覆盖。但是还是那句话任何你为纳入版本库的文件都是危险的。
注:git restore命令是git 2.23版本发布的新命令,在此之前取消暂存的命令为git reset HEAD <file>
网友评论