目录
一、Git介绍
Git的工作原理/流程:
Git与SVN的区别:
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统 SVN,CVS 等,最核心的区别。
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
3、Git和SVN的分支不同:分支在SVN中一点都不特别,其实它就是版本库中的另外一个目录。
4、Git没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比Git缺少的最大的一个特征。
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git的工作流程
一般工作流程如下:
1)克隆 Git 资源作为工作目录。 2)在克隆的资源上添加或修改文件。 3)如果其他人修改了,你可以更新资源。 4)在提交前查看修改。 5)提交修改。 6)在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
二、在windows上安装Git
1、下载Git的windows安装包:Git-2.24.1.2-64-bit.exe,或者从官网下载 Git for Windows。
2、双击exe文件进行默认安装, 完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了。
在开始菜单里找到"Git"->"Git Bash"并点击。
点击后会弹出 Git 命令窗口,然后可以在该窗口进行 Git 操作了。
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
git config --global user.name "用户名"
git config --global user.email "邮箱"
注意:git config --global ,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定的不同的用户名和邮箱。
三、创建版本库(仓库)
版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
以下是在 D:盘git目录下创建一个testgit文件夹。
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。下面通过命令 git init 把这个目录变成git可以管理的仓库,如下:
这时候testgit目录下会多了一个.git的目录,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。这个.git 目录包含了资源的所有元数据,是Git来跟踪管理版本的,不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。
四、把文件添加到版本库中
在版本库testgit目录下新建一个记事本文件 readme.txt
内容如下:11111111
使用命令 git add readme.txt添加到暂存区里面去。如下:
用命令 git commit 告诉Git,把文件提交到仓库。
可以通过命令git status来查看是否还有文件未提交,加上 -s 参数,可以获得简短的结果输出。如果没加该参数会详细输出内容:如下:
以上说明没有任何文件未提交,但是我现在继续来改下readme.txt内容,比如我在下面添加一行22222222内容,继续使用git status来查看下结果:
上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。可以使用命令git diff readme.txt 查看readme.txt到底改了什么内容:
如上可以看到,readme.txt文件内容从一行11111111改成 二行 添加了一行22222222内容。
知道了对readme.txt文件做了什么修改后,可以放心的提交到仓库了。
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。
尚未缓存的改动:git diff
查看已缓存的改动: git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat
五、版本回退
现在继续对readme.txt文件进行修改,再增加一行内容为33333333.继续执行命令如下:
现在已经对readme.txt文件做了三次修改了,那么现在以使用命令 git log 查看下历史记录,如下所示:
git log命令显示从最近到最远的显示日志,可以看到最近三次提交,最近的一次是,增加内容为33333333.上一次是添加内容22222222,第一次默认是 11111111.如果嫌上面显示的信息太多的话,可以使用命令 git log --oneline ,如下:
如果想使用版本回退操作,把当前的版本回退到上一个版本,可以使用如下2种命令,第一种是:git reset --hard HEAD^ ,如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。那如果要回退到前100个版本的话,使用上面的方法肯定不方便,可以使用:git reset --hard HEAD~100 。
通过命令cat readme.txt查看可以看到,内容已经回退到上一个版本了。继续使用git log 来查看,可以看到 增加333333 内容没有了。如果想回退到最新的版本,即有333333的内容,可以通过版本号回退,使用命令 git reset --hard 版本号 ,至于版本号可以通过 git reflog 获取。
通过 cat 可以看到 目前已经是最新的版本了。
六、工作区、暂存区和版本库
工作区:就是在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
前面使用Git提交文件到版本库有两步:第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
下面在readme.txt再添加一行内容为44444444,接着在目录下新建一个文件为test.txt 内容为aaaaaaaa,然后用命令 git status来查看下状态,如下:
使用 git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态,如下:
然后可以使用git commit一次性提交到分支上,如下:
七、撤销修改和删除操作
1、撤销修改:
在readme.txt文件里面增加一行 内容为55555555,我们先通过命令查看如下:
在未提交之前,发现添加55555555内容有误,需要马上恢复以前的版本,现在可以有如下几种方法可以做修改:
第一:如果知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
第二:我可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^
当然也可以不使用上面的2种方法,直接使用撤销命令进行操作。首先在做撤销之前,先用 git status 查看下当前的状态。如下所示:
可以发现,Git会告诉我们,git restore <file> (不同版本略有区别)可以丢弃工作区的修改, 如下所示:
命令 git restore readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况:一种是readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
对于第二种情况,我想我们继续看下,假如现在我对readme.txt添加一行 内容为66666666,git add 增加到暂存区后,接着添加内容77777777,然后通过撤销命令让其回到暂存区后的状态。如下所示:
由上可以看到,readme.txt放入暂存区后,接着又作了修改,撤销修改就回到放入到暂存区后的状态了。
2、撤销删除:
在版本库testgit目录添加一个文件a.txt,然后提交,提交之后使用 rm a.txt 进行删除操作, 如下:
一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm a.txt ,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉。由 git status 的提示可以发现,在没有commit之前,git restore <file> (不同版本略有区别)可以恢复被删掉的文件。