继续分享几个很有用的git 命令。
git reset
git reset
有两个功能,当git reset
带具体文件名时,则是将某次提交的文件拷贝到暂存区(索引)。比如:
git reset HEAD^^ main.c
这时候暂存区保存的就是前两次提交的main.c文件的快照。
当这个命令不跟文件名时,则表示移动HEAD指针,使用该命令时添加不同参数会对HEAD指针、暂存区(索引)和工作目录产生不同的影响。使用的参数主要是–soft/mixed (default)/hard。下面就通过举例来说明这三个参数对HEAD指针、暂存区(索引)和工作目录的影响。
假设现在我们有一个文件file,并且对这个文件提交了两次,每次都有不同版本,分别是file.v1和file.v2,此时我们处于最新版本file.v2。然后使用命令
git --[soft/mixed/hard] HEAD^
使用–soft时,HEAD指针指向file.v1的那个版本,暂存区和工作区并没有什么改变。
使用–mixed时,除了HEAD指针指向file.v1的那个版本,暂存区也拷贝了file.v1的快照,但工作区并没有改变,还是file.v2。
使用–hard时,HEAD指针指向file.v1的那个版本,暂存区和工作目录都回滚到之前的版本,都变成file.v1。
当使用–soft和–mixed时,输入git log命令,会发现HEAD指向回滚的版本,最新的版本则无法显示,想要返回最新版本,可以先输入git log --reflog
,查看所有提交,然后在输入git reset <newest-commit-id>
来返回最新提交,或者输入git reset master
(当前分支的名字)。当在工作区继续提交新的提交,那么HEAD指针就会返回当前最新提交。
使用–hard时,输入git log命令一样会发现无法显示最新的版本,通过git log --reflog
和git reset --hard
也可以返回最新版本。但是如果在回滚版本后再做新的提交,那么HEAD指针会指向在回滚版本后的最新提交。比如现在有两个提交commit-id1,commit-id2,现在使用–hard回滚到commit-id1,在此基础上提交commit-id3,通过git log
命令后会发现,只有commit-id1和commit-id3,commit-id2则不会存在。
git checkout
当你不小心对某个文件的内容搞混乱了,想恢复到之前的样子,这时候git checkout
就派上用场了。(如果该文件已经添加到了暂存区,但还未提交,可以使用上面讲的git reset HEAD
返回)
git checkout [commit-id] [--] filename
commit-id可以是HEAD,也可以是以前的提交,返回以前提交后,想要重新恢复到最新的版本,可以使用git checkout HEAD filename
即可。此时HEAD指针不会移动。(测试过不加–也可以)
当后面带的是提交ID时,可以方便的将项目切换到其它提交上去。
git checkout commit-id ## git checkout HEAD^/master^^
此时HEAD指针指向comit-id对应的提交,工作区也会回滚到这次提交的内容。这时的HEAD指针称为游离指针(detached HEAD),游离指针指的就是HEAD指针指向了某次具体提交,而不是指向分支名(比如master)。当在游离态时,你依然可以在此提交上做新的提交,但是这种提交会在HEAD返回master后被git垃圾回收机制删除,除非你对这次提交创建了分支,使得有一个分支名来指向这次提交。