最新的git合并了checkout和reset
Topic source情况1:在工作区做了修改,并未添加到暂存区,想撤销工作区的修改,用 git restore file;
情况2:在工作区做了修改,并用git add 添加到了暂存区,未提交;想撤销,分两步,1.先撤销暂存区的修改,用 git restore --staged file, 2.然后参考情况1撤销工作区的修改;
情况3:在工作区做了修改,且git add git commit添加并提交了内容,想撤销本次提交,直接用 git reset --hard HEAD^回退版本,即可保证工作区,暂存区,版本库都是上次的内容
Pray for
#7 Created at 7/10/2022 23:59
另外,“git restore 恢复工作区的修改”,这句话中的“修改”,指的是工作区当前文件,相对于最近一次commit的文件的修改。
这个描述不太对吧,不指定 source 的情况下,git restore 就是把暂存区的内容恢复到工作区,和历史区没有关系。
比如文件 test 内容为 A,已提交到历史库,工作区将 test 改为 AA,然后 add 到暂存区,工作区再将 test 改为 AAA,此时运行 git restore test,会把工作区的 test 改为 AA,而不是 A。
另外提一嘴,当暂存区没有内容时,其实表示的是暂存区和历史区是一致的,此时 git restore 也是可以看成是从暂存区恢复。
可以参考git restore 文档,里面有这么一段描述:
If not specified, the contents are restored from
HEAD
if--staged
is given, otherwise from the index.
即在未给定 source 的情况下,如果使用 `--staged` ,从 `HEAD` 恢复,否则从 `index` 恢复。
这里的 `index` 就是暂存区。
另外再多说一句,文档还说了,如果指定 `--staged` 说明恢复暂存区,否则恢复工作区。因此可以这么解读上面一句话:
在未给定 source 的情况下,如果使用 `--staged` ,从 `HEAD` 恢复暂存区,否则从暂存区恢复工作区。
再多说一嘴,给定 source 的情况下,则按照 source 的历史库中的内容恢复。
比如上面举的例子中,
git restore test 会把工作区改为 AA
git restore --source HEAD test 会把工作区改为 A
- 1
- 2
xixihaha一整天
原来的git checkout 可以使用 git restore 代替
原来的git reset HEAD 可以使用 git restore --staged 代替
最新版的git提示都已经更换成了restore