4250元大写怎么写 2025-06-18 05:43:54
如何使用QQ号注册微信账号?用QQ号注册微信账号的方法 2025-05-18 16:11:47
2014世界杯比赛结果一览表,2014年世界杯比分结果表 2025-05-08 05:00:49
国际滑联短道速滑世界杯 2025-05-06 23:19:44
肯德基生日桶66折优惠! 2025-07-21 17:15:39
合成表 - 盾牌 (Shield) - [MC]我的世界原版 (Minecraft) - MC百科 2025-06-17 20:43:39
碎纸机过热如何处理 使用碎纸机时出现故障怎么应对 2025-05-31 23:25:24
该怎么把你的手串搭配又好看而不俗气呢? 2025-06-03 16:20:20
五会念茶 | 第二会:处士孙思邈的药茶汤 2025-06-21 15:30:29
解锁超级密码,开启智能电视新世界! 2025-05-22 15:01:33

Git基础:利用reset重置命令恢复commit代码及其扩展

有时候代码写完 commit 了,发现用错分支了,就很尴尬,这时候可以用 reset 重置命令,将代码恢复到指定的版本。

在学习 reset 命令之前,先了解两个命令。

git-log显示从最近到最远的提交日志。

代码语言:javascript代码运行次数:0运行复制git log如果输出信息太多,看得眼花缭乱,可以试试加上 --pretty=oneline 参数。

这样会把每条记录以一行的形式输出:

代码语言:javascript代码运行次数:0运行复制$ git log --pretty=oneline

1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL

e475afc93c209a690c39c13a46716e8fa000c366 add distributed

eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme filegit HEAD在Git中,用 HEAD 表示当前版本,也就是最新的一次提交,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上100个版本写100个 ^ 显然是不现实的,可以写成 HEAD~100 。

接下来,我们要把当前版本回退到上一个版本,就可以使用 git reset 命令:

git-reset将当前重置为指定状态。

有以下几种模式:

--soft不删除工作区改动代码,撤销 commit ,不撤销 git add . (git status 是绿色的状态)。

代码语言:javascript代码运行次数:0运行复制git reset --soft HEAD^--mixed重置索引,但不重置工作树,更改后的文件标记为未提交(add)的状态。

即不删除工作区改动代码,撤销 commit ,并且撤销 git add . 这个是默认参数。

代码语言:javascript代码运行次数:0运行复制git reset --mixed HEAD^

// ===

git reset HEAD^--hard删除工作区改动代码,撤销 commit ,撤销 git add . 注意完成这个操作后,就恢复到了上一次的 commit 状态,从指定的 ` 往后,工作树中的任何变化都会被丢弃。

代码语言:javascript代码运行次数:0运行复制git reset --hard HEAD^这里误操作了也不用怕,可以恢复的,下面会讲。

--merge重置索引并更新工作树中在 和 HEAD 之间不同的文件,但保留那些在索引和工作树之间不同的文件(即那些有未被添加的修改)。 如果一个在 和索引之间不同的文件有未分阶段的变化,重置将被中止。

换句话说, --merge 做的是类似于 git read-tree -u -m 的事情,但会转发未合并的索引条目。

代码语言:javascript代码运行次数:0运行复制git reset --merge HEAD^--keep重置索引项并更新工作树中 和 HEAD 之间不同的文件。 如果一个在 和 HEAD 之间不同的文件有本地修改,重置将被中止。

代码语言:javascript代码运行次数:0运行复制git reset --keep HEAD^--no-recurse-submodules当工作树被更新时,使用 --recurse-submodules 也将根据超级项目中记录的提交,递归地重置所有活动的子模块的工作树,同时也将子模块的 HEAD 设置为在该提交中被分离。

我现在的需求使用 --mixed 就可以了:

代码语言:javascript代码运行次数:0运行复制git reset --mixed HEAD^

// or

git reset --mixed HEAD~1git reset 和 git revert 的区别git revert 后多出一条 commit ,提醒同事,这里有回撤操作。

git reset 直接版之前 commit 删掉,非 git reset --hard 的操作是不会删掉修改代码,如果远程已经有之前代码,需要强推 git push -f

误操作后也可以恢复例如执行了 git reset --hard HEAD^ 后 commit 记录也会被消除, git 还可以指定回到未来的某个版本,只要你知道 commit_id 就可以:

代码语言:javascript代码运行次数:0运行复制$ git reset --hard 1094a

HEAD is now at 83b0afe append GPL如果不知道 commit_id 怎么办呢,也不用担心。

在 Git 中,总是有后悔药可以吃的。当你用 $ git reset --hard HEAD^^ 回退过头了,再想恢复到最近一次提交,就必须找到这次提交的的 commit id 。Git 提供了 git reflog 命令,用来记录你的每一次命令:

代码语言:javascript代码运行次数:0运行复制$ git reflog

e475afc HEAD@{1}: reset: moving to HEAD^

1094adb (HEAD -> master) HEAD@{2}: commit: append GPL

e475afc HEAD@{3}: commit: add distributed

eaadf4e HEAD@{4}: commit (initial): wrote a readme file这样你又可以回到未来了。

未经允许不得转载:w3h5 » Git基础:利用reset重置命令恢复commit代码及其扩展