reset
git reset有三个可选项:
--mixed
:默认,修改 HEAD,使其指向到对应版本号,并且清空暂存区(stage 或者叫 index),注意,这里的修改 HEAD 并不会改变工作区的文件。--soft
:修改HEAD,使其指向到对应版本号,不会清空暂存区,也不会改变工作区的文件,并且会把当前版本相对于现在工作区有修改的文件添加到暂存区(添加到暂存区的文件和工作区的文件内容是一样,想要恢复对应版本号的文件,可以先get reset HEAD
,然后git checkout -- 'fileName/filePathName'
),此时可以直接提交。--hard
:将文件恢复到对应版本号的状态,暂存区将被清空,工作区文件将被更改,恢复到对应版本号的状态。
git reset 也可回复单个文件或者单个文件夹
git reset 'commitId' 'fileName/filePathName'
此时,并不会修改HEAD和工作区,也不会清空暂存区,只是会把对应版本号的文件放入暂存区,此时我们需要git checkout -- 'fileName/filePathName'
即可恢复对应版本号的文件
revert
revert 主要用来撤销某一次修改,如果之前提交增加了内容则会把该内容删除,如果之前提交删除了内容则会把相应内容恢复。
先假设我们有如下四次提交:
bb15对应的内容为:
test-revert-begin
c2a7对应的内容为:
test-revert-begin
1
0869对已的内容为:
test-revert-begin
2
此时我们想把c27a的修改撤销:
会发现产生了冲突,此时打开1.txt:
蓝色部分为撤销后的内容,红色内容为版本库最新的内容,发生了冲突,此时需要我们解决冲突后commit -am。
注意:如果我们revert0869
,是不是产生冲突的,因为在0869
之后没有再对 1.txt 进行过修改
git reset 与 git revert 的区别
reset 会删除指定版本之后的 commit,而 revert 会产生新的 commit,并且 revert 不可以回复单个文件