Git支持git reset命令,可以将"master"指向任意一个存在的提交ID,下面具体看一下:
首先HEAD^代表了HEAD的上一次的提交,当前的提交日志,列举了最新的三次提交
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# git log
- commit 6ca2d9e296e88155eefa1cbf4881745c58fd6295
- Author: test_01 <test_01@gmail.com>
- Date: Tue Dec 29 16:41:00 2015 +0800
- add new welcome.txt
- commit 5205e4d591b6b8c1e2f9c7920f80cbe701976b4d
- Author: test_01 <test_01@gmail.com>
- Date: Tue Dec 29 11:44:38 2015 +0800
- Add Bye to a/b/c/hello.txt
- commit cce206f9557381a1312aa131ed1b6c4da9f1f73e
- Author: test_01 <test_01@gmail.com>
- Date: Tue Dec 29 11:43:54 2015 +0800
- Test
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# cat .git/refs/heads/master
- 6ca2d9e296e88155eefa1cbf4881745c58fd6295
- [root@S-LAB-52 demo]# git reset --hard HEAD^
- HEAD is now at 5205e4d Add Bye to a/b/c/hello.txt
- [root@S-LAB-52 demo]# git reset --hard HEAD^
- HEAD is now at cce206f Test
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# cat .git/refs/heads/master
- cce206f9557381a1312aa131ed1b6c4da9f1f73e
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# git log -2
- commit cce206f9557381a1312aa131ed1b6c4da9f1f73e
- Author: test_01 <test_01@gmail.com>
- Date: Tue Dec 29 11:43:54 2015 +0800
- Test
- commit 9975c5d8cd5b25b33349bd30144d6bac5b24afe8
- Author: test_01 <test_01@gmail.com>
- Date: Mon Dec 28 17:34:55 2015 +0800
- which version checked in
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# git log --pretty=oneline
- cce206f9557381a1312aa131ed1b6c4da9f1f73e Test
- 9975c5d8cd5b25b33349bd30144d6bac5b24afe8 which version checked in
- 582e8137c51efc81cec1f17026ef97d282208aa2 who does commit
- 5c67e19b479ecf9892844491465c7cbaf75196ef New File For GIT
- [root@S-LAB-52 demo]#
- [root@S-LAB-52 demo]# git reset --hard 5c67e19b479ecf9892844491465c7cbaf75196ef
- HEAD is now at 5c67e19 New File For GIT
- [root@S-LAB-52 demo]# git log -1
- commit 5c67e19b479ecf9892844491465c7cbaf75196ef
- Author: root <root@S-LAB-52.(none)>
- Date: Mon Dec 28 08:46:39 2015 +0800
- New File For GIT
git reset --hard commitID,直接找回来。
那错误重置之后,没有记住早期的commitID,怎么可以还原回来呢?
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# cat .git/logs/refs/heads/master
- 0000000000000000000000000000000000000000 5c67e19b479ecf9892844491465c7cbaf75196ef \
- root <root@S-LAB-52.(none)> 1451263599 +0800 commit (initial): New File For GIT
- 5c67e19b479ecf9892844491465c7cbaf75196ef 93cc8866be680eb909d68c02148e9e7d689fa14a \
- root <root@S-LAB-52.(none)> 1451272489 +0800 commit: who does commit
- 93cc8866be680eb909d68c02148e9e7d689fa14a b76d431352e65c90e2f6c57793b16f8114d6ca05 \
- aaabbb <aaabbb@163.com.cn> 1451273334 +0800 commit (amend): who does commit
- b76d431352e65c90e2f6c57793b16f8114d6ca05 db8bd631c8ea69e968c583d009bd97224e110738 \
- test <test@staff.sina.com.cn> 1451273448 +0800 commit (amend): who does commit
- db8bd631c8ea69e968c583d009bd97224e110738 582e8137c51efc81cec1f17026ef97d282208aa2 \
- test_01 <test_01@gmail.com> 1451274083 +0800 commit (amend): who does commit
- 582e8137c51efc81cec1f17026ef97d282208aa2 9975c5d8cd5b25b33349bd30144d6bac5b24afe8 \
- test_01 <test_01@gmail.com> 1451295295 +0800 commit: which version checked in
- 9975c5d8cd5b25b33349bd30144d6bac5b24afe8 cce206f9557381a1312aa131ed1b6c4da9f1f73e \
- test_01 <test_01@gmail.com> 1451360634 +0800 commit: Test
- cce206f9557381a1312aa131ed1b6c4da9f1f73e 5205e4d591b6b8c1e2f9c7920f80cbe701976b4d \
- test_01 <test_01@gmail.com> 1451360678 +0800 commit: Add Bye to a/b/c/hello.txt
- 5205e4d591b6b8c1e2f9c7920f80cbe701976b4d 6ca2d9e296e88155eefa1cbf4881745c58fd6295 \
- test_01 <test_01@gmail.com> 1451378460 +0800 commit: add new welcome.txt
- 6ca2d9e296e88155eefa1cbf4881745c58fd6295 5205e4d591b6b8c1e2f9c7920f80cbe701976b4d \
- test_01 <test_01@gmail.com> 1451378748 +0800 HEAD^: updating HEAD
- 5205e4d591b6b8c1e2f9c7920f80cbe701976b4d cce206f9557381a1312aa131ed1b6c4da9f1f73e \
- test_01 <test_01@gmail.com> 1451378760 +0800 HEAD^: updating HEAD
- cce206f9557381a1312aa131ed1b6c4da9f1f73e 5c67e19b479ecf9892844491465c7cbaf75196ef \
- test_01 <test_01@gmail.com> 1451379373 +0800 5c67e19b479ecf9892844491465c7cbaf75196ef: updating HEAD
- 5c67e19b479ecf9892844491465c7cbaf75196ef 6ca2d9e296e88155eefa1cbf4881745c58fd6295 \
- test_01 <test_01@gmail.com> 1451379551 +0800 6ca2d9e296e88155eefa1cbf4881745c58fd6295: updating HEAD
Git提供了git reflog命令,可以对该文件进行操作,使用show子命令可以显示该文件的内容
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# git reflog show master
- 6ca2d9e master@{0}: 6ca2d9e296e88155eefa1cbf4881745c58fd6295: updating HEAD
- 5c67e19 master@{1}: 5c67e19b479ecf9892844491465c7cbaf75196ef: updating HEAD
- cce206f master@{2}: HEAD^: updating HEAD
- 5205e4d master@{3}: HEAD^: updating HEAD
- 6ca2d9e master@{4}: commit: add new welcome.txt
- 5205e4d master@{5}: commit: Add Bye to a/b/c/hello.txt
- cce206f master@{6}: commit: Test
- 9975c5d master@{7}: commit: which version checked in
- 582e813 master@{8}: commit (amend): who does commit
- db8bd63 master@{9}: commit (amend): who does commit
- b76d431 master@{10}: commit (amend): who does commit
- 93cc886 master@{11}: commit: who does commit
点击(此处)折叠或打开
- [root@S-LAB-52 demo]# git reset --hard master@{1}
- HEAD is now at 5c67e19 New File For GIT
- [root@S-LAB-52 demo]# git reflog show master
- 5c67e19 master@{0}: master@{1}: updating HEAD
- 6ca2d9e master@{1}: 6ca2d9e296e88155eefa1cbf4881745c58fd6295: updating HEAD
- 5c67e19 master@{2}: 5c67e19b479ecf9892844491465c7cbaf75196ef: updating HEAD
- cce206f master@{3}: HEAD^: updating HEAD
- 5205e4d master@{4}: HEAD^: updating HEAD
- 6ca2d9e master@{5}: commit: add new welcome.txt
- 5205e4d master@{6}: commit: Add Bye to a/b/c/hello.txt
- cce206f master@{7}: commit: Test
- 9975c5d master@{8}: commit: which version checked in
- 582e813 master@{9}: commit (amend): who does commit
- db8bd63 master@{10}: commit (amend): who does commit
- b76d431 master@{11}: commit (amend): who does commit
- 93cc886 master@{12}: commit: who does commit
- [root@S-LAB-52 demo]# git reset --hard master@{1}
- HEAD is now at 6ca2d9e add new welcome.txt
git reset有两种用法:
点击(此处)折叠或打开
- git reset [-q] [<commit>] [--] <paths>....
- git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
第一种用法,不会重置引用,也不会改变工作区,会使用指定提交状态的文件替换掉暂存区中的文件。
当commitID省略时,为了避免paths与commitID冲突,需要在paths前面增加--以示区分。
第二种用法,会重置引用,根据选项定义,可以对暂存区或者工作区进行重置:
1)--hard,git reset --hard :会替换引用的指向;会替换暂存区;会替换工作区;替换后工作区/暂存区/引用指向的内容相同
2)--soft,git reset --soft :只更改引用的指向,不会影响暂存区和工作区
3)--mixed,默认值,git reset :更改引用的指向,重置暂存区,不改变工作区
git reset:用HEAD指向的目录树重置暂存区,工作区不受影响,引用未改变,相当于撤销git add命令更新到暂存区的内容撤出暂存区
git reset HEAD:同git reset
git reset -- filename:将filename的改动撤出暂存区,暂存区其他文件不变,相当于git add filename的逆向操作
git reset HEAD filename:同git reset -- filename
git reset --soft HEAD^:工作区和暂存区不变,引用向前回退一次
git reset HEAD^:工作区不变,暂存区回退到上一次提交之前,引用向前回退一次
git reset --mixed HEAD^:同git reset HEAD^
git reset --hard HEAD^:撤销最近的修改,工作区和暂存区都回退到上一次提交的状态
========================================================================================
下面看一下git checkout的使用,有三种用法:
用法一:git checkout [-q] [] [--] [paths]......
commitID是可选的,
当省略commitID时,相当于从暂存区检出(覆盖指定文件),检出命令主要是覆盖工作区,
当指定commitID时,相当于从版本库检出(覆盖指定文件),同时替换暂存区和工作区的相应文件
用法二:git checkout []
不用paths时,会改变HEAD指针指向对应的分支,此时主要用于切换分支。
当省略branch时,相当于对工作区进行状态检查。
用法三:git checkout [-m] [-b | --orphon] []
用于创建和切换到新的分支,新的分支从指定的提交开始创建。
git checkout:汇总工作区、暂存区与HEAD的差异
git checkout HEAD:同git checkout
git checkout -- filename:用暂存区中的filename覆盖工作区的文件
git checkout branch -- filename:HEAD指向不变,用branch指向的提交中的filename覆盖暂存区和工作区中的相应文件
git checkout .:取消所有工作区中的修改(相对于暂存区),即用暂存区中的文件覆盖工作区中的所有文件