git 笔记记录(五) git重置

来源:互联网 发布:android 布局优化 编辑:程序博客网 时间:2024/05/19 03:22

用 git reset hard命令后,所有的提交都被回到了从前,包括代码库中的记录都回到了过去。默认非裸版本库(带有工作区)都提供分支日志功能,因为默认工作区版本库有以下设置

     git config core.logallrefupdates   true

     master记录了分支的变迁,最新的改变追加到文件的末尾

     tail -5 .git/logs/refs/heads/master 

             15c643c    66ae14e     bluceshang <1323506213@qq.com> 1384945487 +0800commit: modify welcome

66ae14     d7b6764     bluceshang <1323506213@qq.com> 1384946981 +0800commit: add file

d7b676     0d61bf3      bluceshang <1323506213@qq.com> 1385028943 +0800commit: does master follow this new commit?

0d61bf      d7b6764     bluceshang <1323506213@qq.com> 1385029011 +0800reset: moving to HEAD^

d7b67       0d61bf35    bluceshang <1323506213@qq.com> 1385029091 +0800reset: moving to 0d61bf3

    git  reflog命令对这个文件进行操作,使用show命令显示此文件内容

    git reflog show master | head -5

0d61bf3 master@{0}: reset: moving to 0d61bf3

d7b6764 master@{1}: reset: moving to HEAD^

0d61bf3 master@{2}: commit: does master follow this new commit?

d7b6764 master@{3}: commit: add file

66ae14e master@{4}: commit: modify welcome

   查看git reflog的输出与直接查看日志文件的不同在于显示顺序不同,即最新改变放在最前面显示,而且只显示每次改变的最终的SHA1值,最大的区别在于git reflog命令的输出中还提供了一个方便记忆的表达式:<refname>@{<n>}.含义是引用<refname>之前第<n>次改变时的SHA1值

        重置回两次改变前的值

        git reset --hard master@{2}

       

   命令格式:git reset[--soft | --mixed | --hard] [<commit>]

   1.使用参数--hard 如:git reset --hard <commit>

   会执行上面的全部动作,动作1替换引用的指向,引用指向新的提交ID

  动作2替换暂存区,替换后,暂存区的内容和引用指向的目录树一致

  动作3替换工作区,替换后,工作区的内容变得和暂存区一致,也和HEAD报指向的目录树内容相同.

  2.使用--soft 如git reset --soft <commit>  执行上图中的动作1.即只改引用的指向,不改变暂存区与工作区.

  3.使用--mixed或不使用参数,如git reset <commit>

              会执行上图中动作1和动作2,即更改引用的指向及重置暂存区,但是不改变工作区.

 4.git reset -- filename 仅将文件filename的发动撤出暂存区,暂存区中其它文件不改变,相当于git add filename的反向操作.也相当于git reset HEAD filename命令

5.git reset --soft HEAD^  工作区与暂存区都不改变,但是引用会回退一次,当对最新提交说明或提交的更改不满意时,撤销最新的提交以便重新提交.

   git commit --amend -m "description" 相当于下面2个命令

   git reset --soft HEAD^

   git commit -e -F .git/COMMIT_EDITMSG

6. git reset HEAD^工作区不改变,但是暂存区会回退到上一次提交之前. 相当于git reset --mixed HEAD^

7.git reset --hard HEAD^彻底撤消最近的提交,引用回退到前一次,而且工作区与暂存区都会回退到上一次提交状态,上一次提交全部丢失.