Git step by step 4 之reset用法及案例

一、基本介绍

对于git reset,manual上有这么一句话:Reset current HEAD to the specified state.
我对这句话的理解是,git reset主要是对本地数据目录进行操作。
对于git reset,一切有图1:


注:图中的commit 1与commit 2代表两个不同的提交号
解释一下:
reset可以对本地数据目录进行重置(先这么简单的说吧),即①
亦可以对暂存区进行重置,即②
也可以对工作目录进行重置,即③

但是,只有如下组合:
1、只进行①;
2、进行①和②;
3、进行①和②和③。

有种情况,git reset HEAD,看上去只进行了②,但实际上也进行了①,只不过重置前与后没有变化,看上去没有重置。(假设此时HEAD指向提交号为commit 2的commit)

二、基本用法
git reset [-q] [<commit>] [--] <paths>…    //-q [只打印出错误,可有可无的参数]
git reset (--patch | -p) [<commit>] [--] [<paths>…]
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]


三、用法详解
假设有状态图2:


即进行了如下操作:
echo "line1" >> file
git add file
git commit -m "add line1"

echo "line2" >> file
git add file
git commit -m "add line2"

echo "line3" >> file
git add file

echo "line4" >> file



用法1:首先是最简单的,这种默认的方式将重置到HEAD所指向的commit
git reset

那么状态图变为图3:


看上去只进行了②。

用法2:指定了要重置到HEAD
git reset HEAD

结果同上。

用法3:指定到某一指定的commit
git reset <commit 1>

那么状态图由图2变为图4:


(此时HEAD会指向提交号为commit 1的commit,而本地数据目录中的commit 2会保存在那里,如果你愿意,你还可以用reset重置到commit 2的状态)

用法4:带参数 --soft
git reset --soft<commit 1>

那么状态图和图2一样,只不过HEAD指向了提交号为commit 1的commit。

用法5:带参数 --hard
git reset --hard <commit 1>

那么状态图由图2变为图5:

同样的,HEAD指向了提交号为commit 1的commit。


至于带参数的 --mixed(默认,它和不带参数相同,即用法1),以及其他一些参数,这里就不提了。

用法6:带path参数
git reset -- file

由于图中只有一个file,所以它的状态图同图3相同,这里主要目的是将暂存区的某一指定的file(而不是所有的file)重置到与本地数据目录中的file相同。

四、案例

1、在工作目录中新建的一个文件,被添加到了暂存区,但是添加后突然发现这个文件是有问题的,那么可以用 git reset 或 git reset HEAD。
当然这种用法也不局限于删除新添加的文件的情况,任意对于暂存区进行了更改的操作都可以用git reset 或 git reset HEAD 进行恢复。
Ps:这是一种很常用的用法。

2、
待补充




more:
《Git 权威指南》
man git reset(强烈推荐看的)

猜你喜欢

转载自songkang666.iteye.com/blog/1845313