赞
踩
git-reset - Reset current HEAD to the specified state
Git Reset有三种模式,soft,mixed,hard,具体的使用方法如下面这张图
注,Git一般划分为3个区域,working directory 为当前工作区、stage/index为暂存区(git add后的代码就会存储在这部分)、repository则记录提交的历史(git comment后的代码会存在这里)。3个区域关系如下图所示
reset --hard 会在重置 HEAD 和branch的同时,重置stage区和工作目录里的内容。当你在 reset 后面加了 --hard 参数时,你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。(三个区域全变且一致)
例:你在上次 commit 之后又对文件做了一些改动:把修改后的ganmes.txt文件add到stage区,修改后的shopping list.txt保留在工作目录
git status
# 你的 HEAD 和当前 branch 回滚到上一条commit同时,stage区和工作区的改动也全消失了
git reset --hard HEAD^6
git status
reset --soft 会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。(working directory 内容不变,repository与目标节点一致,stage/index新增repository在两个版本的差异)
例:把修改后的ganmes.txt文件add到stage区,修改后的shopping list.txt保留在工作目录
git status
此时当前 commit 的改动内容是新增了 laughters.txt 文件
git show --stat
# 你的 HEAD 和它所指向的 branch 被移动到 HEAD^ 之外,原先 HEAD 处 commit 的改动(也就是那个 laughters.txt 文件)也会被放进暂存区
git reset --soft HEAD^
git status
reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。
例如上述情况:
git status
修改 的games.txt 和 shopping list.txt,并把 games.txt 放进了暂存区。
git show --stat
git reset HEAD^
git reset --mixed HEAD^
`
工作目录的内容和 --soft 一样会被保留,但和 --soft 的区别在于,它会把暂存区清空,并把原节点和reset节点的差异的文件放在工作目录,总而言之就是,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录
git status
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。