Git使用教程

1、为什么要使用Git?
Git是目前世界上最先进的分布式版本控制系统,那么什么是版本控制系统呢?
比如:在使用Word时,你一定遇到这样的情况:
想删除一个段落,又怕将来要用到想恢复却找不回来,怎么办呢,我们通常会先把当前文件“复制”一个新的Word文档,并重命名为“财务审计修改.docx”,再接着改,改到一定程度,再“复制”为另一个新文档,再重新命名,最后Word文档就变成了这样:
    
过了一周,你想要找回删除的文字,但又记不清楚在哪个文档里边了,还要一个一个的找,很麻烦。
更要命的是,有些部分需要你的队友帮助填写,于是你把文件Copy到U盘给他,然后,你继续修改文档,一天后,队友再把Word文档传给你,此时,你必须想想,发给他之后到你收到他的文件期间,你做了哪些修改,得把你的改动和他的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去,如果想查看某次改动,只需要看一下记录就可以,会很方便。
这样,使用起来就应该像这个样子,能记录每次文件的改动:
2、与其他版本控制系统的优势?
当前最火的版本控制工具还有CVS和SVN等,那么为什么不使用这些版本控制工具呢?
  • 并发修改
多个开发人员同时对同一个文件进行修改。
git,svn,cvs都支持。原来曾有个rcs的版本控制系统就不支持并发修改, 如果有人正在修改某一个文件,那么这个文件就会被锁定,直到修改完毕,下一个开发人员才能对该文件进行修改,而cvs是从rcs发展过来的,并做出了改进。
  • 并发提交
版本控制中的版本记录是通过开发人员的提交操作来触发的,也就是说,要进行提交操作,才会记录版本号。
如果修改了多个文件后提交,cvs会一个一个的提交,每个文件被修改后,都会记录一个不同的版本号。而svn和git可以同时提交多个文件的修改,并且这多个文件记录的是同一个版本号。
cvs每个文件都会记录版本号,其占用的磁盘空间会比较大,但是如果出现bug的时候,cvs定位bug的时候只需要定位到某个版本号,就可以直接定位到某个文件,其找bug的速度是非常快的。svn和git就得从批量提交的多个文件中一个一个查找。
  • 历史轨迹
如果一个文件的名称被修改了,cvs就无法追踪到修改文件名之前的历史版本。而svn和git即使文件名被修改了,他们依然可以追踪到这个文件的所有历史版本。
  • 分布式
是否需要一台专门的服务器来运行这个版本控制。
cvs和svn是一个集中式的版本控制器,他们需要一台专门的版本控制服务器。而git是分布式的,他不要一台专门的服务器来运行这个版本控制。每个开发人员的电脑组成的网络就可以运行git,特别适合源代码的发布和交流,因此大部分开源项目都用git。
另外, CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
3、安装Git
在Windows上使用Git,可以从Git官网直接 下载安装程序 ,然后按默认选项安装即可。以下教程以Wondows环境为例:
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意 git config 命令的 --global 参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指 定不同的用户名和Email地址。
4、创建版本库
什么是版本库呢?版本库又名仓库,英文名 repository ,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
首先,选择一个地方,创建一个空目录(为了避免不必要的错误,文件名最好不包含中文)
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),可以发现当前目录下多了一个 .git 的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
5、把文件添加到版本库
把一个文件添加到版本库需要两步:
第一步:用命令 git add 告诉Git,把文件添加到仓库:
$ git add readme.txt
执行上面的命令,没有任何显示,这就对了,说明添加成功。
第二步,用命令 git commit 告诉Git,把文件提交到仓库:
$ git commit -m "add a readme file" [master (root- commit ) cb926e7] wrote a readme file 1 file changed, 1 insertions(+) create mode 100644 readme.txt
git commit 命令, -m 后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit 命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了一行内容(readme.txt有一行内容)。
为什么Git添加文件需要 add commit 一共两步呢?因为 commit 可以一次提交很多文件,所以你可以多次 add 不同的文件,比如:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
小结:
初始化一个Git仓库,使用 git init 命令。
添加文件到Git仓库,分两步:
  • 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  • 第二步,使用命令git commit,完成。
6、时光机穿梭——版本回退
版本控制系统可以告诉我们历史记录,用 git log 命令查看:
可以看到,我们对readme.txt文件进行了两次修改
git log 命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是 添加第二行记录 ,上一次是 add a readme file 。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:
        友情提示,你看到的一大串类似 88cc6db30e18f77.... 的是 commit id (版本号),和SVN不一样,Git的 commit id 不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的 commit id 和我的肯定不一样,以你自己的为准。为什么 commit id 需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

        好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“ add a readme file ”的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用 HEAD 表示当前版本,也就是最新的提交 88cc6db30e18f77... (注意我的提交ID和你的肯定不一样),上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100
现在,我们要把当前版本“ 添加第二行记录 ”回退到上一个版本“ add a readme file ”,就可以使用 git reset 命令:
--hard 参数有啥意义?这个后面再讲,现在你先放心使用。
看看readme.txt的内容是不是版本 add a readme file
我们用 git log 再看看现在版本库的状态:
        这时,最新的“ 添加第二行记录 ”记录的版本已经看不到了,如果想要回到这个版本,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个 添加第二行记录 commit id 88cc6db30e18f77... ,于是就可以指定回到未来的某个版本:
        Git的版本回退速度非常快,因为Git在内部有个指向当前版本的 HEAD 指针,当你回退版本的时候,Git仅仅是把HEAD从指向 添加第二行记录 :改为指向 add a readme file
        如果想要回退到上一次修改的版本,但是上面的命令行窗口关掉了,怎么办呢?可以使用 git reflog 来查看你的每一次命令,这样通过commit id就又可以回到指定的版本了。
总结:
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

7、工作区与缓存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的 learngit 文件夹就是一个工作区:
版本库(Repository)
工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用 git add 把文件添加进去, 实际上就是把文件修改添加到暂存区
第二步是用 git commit 提交更改, 实际上就是把暂存区的所有内容提交到当前分支
因为我们创建Git版本库时,Git自动为我们创建了唯一一个 master 分支,所以,现在, git commit 就是往 master 分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
现在,如果修改了readme.txt文件,再添加一个LICENSE文件,那么暂存区就变成了这样:
所以, git add 命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到分支。
一旦提交后,暂存区就变成了这样:
8、管理修改
由于Git跟踪并管理的是修改,而非文件,所以,每次修改,如果不添加到暂存区,那就不会加入到commit中。
9、撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
10、远程仓库
GitHub ,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
添加远程库
  • 先有本地库,再有远程库,实现关联
在github上注册完账号之后,新建一个远程库,如下,输入“learngit”,点击“Create repository”,即可创建一个远程库

目前,在GitHub上的这个 learngit 仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的 learngit 仓库下运行命令:
添加后,远程库的名字就是 origin ,这是Git默认的叫法,也可以改成别的,但是 origin 这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
把本地库的内容推送到远程,用 git push 命令,实际上是把当前分支 master 推送到远程。
由于远程库是空的,我们第一次推送 master 分支时,加上了 -u 参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。
执行: git push -u origin master
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在起,只要本地作了提交,就可以通过命令: git push origin master
小结:
要关联一个远程库,使用命令 git remote add origin https://github.com/DuFanFan1/learngit.git
关联后,使用命令 git push -u origin master 第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;
  • 从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone 命令克隆。
Git支持多种协议,包括 https ,但通过 ssh 支持的原生 git 协议速度最快。

还在学习中,后续会一直更新哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值