版本回退
当文件修改到一定程度的时候,可以commit
一下提交到仓库。一旦你把文件弄乱也可以恢复到最近的版本。
使用命令git log
查看最近提交的版本,比如
$ git log
commit 2c1479bede14ee4be0b5390b6a8fe58c5ab46f46
Author: ubuntuYGQ <zjumydr@gmail.com>
Date: Tue Dec 19 11:20:42 2017 +0800
append GPL
commit 3ffd7a91d63471082bdf14bf6c9c95d84bd3f7e9
Author: ubuntuYGQ <zjumydr@gmail.com>
Date: Tue Dec 19 11:18:51 2017 +0800
add distribution
commit 98596c8cea46fa686bfae2d8bf3bd53539c9e067
Author: ubuntuYGQ <zjumydr@gmail.com>
Date: Tue Dec 19 10:44:56 2017 +0800
wrote a readme.file
commit 7a0be406eee0f0dfe5ae9d72cc788422f077733e
Author: ubuntuYGQ <zjumydr@gmail.com>
Date: Tue Dec 19 10:41:55 2017 +0800
add readme.txt to repository
最近一次改动的是append GPL,上面一长串16进制字符串表示版本号,是git自动分配的。
log后加上 –pretty=oneline 命令,即git log --pretty=oneline
可以使显示变得简洁
$ git log --pretty=oneline
2c1479bede14ee4be0b5390b6a8fe58c5ab46f46 append GPL
3ffd7a91d63471082bdf14bf6c9c95d84bd3f7e9 add distribution
98596c8cea46fa686bfae2d8bf3bd53539c9e067 wrote a readme.file
7a0be406eee0f0dfe5ae9d72cc788422f077733e add readme.txt to repository
如上,前面部分显示的是版本号,后面是你用命令commit
添加的说明。
git reset --hard HEAD^ //回退到上一版本
git reset --hard HEAD^^ //回退到上上一版本
……
git reset --hard HEAD~100 //回退到上100个版本
恢复到上一版本如下:
$ git reset --hard HEAD^
HEAD is now at 3ffd7a9 add distribution
其中HEAD是git中一个头指针,它指向哪里哪里就是现在所在版本。现在版本就是3ffd7a9
这个版本
可以用git log查看当前所在版本
现在到了之前的版本,那么这次更改之前的版本已经用git log
看不到了,如何回去呢?只要这个黑乎乎的终端没有关闭,就可以找到它的版本号,2c1479bede14ee4be0b5390b6a8fe58c5ab46f46
我们只须输入前面几位就可以,git可以帮我们找到所匹配的版本号。
$ git reset --hard 2c1479b
HEAD is now at 2c1479b append GPL
现在又回到了append GPL版本。
那么,使用cat readme.txt
查看当前readme.txt的内容。
$ cat readme.txt
Git is a distribution version control system.
Git is free software distributed under the GPL.
假如你已经关闭了终端,看不到之前的版本号的时候怎么办呢?
使用命令git reflog
可以查看每一次使用的命令以及版本号,于是就可以可以恢复到任意版本了。
工作区和暂存区
往readme.txt中添加一句话(随意添加),并且在learngit目录下新建一个文本文件LICENSE,用git status
查看当前状态显示
Change not staged for commit
改变未提交确认
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
readme.txt被修改了,而LICENSE还没被追踪到(没有添加到工作区)
现在把readme.txt和LICENSE都添加一下,再用git status
查看当前状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
modified: readme.txt
当前git已经知道新建的LICENSE文件,并且知道readme.txt被修改过。
现在暂存区(stage)的有了这两个文件,还需要提交到master分支.
使用git commit命令可以一次性把暂存区(stage)中的所有修改提交到master分支
$ git commit -m "Understand how stages works"
这时工作区已经没有工作可做了,工作区就是”干净的”
$ git status
On branch master
nothing to commit, working directory clean
管理修改
git管理的是修改,不是文件。
修改文件后,要先从工作区add到暂存区,才可以commit到master分支。
假如你第一次修改了文件,并且add到暂存区;然后第二次修改了文件,没有add到暂存区; 最后一次commit到master分支。最终的结果是只把第一次修改的文件提交到了master分支,第二次修改的文件没有提交到master分支。简单流程图就是:
first change -> git add -> second change -> git commit
正确的操作是在第二次改变文件之后,也要添加到暂存区(stage),最终一并提交到master分支。
小结:
git commit只提交暂存区中的内容。
撤销修改
当你不小心在readme.中添加了一条错误的内容后,你发现的及时还可以删除它。(git认为你已经做了修改)但是,然后呢?如何在git中撤销你所做的修改呢?
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard //撤销 changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
使用git checkout -- readme.txt
放弃修改。
注意:不可以省略掉--
,省略掉后就成了另一个命令了。
checkout可以做两件事:1、放弃工作区的修改
2、放弃前一次修改add到暂存区(stage)后又增加的修改
假如你发现你已经把修改提交到了stage还未提交到master分支,可以 用git reset HEAD readme.txt
.