git reset命令之谜

本文深入解析Git的Reset命令,包括其目的、操作原理及不同参数的影响。通过定义HEAD、Index和Working Copy,阐述了如何在不丢失本地修改的情况下,安全地进行分支重置,避免潜在的数据丢失风险。

1.git reset的目的

(1)git reset操作可以使得当前的分支指向某一个提交。

(2)为了避免丢失本地的修改以及original HEAD,建议在进行reset操作之前,在本地创建一个新的branch,在新的branch上面进行reset,以保证master分支永远处于original HEAD。

2.Definitions

首先,为了讲解git reset的命令之谜,我们先来看一下下面几个名词的定义

HEAD(头)

指向当前branch最顶端的一个commit,该分支上一次commit后的节点

官方是如此解释的:

The index, also known as the staging area, is the set of files that will become the next commit. It is also the commit that will become HEAD’s parent.

Index(索引)

The index, 也可以被认为是staging area(暂存区), 也就是git add . 命令将本地修改提交到暂存区,暂存区等待下一次commit提交到,提交之后它就是 HEAD的父节点. 

官方的解释:

The index, also known as the staging area, is the set of files that will become the next commit. It is also the commit that will become HEAD’s parent.

Working Copy(工作副本)

简单的来说就是在当期编译器或者工作目录下的未提交到暂存区的修改,(译注:一般指,有修改,但是没有git add与git commit的文件)

官方解释:

This is the term for the current set of files you’re working on in your file system.

index,HEAD,Working Copy的切换

(1)当执行git checkout -b 命令新建一个分支,HEAD指向该分支的最近一次的commit。

此时:  本分支的内容与 index和working copy是一样一样的

当你第一次checkout一个新的分支,HEAD指向该分支上最近一次commit。它和index和working copy是一样一样的。

 

(2)在本地做了文件修改,git会检测到“哦,有些东西被改了”,此时 working copy将与index与HEAD的内容不一样了。

注意:git会在你修改后标记这些文件。

 

(3)执行 git add 命令,会将本修改的文件提交到暂存区 index中, 此时 你的working copy和index相同,但是他们与本地HEAD指向的分支内容又不一样了

(4)执行git commit,本地新建了一个commit,HEAD指向这个最新的commit,此时  HEAD中的内容与working copy和index相同了

(5)执行git push  ,将本地的提交push到远程仓库。

 

 

3.Reset命令

正如上面说的,git reset的操作是将当前的HEAD(当前分支的最近的一个提交)指向另外一个提交。

比如我们有下面这个本地分支:HEAD指向最顶端的一个提交

HEAD-Latest

如果执行:

> git reset HEAD

这个时候git 什么都不做。因为他的意思是让当前分支指向HEAD,但是当前分支原本就是指向HEAD的。

如果执行:

> git reset HEAD~1

(HEAD~1 的意思是 “the commit right before HEAD”,接下来我们的分支中的HEAD指向最顶端的下面一个提交:

HEAD-Parent

同理:

> git reset HEAD~2

分支如下:

HEAD-Parent-Parent

 

(4)Parameters

reset命令本身很简单,但是它的参数让人迷惑,主要的参数有softhard and mixed,它们告诉Git,当执行reset时,要对index和working copy做什么。

git reset --Parameter HEAD~

 

Soft

The --soft参数只告诉Git将HEAD重置到其他的commit。HEAD之前指向的分支中未提交的index和working copy中的内容都会保留。他们会等待下一次的git Push

reset-wc-index-changed

Mixed (default)

The --mixed会同时改变HEAD和index,此时index与HEAD指向的commit中的内容相同,index被重置。而HEAD之前指向的分支中的working copy文件会被保留下来。当然会显示工作目录下有修改,但没有缓存到index中。坐等下次的git add 与git commit

reset-wc-changed

Hard(危险指令)

The --hard HEAD & index & working copy同时改变到你要reset到的那个commit上。这个参数很危险,执行了它,你的本地修改就丢失了。

### Git Reset 命令详解 `git reset` 是一个功能强大但需谨慎使用的命令,主要用于调整代码的历史记录、撤销提交或将暂存区或工作区恢复到特定状态。以下是关于 `git reset` 的详细说明: #### 1. **基本语法** `git reset` 的通用形式如下: ```bash git reset [<mode>] [<commit>] ``` 其中 `<mode>` 表示重置模式,可选值为 `--soft`, `--mixed` 或 `--hard`;而 `<commit>` 则指定了目标提交。 --- #### 2. **三种主要模式** ##### (1) **Soft 模式 (`--soft`)** 在这种模式下,`git reset --soft <commit>` 将当前分支的 HEAD 移动到指定的提交位置,但不会改变暂存区和工作目录的状态。这意味着之前的更改仍然会保留在暂存区中[^2]。 - 示例:假设我们想回到上一次提交之前的状态(不丢弃已暂存的内容),可以运行以下命令: ```bash git reset --soft HEAD~1 ``` ##### (2) **Mixed 模式 (`--mixed`)** 这是默认模式。当执行 `git reset --mixed <commit>` 时,HEAD 和暂存区都会被移动到指定的提交位置,但是工作目录中的文件保持不变[^3]。 - 示例:如果希望取消最近的一次提交并将改动移回至未暂存状态,则可以用此方法: ```bash git reset HEAD~ ``` ##### (3) **Hard 模式 (`--hard`)** 这种模式是最具破坏性的选项之一。通过运行 `git reset --hard <commit>` ,不仅 HEAD 和索引会被更新为目标提交的位置,而且工作树也会相应地同步变化——任何本地修改都将永久丢失。 - 警告:由于硬重置不可逆,请务必确认无误后再操作! - 示例:要完全抛弃最新两次提交及其关联的所有变更,应输入下面这条指令: ```bash git reset --hard HEAD~2 ``` --- #### 3. **其他常用场景** 除了上述基础应用外,还有几个值得注意的情况涉及到了 `git reset`: - 如果只是单纯想要清除已经加入缓存却尚未完成最终提交的部分新增或者删除动作,那么可以直接利用简单的 `git reset FILENAME` 来达成目的[^1]。 - 当需要将某个具体路径下的内容重新定位至某版次之下时,亦可通过类似这样的语句实现精确控制: ```bash git reset -- <path/to/file> ``` --- #### 4. **注意事项与最佳实践** 尽管 `git reset` 提供了许多便利的功能,但在实际运用过程中仍有一些事项需要注意: - 避免在共享远程仓库上的公共分支频繁使用强制性手段如 hard 类型的操作,以免影响他人协作进展; - 对于那些已经被推送到远端服务器上的提交记录最好不要轻易尝试覆盖处理,推荐采用 safer alternative —— namely, performing a reverse action via another commit instead of altering history directly. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值