git reset

git reset 命令调整 HEAD 引用指向给定的提交,默认情况下还会更新索引以匹配该提交。根据需要,git reset 命令也可以修改工作目录以呈现给提交代表的项目修订版本。

git reset 有三个主要选项:–soft、–mixed、和 –hard。

git reset –soft 提交
–soft会将 HEAD 引用指向给定提交。索引和工作目录的内容保持不变。这个版本的命令有“最小”影响,只改变一个符号引用的状态使其指向一个新提交。

git reset –mixed 提交
–mixed 会将 HEAD 指向给定提交。索引内容也跟着改变以符合给定提交的树结构。但是工作目录中的内容保持不变。这个版本的命令将索引变成你刚刚暂存该提交全部变化时的状态,它会显示工作目录中还有什么修改。
注意,–mixed 是 git reset 的默认模式。

git reset–hard 提交
这条命令将 HEAD 引用指向给定提交。索引的内容也跟着改变以符合给定提交的树结构,此外,工作目录的内容也随之改变以反映给定提交的树状态。
当改变工作目录的时候

下面,hello.txt 文件以外的暂存到索引中了。使用 git status 显示待提交的内容。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   hello.txt

如建议的那样,为避免提交该文件,使用 git reset HEAD 来撤回暂存。

$ git ls-files
hello.txt
name.txt

$ git reset HEAD hello.txt

$ git ls-files
name.txt

git reset 的另一种常见的用法是简单地重做或清除分支上的最近提交。

$ git reset HEAD^

因为 mixed 选项重置了索引,所以必须重新暂存你想要提交的修改。这让你有机会再做出新提交之前重新编辑工作目录中的文件,添加其他文件,或者执行其他修改。

如果你只想调整提交信息,就可以使用 –soft 参数。

$ git reset --soft HEAD^ 
$ git commit

假设你要完全取消这次提交,不再关心它的内容了。就使用 –hard 选项:

$ git reset --hard HEAD^

要取消当前分支的多次提交,可以使用 git reset –hard HEAD~3 或者甚至 git reset –hard master~3。
但是要小心。你仅仅可以用一个分支名来指定提交,这跟检出分支时不一样的。在 git reset 操作的自始至终,你都停留在相同的分支上。

Ang@Ang MINGW64 /d/Git/git (master)
$ git rev-parse HEAD
51a2b493363586c4f3e0c8da7fb8712302551fbb

Ang@Ang MINGW64 /d/Git/git (master)
$ git rev-parse new-branch
e0b4372b68ad435586d8d1015d665c15edb5a870

Ang@Ang MINGW64 /d/Git/git (master)
$ git reset --soft new-branch

Ang@Ang MINGW64 /d/Git/git (master)
$ git rev-parse HEAD
e0b4372b68ad435586d8d1015d665c15edb5a870

上面使用 get reset 调整 HEAD 指向了 new-branch 的头部,但是当前分支任然是 master,此时如果提交一个文件。

$ echo 'new' > new

$ git add new

$ git commit -m "which commit parent"
[master 99c1b70] which commit parent
 2 files changed, 3 insertions(+), 3 deletions(-)
 create mode 100644 new

$ git cat-file -p HEAD
tree 65be7a16e50013549c40422ea4b5c3d70c275d1e
parent e0b4372b68ad435586d8d1015d665c15edb5a870
author Jon Loeliger <jdl@example.com> 1502193677 +0800
committer Jon Loeliger <jdl@example.com> 1502193677 +0800

可以看到次提交的父提交是 new-branch 的头而不是 master 的头。但是这个提交是在处于 master 分支的时候执行的。那么。这次提交是完全错误的,应该彻底删除。
这时就是使用 git reset –hard HEAD^ 极好的机会。但是 HEAD 的父提交指向的是 new-branch 而不是 master 分支的前一提交。

可以使用 reflog 来确认 master 实际应该重置到哪个提交。这是版本库中引用变化的历史记录。

$ git reflog
99c1b70 HEAD@{0}: commit: which commit parent
e0b4372 HEAD@{1}: reset: moving to new-branch
51a2b49 HEAD@{2}: checkout: moving from new-branch to master
.
.
.
f857d79 HEAD@{26}: commit (initial): Initial contents of hello

第三行下面记录了从 new-branch 分支切换到 master 分支。那时,51a2b49 是master 的分支的 HEAD。所以,再一次可以直接使用 51a2b49 或者使用符号名称HEAD@{2}。

$ git reset --hard HEAD@{2}
HEAD is now at 51a2b49 Merge branch 'new-branch'

如上所示,可以经常使用 reflog 来帮助找到像分支名一样的引用的之前状态信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值