创建一个版本库
首先选择一个合适的地方,创建一个空目录
$mkdir learngit
$cd learngit
$pwd
$ pwd (用于显示当前目录)
如果是windows系统,避免出现莫名其妙的问题,避免目录名(包含父目录)含有中文。
第二步,通过git init命令把这个目录变成Git可以管理的仓库
$git init
把文件添加到版本库
编写一个readme.txt文件,内容如下:
Git is a version control system.
一定要放到learngit目录下(子目录也行)
第一步,用命令git add告诉Git,把文件添加到仓库:
$git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容
git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了1行内容(readme.txt有两行内容)。
修改后提交文件
接着,我们修改readme.txt文件,改成如下内容:
Git is a version control system.
Learn Git.
运行git status命令看看结果:
git status命令可以让我们时刻掌握仓库当前的状态
用git diff这个命令能看到具体修改了什么内容:
知道了做了什么修改之后就能放心提交到仓库了
提交修改也是两步操作,首先第一步git add:
执行第二步git commit之前,我们再运行git status看看当前仓库的状态:
接下来可以提交了:
提交后,我们再用git status命令看看仓库的当前状态:
版本回退
用git log命令查看提交的历史记录:
退出git log状态,在英文状态下按键盘q键即可。
如果想要看简洁一点的输出信息,加上--pretty=oneline参数:
如果我们想要回退到上一个版本
首先,Git必须知道当前是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,再往上很多版本即往上N个版本的话就写成HEAD~N。
接着,我们用git reset命令进行回退。
看看readme.txt的内容是不是版本add Learn Git.(cat fileName):
我们还能按照这样的方式继续回退到再上一个版本。
如果我们想要回去 add Hello 的版本
有两种方式:
第一种,在上面的命令窗口找到 add Hello 的 commit id 是 ff6896b...,于是你就可以指定回到未来的某个版本。
第二种,因为我们回退到了某个版本之后,想要恢复到回退前的版本必须找到版本id(commit id),在找不到 commit id 的情况下,Git提供了一个命令 git reflog 来记录你的每一次命令:
撤销修改
git checkout -- fileName
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销(丢弃工作区的修改),这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git reset HEAD fileName
命令git reset HEAD fileName可以把暂存区的修改撤销掉(unstage),重新放回工作区。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- fileName。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD fileName,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。
删除文件
先添加一个新文件test.txt到Git并且提交:
1. 如果要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
2. 如果在版本库中删除后想要恢复该文件,使用版本回退方式:
3. 如果在文件夹中或者用 rm 操作误删了文件,工作区和版本库就不一致,git status会告诉你删除了哪些文件:
因为版本库里还有,所以可以把误删的文件恢复到最新版本:
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。