`

(转载)git revert和git reset的区别及示例

阅读更多

原文地址:http://blog.csdn.net/hudashi/article/details/7664460

 

原文如下:

git revert 是撤销某次操作,此次操作之前的commit都会被保留
git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区
具体一个例子,假设有三个commit, git st:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
当执行git revert HEAD~1时, commit2被撤销了
git log可以看到:
commit1:add test1.c
commit3:add test3.c
git status 没有任何变化
如果换做执行git reset --soft(默认) HEAD~1后,运行git log
commit2: add test2.c
commit1: add test1.c
运行git status, 则test3.c处于暂存区,准备提交。
如果换做执行git reset --hard HEAD~1后,
显示:HEAD is now at commit2,运行git log
commit2: add test2.c
commit1: add test1.c
运行git st, 没有任何变化
另外:
git revert <commit log string>是撤消该commit,作为一个新的commit。
 
本人示例如下:

1,初始化git仓库

mkdir test
cd test
git init
touch test1.c
touch test2.c
touch test3.c
git add test1.c
git commit -m “第一次提交”
git add test2.c
git commit -m “第二次提交”
git add test3.c
git commit -m “第三次提交”

 

git log查看结果:

commit 4f6aa621149f98edf8887fa2219b63c84a95f317
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第三次提交”

commit 4bf0d2237bddd50e3674d264eebcf696af61790a
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第二次提交”

commit 61f08c6d73f7f5822a39fba5b177d5394c77f26d
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第一次提交”

2,执行git revert HEAD~1

查看git log

 

结果:

commit 8119ed3e329a2cd939291949cd265db6fc658b76
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:48:31 2016 +0800

    Revert "“第二次提交”"

    This reverts commit 4bf0d2237bddd50e3674d264eebcf696af61790a.

commit 4f6aa621149f98edf8887fa2219b63c84a95f317
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第三次提交”

commit 4bf0d2237bddd50e3674d264eebcf696af61790a
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第二次提交”

commit 61f08c6d73f7f5822a39fba5b177d5394c77f26d
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:42:26 2016 +0800

    “第一次提交”

 git status查看:

On branch master
nothing to commit, working directory clean

 ls查看:

test1.c	test3.c

发现 test2.c文件找不到了,但是可以通过再次运行git revert HEAD~1命令找回来,找回来的文件放在了暂存区里了。

 

3,重新建立删除原有test仓库,并重新建立和初始化

执行git reset HEAD~1

git log查看:

commit 09e51cd049ee37f1fece19e042390196367328f2
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第二次提交”

commit 988e3312b3c6e5e3a20d3dc95cfa9b61e558b5fc
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第一次提交”

 git status查看结果:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	test3.c

nothing added to commit but untracked files present (use "git add" to track)

 

test3.c文件在当前工作目录,并没有进入暂存区,所以是红色字体显示(未被追踪的文件)

 

4,重新建立删除原有test仓库,并重新建立和初始化

执行git reset --soft HEAD~1

git log查看:

 

commit 09e51cd049ee37f1fece19e042390196367328f2
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第二次提交”

commit 988e3312b3c6e5e3a20d3dc95cfa9b61e558b5fc
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第一次提交”

 git status查看结果:

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

	new file:   test3.c

 test3.c文件放在了暂存区里了。

无论是git reset HEAD~1 还是 git reset --soft HEAD~1,都能撤销指定的提交,只不过,前者将撤销的提交放在了当前目录,后者将撤销的提交放在了暂存区。而且使用ls查看,三个文件也都在当前工作目录里呢。

 

注意:如果执行git reset --soft HEAD~2则第二次提交和第三次提交的文件都撤销了,放入暂存区里了。

 

5,重新建立删除原有test仓库,并重新建立和初始化

执行git reset --hard HEAD~1结果:

HEAD is now at 09e51cd “第二次提交”

git log查看:

commit 09e51cd049ee37f1fece19e042390196367328f2
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第二次提交”

commit 988e3312b3c6e5e3a20d3dc95cfa9b61e558b5fc
Author: zhanghaiwei <forest@163.com>
Date:   Tue Feb 16 11:56:29 2016 +0800

    “第一次提交”

 git status查看:

On branch master
nothing to commit, working directory clean

ls查看:

test1.c	test2.c

 发现test3 文件丢失。

分享到:
评论

相关推荐

    git revert和git reset的区别详解

    通过上述介绍,我们可以清晰地看出`git revert`和`git reset`的区别在于: - `git revert`是通过创建一个新的提交来撤销更改,而`git reset`则是通过移动HEAD指针来撤销更改。 - `git revert`不会影响原有的提交...

    git批量拉取项目的脚本,简便快捷

    在标签“git”相关的其他知识点中,包括但不限于分支管理(如`git branch`, `git checkout`, `git merge`, `git rebase`)、提交历史查看(`git log`)、回退版本(`git reset`, `git revert`)、标签管理(`git tag...

    git命令大全-git-cheatsheet.docx

    ### Git命令大全详解 ...- **示例**: `git revert 123abc`会创建一个新的提交来撤销`123abc`这个提交所做的更改。 以上是Git命令大全的部分内容,通过这些命令,你可以有效地管理和协作于Git仓库中的代码。无论...

    GIT版本控制管理工具操作手册

    6. **重置与回退**:如`git reset`和`git revert`用于撤销变更,理解它们的区别很重要。 7. **解决冲突**:当多人同时修改同一文件时可能会出现冲突,手册会介绍如何识别和解决这些冲突。 8. **标签管理**:`git ...

    如何使用Git优雅的回滚实现

    理解`git revert`和`git reset`的区别,掌握它们在不同场景下的使用,以及如何处理冲突和部分回滚,将有助于在面对复杂情况时保持代码库的整洁和健康。在实际操作中,务必谨慎,并确保团队成员了解所做的任何回滚...

    git命令整理.docx

    - **示例**:`git reset --hard HEAD^` (回退到上一个版本) 3. **git revert**: - **作用**:撤销某个提交。 - **示例**:`git revert &lt;commitHash&gt;` #### 七、其他常用命令 1. **git stash**: - **作用**...

    git 和 smartgit使用

    **6.3 `git revert`与`git reset`的区别** `git revert`是创建一个新的提交来撤销之前的提交,而`git reset`则是直接修改历史记录。 #### 七、暂存区与工作区 **7.1 查看差异 (git diff)** `git diff`命令可以...

    my-git, Individual collecting material of learning git(有关 git 的学习资料).zip

    在实际操作中,掌握版本回退(`git reset`和`git revert`)、解决冲突、创建标签(Tag)以及工作流模型(例如Git Flow或GitHub Flow)也很关键。这些内容可能在压缩包中的某个文件中详细讲解。 Git的图形界面工具,...

    Git常用命令.md

    3. 使用`git add`和`git commit`提交已解决的冲突。 #### 取消修改 撤销对文件的修改或恢复到某个版本的状态。 ##### 查看工作目录和暂存区的状态 检查当前工作目录和暂存区的状态。 **命令示例:** ``` git ...

    Git常用命令整理归纳

    - **示例**: 如果提交 ID 为 `123456`,则命令为 `git reset --hard 123456`。 **7.2 撤销指定提交** - **命令**: `git revert &lt;commit-id&gt;` - **用途**: 创建一个新的提交来撤销指定提交的更改。 - **示例**: ...

    Git命令大全PDF文档

    本篇将根据提供的内容,深入解析Git的基础与进阶命令,帮助读者更好地理解和运用这些命令。 #### 二、创建与初始化 - **`git clone`**:用于克隆一个已存在的远程仓库至本地。 - **示例**: ``` $ git clone ...

    git Dash 中文手册包

    6. **版本回溯**:掌握`git reset`和`git revert`等命令,用于撤销错误的提交或恢复旧版本。 7. **标签管理**:使用`git tag`命令为特定的提交打标签,便于标识重要的里程碑。 8. **工作流**:学习不同的开发工作...

    git讲师共享资料.zip

    对于版本控制,Git提供了强大的`git log`来查看提交历史,`git diff`来比较不同版本的差异,`git revert`或`git reset`可以撤销或回退到某个提交。如果误删文件,`git checkout -- [file]`可以恢复。 在团队协作中...

    git详细用户手册

    - **撤销合并**:`git reset`和`git revert`可以撤销合并。 - **快进合并**:当目标分支是当前分支的子集时,合并无需合并冲突。 - **修复错误**:`git amend`用于修正最近的提交,`git rebase`重写历史。 - **...

    工作办公软件-版本控制git.zip

    6. 撤销操作:Git的`git revert`和`git reset`命令可以帮助用户撤销不想要的更改,无论是单个文件还是整个提交。 7. 子模块:对于大型项目,Git支持子模块功能,允许在一个项目中引用其他Git仓库,方便管理依赖。 ...

    day01_Git.zip

    4. **版本回溯**:通过`git log`查看提交历史,`git reset`和`git revert`可以撤销更改,`git diff`显示文件差异。 5. **远程仓库操作**:讲解如何在GitHub或其他托管平台创建远程仓库,使用`git remote`添加、查看...

    pro git 完整、完美中文版...

    - **总结**: 介绍了Git中的高级工具和技术,如修订版本选择、交互式暂存、储藏、重写历史、调试、子模块及子树合并等。 #### 七、自定义Git **7.1 配置Git** - **命令**: - `git config --global &lt;key&gt; &lt;value&gt;`...

    Git_tool.zip

    6. **回溯与撤销**:`git reset`和`git revert`可以用来撤销提交或回退到某个历史状态,但两者的机制不同,使用时需谨慎。 7. **标签**:`git tag`命令用于创建、列出、删除或推送标签,常用于标记重要的提交,如...

Global site tag (gtag.js) - Google Analytics