A——working (工作区) : a.txt 有修改
B------index (暂存区) :b.txt 有修改
C -----HEAD
D -----HEAD^
git reset --soft 完全保留 工作区和暂存区,仅改变 HEAD的指向的位置(所有rese都会执行这个操作)。
git reset --mixed 完全保留工作区,彻底清除暂存区。
git reset --hard 彻底清除工作区和暂存区。
--merge --keep 这两个选项的效果是保留修改的差异部分。 如果回退的内容与保留的修改存在冲突(有相同文件)则命令会失败.。
git reset --merge 保留 工作区和index之间的差异。
git reset --keep 保留工作区和HEAD之间的差异。
使用场景1: 用于撤销 git pull 产生的修改.
第一种情况:
git reset --merge HEAD
工作区中保留了a.txt的修改,将丢弃b.txt修改,; index 将复原成HEAD(C状态)
如果暂存区中没有修改,那这个命令不会产生任何修改.
git reset --keep HEAD
保留了a.txt 和 b.txt的修改, index将全部复原成HEAD
第二种情况:
git reset --merge HEAD^
如果 HEAD vs HEAD^ 有a.txt, 命令将失败
工作区中保留了a.txt的修改,其它内容恢复到 D状态; index 将复原成HEAD^(D状态)
git reset --keep HEAD^
如果 HEAD vs HEAD^ 有a.txt或b.txt修改, 命令将失败 ;
其它情况: 工作区中保留了a.txt和b.txt的修改,其它内容恢复到 D状态; index 将复原成HEAD^(D状态)