欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 14:23:43
...

原文地址: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 reset