分布式版本控制系统——Git详解
前言:
分布式相比于集中式的最大区别在于开发者可以将代码提交到本地,每个开发者通过克隆,在本地机器上拷贝一个完整的git仓库。
下图是经典的git开发过程:
git的功能特性如下:
- 从服务器上克隆完整的git仓库(包括代码和版本信息)到单机上;
- 在自己的机器上根据不同的开发目的,创建分支,修改代码;
- 在单机上自己创建的分支上提交代码;
- 在单机上合并分支;
- 把服务器上最新版的代码fetch下来,然后跟自己的主分支合并;
- 生成补丁,把补丁发送给主开发者;
关于git就介绍至此了,接下来将演示git的基本操作。
博文大纲:
- 一、安装git
- 二、git库的创建及介绍
- 三、git库的基本操作
- 四、撤销修改的操作
- 五、将本地git库关联到github
- 六、从github下载到本地git版本库
git可以安装在Windows、mac、Linux等操作系统之上,这里将写下如何安装在Linux系统之上,及其基本操作。
一、安装git
非常简单,就一条命令,如下:
[root@git ~]# yum -y install git
二、git库的创建及介绍
#最好使用一个空的目录作为git库[root@git ~]# mkdir git[root@git ~]# cd git[root@git git]# git init #在空目录下初始化为git库初始化空的 Git 版本库于 /root/git/.git/[root@git git]# ls -a #初始化成功后,会生成一个.git的隐藏目录. .. .git#生成的隐藏目录是用来跟踪管理版本库的,不建议随便修改其目录中的文件,#如果改乱了,就把git库给破坏了。
在git版本库中,有三个重要的概念:工作区、暂存区、版本库。
- 工作区:就是你的系统中可以看到的目录;
- 暂存区:一般存放在.git目录下的index文件中,所以也会将暂存区叫做索引;
- 版本库:工作区中的有一个.git隐藏目录,这个不算工作区,而是git的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
上图中,左侧为工作区,右侧为版本库,在版本库中标记为"index"的区域就是暂存区,标记为"master"的是master分支代表的目录树。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached
当执行 "git checkout ." 或者 "git checkout --
当执行 "git checkout HEAD ." 或者 "git checkout HEAD
三、git库的基本操作
#需要先自报家门,声明姓名及邮箱[root@git git]# git config --global user.name "ljz"[root@git git]# git config --global user.email "ljz@ljz.com"[root@git git]# echo "aaaa" > git.txt #创建一个文件用于测试[root@git git]# git add git.txt #将测试文件添加到暂存区[root@git git]# git commit -m "第一次提交" #将暂存区的文件提交到版本库,并且一定要使用"-m"选项注明提交说明[master(根提交) eecbb4d] 第一次提交 1 file changed, 1 insertion(+) create mode 100644 git.txt[root@git git]# echo "bbbb" >> git.txt #修改测试文件内容[root@git git]# git add git.txt #添加到暂存区[root@git git]# git status #查看git的状态# 位于分支 master# 要提交的变更:# (使用 "git reset HEAD ..." 撤出暂存区)## 修改: git.txt #可以看到提示git.txt已被修改#新建几个测试文件[root@git git]# echo "第二个测试文件" > git2.txt[root@git git]# echo "第三个测试文件" > git3.txt[root@git git]# ls #确认新建的测试文件git2.txt git3.txt git.txt[root@git git]# git add git2.txt git3.txt #一次提交多个文件[root@git git]# git status #查看git的状态# 位于分支 master# 要提交的变更:# (使用 "git reset HEAD ..." 撤出暂存区)## 修改: git.txt# 新文件: git2.txt# 新文件: git3.txt#上面是提示git被修改,并且添加了两个新的文件[root@git git]# git commit -m "提交多个版本" #将暂存区的多个版本进行提交[master 86c5044] 提交多个版本 3 files changed, 3 insertions(+) create mode 100644 git2.txt create mode 100644 git3.txt[root@git git]# git log --pretty=oneline #查看提交记录,一行对应一次提价记录86c50445d84591741812e0bd9088a1c67bf5e9ec 提交多个版本eecbb4d9ff025681b4abe4ec2bdd90eeb0b66fd6 第一次提交#至此,git库下的所有文件都被提交了,那么,我现在将本地的所有文件都删除,查看下git的状态是什么[root@git git]# rm git* #删除当前目录下所有的测试文件[root@git git]# git status #查看git的状态# 位于分支 master# 尚未暂存以备提交的变更:# (使用 "git add/rm ..." 更新要提交的内容)# (使用 "git checkout -- ..." 丢弃工作区的改动)## 删除: git.txt# 删除: git2.txt# 删除: git3.txt#上述提示了删除了三个文件,下面说的是修改了但是尚未提交修改尚未加入提交(使用 "git add" 和/或 "git commit -a")#那么,我现在若想恢复删除的文件呢?只需进行以下操作:[root@git git]# git reflog --pretty=oneline #查看提交记录86c5044 HEAD@{0}: commit: 提交多个版本eecbb4d HEAD@{1}: commit (initial): 第一次提交[root@git git]# ls #确定当前目录下没有任何测试文件[root@git git]# git reset --hard 86c5044 #版本回滚到指定提交的文职HEAD 现在位于 86c5044 提交多个版本[root@git git]# ls #再次查看,被删除的文件又回来了git2.txt git3.txt git.txt#那么,现在我想要恢复到第一次提交的时候呢?[root@git git]# git reflog --pretty=oneline #同样需要查看其日志记录86c5044 HEAD@{0}: commit: 提交多个版本eecbb4d HEAD@{1}: commit (initial): 第一次提交[root@git git]# git reset --hard HEAD@{1} #对,在版本回滚时,不但可以指定第一列的ID号,也可以指定其HEAD字段HEAD 现在位于 eecbb4d 第一次提交[root@git git]# ls #再次查看当前工作目录下,恢复到了最初只有一个测试文件的状态git.txt[root@git git]# git reset --hard 86c5044 #再次恢复到测试文件最多的时候HEAD 现在位于 86c5044 提交多个版本[root@git git]# lsgit2.txt git3.txt git.txt
四、撤销修改的操作
关于撤销修改,其实在上面已经展示出来如何从版本库中撤销修改了,那么下面将介绍如何从暂存区、工作台进行撤销修改
1、从工作台撤销修改
[root@git git]# cat git.txt #确定当前文件内容aaaabbbb[root@git git]# echo "cccc" >> git.txt #修改文件内容[root@git git]# cat git.txt #查看修改后的文件aaaa bbbbcccc[root@git git]# git checkout -- git.txt #对工作台执行撤销操作[root@git git]# cat git.txt #确认新添加的内容被撤销aaaabbbb
2、从暂存区撤销修改
[root@git git]# echo "abcd" > ljz.txt #创建新的测试文件[root@git git]# git add ljz.txt #添加至暂存区[root@git git]# git status #查看git状态# 位于分支 master # 要提交的变更:# (使用 "git reset HEAD ..." 撤出暂存区)## 新文件: ljz.txt #提示有新添加的文件[root@git git]# git reset HEAD ljz.txt #执行撤销操作[root@git git]# git status #再次查看git的状态,提示提交为空,还提示使用git add建立提交# 位于分支 master# 未跟踪的文件:# (使用 "git add ..." 以包含要提交的内容)## ljz.txt提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
3、从版本库中删除指定版本
[root@git git]# rm git.txt #删除本地文件[root@git git]# git rm git.txt #使用git执行rm命令[root@git git]# git commit -m "删除文件" #提交到版本库,
至此,都只是git版本库的基本操作,那么?我们如何将我们的git
库关联到github上呢?下面是两种情况下的关联方法。
五、将本地git库关联到github
情况一:本地有git库,github库是空的:
1、首先需要先创建一个空的github库。
自行注册github账号并登陆,比较简单,这里就不写了。
在主机上生成秘钥对,并上传至github上:
[root@git git]# ssh-keygen -t rsa -C "916551516@qq.com" #执行此命令后,一路按回车即可,"-C"后面是自己的邮箱地址[root@git git]# cat ~/.ssh/id_rsa.pub #查看生成的公钥,并复制其内容ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5ubfu4/UxpX/1aW3bPLUBihphbC0sUkmM0NusofTEW2rQ6Fy4+tRb2qvDLm6XXXBIzDNcr16qFGE95OFmhGF+M+TjjjvVyMFQu+qLjyfRceiYlLZ6II0ZY5+agQJSYlFYYyvHhJHFo69S07jx5A7Q2doLpW+O0i2MLdY0CyKvlRgE9Onoj+8TM9ZBfJdtoAGQdkH353NeiFJOJi71+KQgvvzpRiRiRjTv4mLGuWdeAAhxG1+rGnyotQktiobHGHKPLpm9w/PT95tuKQ/d8zH4BqsDkWuzIMy5E0vhELpEHFBilx6YuPL2h2N8YSFARxyz4zRPAQoCeATdgA+nD68z 916551516@qq.com
在github上操作如下,以便添加公钥:
输入github账号的密码进行验证:
确定添加成功:
2、
回到新创建的库:
[root@git git]# ls -a #当前的工作目录必须是一个git库. .. .git git2.txt git3.txt git.txt ljz.txt[root@git git]# git remote add origin git@github.com:lvjianzhao/test01.git #执行提示的第一条命令[root@git git]# git push -u origin master #进行提交,由于是第一次上传,所以需要使用"-u"选项#如果执行上述命令后,提示需要输入"yes",输入即可Counting objects: 8, done.Compressing objects: 100% (3/3), done.Writing objects: 100% (8/8), 563 bytes | 0 bytes/s, done.Total 8 (delta 0), reused 0 (delta 0)To git@github.com:lvjianzhao/test01.git * [new branch] master -> master分支 master 设置为跟踪来自 origin 的远程分支 master。#提示已经提交成功了。
至此,F5刷新我们github上刚刚创建的库的页面,就可以看到我们工作台目录下的那些文件了,如下:
六、从github下载到本地git版本库
上述已经演示了如何将本地的git版本库关联到远端的github的空库。
那么这里将展示如何将github已存在的库(库中有内容)下载到本地。
由于在第五步操作时,已经设置好了邮箱及ssh秘钥等操作,所以这里就可以省略这两部操作了,如果没有配置邮箱及ssh秘钥,可参考第五个段落进行配置。
这里就将第五步创建的github库下载到本地。
找到github创建的库,如下:
[root@git /]# git clone git@github.com:lvjianzhao/test01.git #执行命令"git clone",后面的路径就是我们复制的github上的ssh路径正克隆到 'test01'...Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.remote: Enumerating objects: 8, done.remote: Counting objects: 100% (8/8), done.remote: Compressing objects: 100% (3/3), done.remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0接收对象中: 100% (8/8), done.[root@git /]# cd test01/ #克隆成功后,就会在当前目录下生成test01这个库[root@git test01]# ls #并且内容就是我们github上的内容git2.txt git3.txt git.txt[root@git test01]# echo "clone success..." > succed #创建新的测试文件[root@git test01]# ls #如下:git2.txt git3.txt git.txt succed[root@git test01]# git add succed #将新创建的文件添加到暂存区[root@git test01]# git commit -m "clone succes" #提交到版本库[master e62bdba] clone succes 1 file changed, 1 insertion(+) create mode 100644 succed [root@git test01]# git push origin master #将本地文件推送到githubCounting objects: 4, done.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done.Total 3 (delta 1), reused 0 (delta 0)remote: Resolving deltas: 100% (1/1), completed with 1 local object.To git@github.com:lvjianzhao/test01.git 86c5044..e62bdba master -> master[root@git test01]# git remote #查看远端版本库的信息origin
回到github上,刷新库的页面,即可看到新提交的文件,如下:
-------- 本文至此结束,感谢阅读 --------