git reset

作者: Time_Notes | 来源:发表于2020-07-14 00:31 被阅读0次

动画解释

https://baijiahao.baidu.com/s?id=1664197276209808372&wfr=spider&for=pc

使用git reset 命令撤销错误的commit


git-reset - Reset current HEAD to the specified state

它有三种模式:soft、mixed、hard

git reset --soft

将HEAD引用指向给定提交。索引(暂存区)和工作目录的内容是不变的,在三个命令中对现有版本库状态改动最小。

git reset --mixed(git reset默认的模式)

HEAD引用指向给定提交,并且索引(暂存区)内容也跟着改变,工作目录内容不变。这个命令会将索引(暂存区)变成你刚刚暂存该提交全部变化时的状态,会显示工作目录中有什么修改。

git reset --hard

HEAD引用指向给定提交,索引(暂存区)内容和工作目录内容都会变给定提交时的状态。也就是在给定提交后所修改的内容都会丢失(新文件会被删除,不在工作目录中的文件恢复,未清除回收站的前提)。

git各个区域和命令关系

仅仅只是撤销已提交的版本库,不会修改暂存区和工作区

git reset --soft 版本库ID

仅仅只是撤销已提交的版本库和暂存区,不会修改工作区

git reset --mixed 版本库ID

彻底将工作区、暂存区和版本库记录恢复到指定的版本库

git reset --hard 版本库ID


软重置

软重置会将HEAD移至指定的提交(或与HEAD相比的提交的索引),而不会移除该提交之后加入的修改!

假设我们不想保留添加了一个style.css文件的提交9e78i,而且我们也不想保留添加了一个index.js 文件的提交035cc。但是,我们确实又想要保留新添加的style.css和index.js 文件,这是软重置的一个完美用例。

输入git status后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。这意味着我们可以修复这些文件的内容,之后再重新提交它们!


硬重置 reset --hard:重置stage区和工作目录

有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。Git应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。

Git丢弃了9e78i和035cc引入的修改,并将状态重置到了ec5be的状态。

reset --hard会在重置HEADbranch的同时,重置stage区和工作目录里的内容。当你在reset后面加了--hard参数时,你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没有commit的修改会被全部擦掉。


HEAD指向的版本就是当前版本,因此Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id;

当前有三个commit提交版本

commit1

commit2

commit3

Git必须知道当前是哪个版本,Git中用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写HEAD~100。

当前版本是在commit3,要回退到commit1或2,使用git reset命令

回退到上一版本commit2:git reset --hard HEAD^

如果想返回到commit3,需要知道commit3的commit id 1094adb:git reset --hard 1094

版本号没必要写全,前几位就可以了,Git会自动去找,也不能只写前一两位,因为Git可能会找到多个版本号。

相关文章

网友评论

      本文标题:git reset

      本文链接:https://www.haomeiwen.com/subject/eipiuhtx.html