git reset

git log

1.新建一文件,然后提交到版本库中
$ cd f:/gitdemo/
$ touch new-commit.txt
$ git add new-commit.txt
$ git commit -m "does master follow this new commit?"


2.git log 查询提交日志,
版本库引用空间(.git/refs/目录)下的master文件内容也改变来了,指向了新的提交
$ git log
commit 63335a198552e72e7f4a59a265769c96df0e57d3
Author: yinnana <nanayin@creditease.cn>
Date:   Thu Jan 5 13:22:03 2017 +0800
    does master follow this new commit?

commit df33bea3141db42c47dfb8fc2ce1d1d9416100e2
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 19:30:34 2017 +0800
    test1

commit 492478d7ebc1e6bc7104e585c6fe2b38185521c3
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 13:53:11 2017 +0800
    test
$ cat .git/refs/heads/master
63335a198552e72e7f4a59a265769c96df0e57d3

3.重置命令,可以重置到任何一次提交,但会彻底丢弃历史
$ git reset --hard HEAD^
HEAD is now at df33bea test1
$ cat .git/refs/heads/master
df33bea3141db42c47dfb8fc2ce1d1d9416100e2
$ git log
commit df33bea3141db42c47dfb8fc2ce1d1d9416100e2
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 19:30:34 2017 +0800
    test1

commit 492478d7ebc1e6bc7104e585c6fe2b38185521c3
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 13:53:11 2017 +0800
    test

git reflog

带有工作区的版本库,都提供分支日志功能
$ git config core.logallrefupdates
true

查看master分支的日志文件,该文件记录了master分支指向的变迁,最新的改变追加到文件末尾
$ tail -5 .git/logs/refs/heads/master
$ git reflog
df69eb9 HEAD@{0}: reset: moving to df69eb991294825b467ca423d38aedd4117ca0f1
df33bea HEAD@{1}: reset: moving to HEAD^
63335a1 HEAD@{2}: commit: does master follow this new commit?
df33bea HEAD@{3}: commit: test1
492478d HEAD@{4}: commit: test
268afa3 HEAD@{5}: commit: test
df69eb9 HEAD@{6}: commit (initial): initialized

将master切换到两次变更之前的值,提交历史也回来了,再次查看git reflog,相应的回复操作也会记录在日志中
$ git reset --hard master@{2}
HEAD is now at 63335a1 does master follow this new commit?
$ git log
commit 63335a198552e72e7f4a59a265769c96df0e57d3
Author: yinnana <nanayin@creditease.cn>
Date:   Thu Jan 5 13:22:03 2017 +0800
    does master follow this new commit?

commit df33bea3141db42c47dfb8fc2ce1d1d9416100e2
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 19:30:34 2017 +0800
    test1

commit 492478d7ebc1e6bc7104e585c6fe2b38185521c3
Author: yinnana <nanayin@creditease.cn>
Date:   Wed Jan 4 13:53:11 2017 +0800
    test
$ git reflog
63335a1 HEAD@{0}: reset: moving to master@{2}
df69eb9 HEAD@{1}: reset: moving to df69eb991294825b467ca423d38aedd4117ca0f1
df33bea HEAD@{2}: reset: moving to HEAD^
63335a1 HEAD@{3}: commit: does master follow this new commit?
df33bea HEAD@{4}: commit: test1
492478d HEAD@{5}: commit: test
268afa3 HEAD@{6}: commit: test
df69eb9 HEAD@{7}: commit (initial): initialized

用法一:git  reset  [-q]  [<commit>]  [--] <paths>...
用法二:git  reset  [--soft | --mixed | --hard | --merge | --keep]  [-q]  [<commit>]

<commit>可选项,可以使用引用或者提交ID,如果省略<commit> 则相当于使用了HEAD的指向作为提交ID

用法一在命令中包含路径<paths>,为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前用两个连续的短线作为分隔

用法一(包含路径<paths>)不会重置引用,不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件
例如 git  reset HEAD <paths>相当于取消之前执行的 git  add <paths>命令时改变的暂存区

用法二(不使用路径<paths>)则会重置引用。根据不同的选项,可以对暂存区或者工作区进行重置

1) 使用参数 --hard, 如 git reset --hard <commit>
  会执行上图中的全部动作1,2,3  
1.1 替换引用的指向。引用指向新的提交ID。
1.2替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
1.3替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。

2) 使用参数 --soft,如git reset --soft <commit>
会执行上图中的操作1
只会更改引用的指向,不改变暂存区和工作区

3) 使用参数 --mixed 或者不使用参数(默认为 --mixed),如 git reset  <commit>
会执行上图中的操作1,2
更改引用的指向以及重置暂存区,但是不改变工作区


示例:
git  reset
仅用HEAD指向的目录树重置暂存区,
工作区不会受到影响,相当于之前用 git add 命令更新到暂存区的内容撤出暂存区。
引用也为改变,因为重置引用到HEAD 相当于没有重置。

git reset HEAD
同上

git reset --filename
git reset HEAD filename
仅将文件filename的改动撤出暂存区,暂存区中其他文件不改变。相当于 git add filename的反向操作。


git reset --soft HEAD^
工作区和暂存区不改变,但是引用向前回退一次。当对最新的提交不满意时,撤销最新提交以便重新提交。

git reset HEAD^
git reset --mixed HEAD^
工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。


git reset --hard HEAD^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。
自上一次一来的提交全部丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值