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
$ 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>)则会重置引用。根据不同的选项,可以对暂存区或者工作区进行重置
用法二(不使用路径<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^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。
自上一次一来的提交全部丢失。