git使用教程2

3. Git的基本使用

3.1. 创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。由于git是分布式版本管理工具,所以git在不需要联网的情况下也具有完整的版本管理能力。

创建一个版本库非常简单,

1)首先,选择一个合适的地方,创建一个空目录。我在本机的D:\test目录下,创建了一个Hello目录:

git使用教程2

 

2)使用git init命令把这个目录变成Git可以管理的仓库:

git使用教程2 

命令输入后,会提示你,已经创建了一个空的Git仓库。此时你会在hello目录下发现一个隐藏目录.git

git使用教程2

 

 这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

 此处的hello目录就是我们的:工作区,存放所有当前文档。此目录下的文件才会被Git管理

 hello中的.git目录就是我们的:本地仓库,管理并保存所有的文档变化及历史状态。

总结:创建版本库的步骤:

1) 进入需要管理的目录

2) 执行 git init 命令

3.2. 添加文件并提交

 版本控制系统,其目的就是跟踪文本文件的改动,例如我们开发时编写的.java、.xml、.properties本质都是文本文件。文件中每一个字符的变化都会被跟踪并且管理。

1)我们在当前的hello目录下创建一个新的文本文件:readme.txt

git使用教程2

 

编写一段文字(注意,一定不要用windows的记事本):hello git

git使用教程2

 

2)接下来,我们使用 git add 命令,将文件添加到暂存区

 git add 文件名

git使用教程2

 

没有任何的反应,证明没有问题

3)使用 git commit 命令,将暂存区文件提交到本地仓库

 

git使用教程2

如果是第一次安装使用git,提交的时候需要认证用户

git使用教程2

 

命令解释:

 git commit 命令可以将暂存区的文件提交到版本库。

 -m 参数,是本次提交的说明信息,用来注释本次提交做了些说明事情。

总结,将一个文件添加到本地仓库,分两步:

3) 使用 git add  命令,添加文件。可以一次添加多个文件。

4) 使用 git commit 命令,提交,一次即可。

可能大家会有疑问,为什么这里不是直接commit提交,而是要经过add和commit两个步骤呢?

这就关系到Git的版本库中的 工作区 暂存区概念了。

3.3. 工作区/暂存区/版本库

我们先来理解下Git 工作区、暂存区和版本库概念

3.3.1. 工作区:

工作区就是你在电脑里能看到的目录。比如我们刚刚创建的hello目录:

 

git使用教程2

其中包含了一个隐藏目录 .git ,其它就是我们需要被管理的文件。

3.3.2. 版本库及暂存区

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git使用教程2

 

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

3.4. 管理文件修改

 被版本库管理的文件不可避免的要发生修改,此时只需要直接对文件修改即可。修改完毕后需要将文件的修改提交到版本库。

我们对readme.txt文件进行修改,添加一行数据:

git使用教程2

 

3.4.1. 差异比较

用git diff -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:

 

git使用教程2

可以发现,与版本库中的 readme.txt相比,我们多了一行文本!

3.4.2. 查看状态,提交修改

我们如果不确定自己的哪些文件被修改了,可以使用git status 命令,查看当前工作区的状态:

git使用教程2

 

可以清楚的看到:changes not staged for commit(修改没有被缓存,需要使用git add来进行添加操作)

我们使用git add 命令,添加到暂存区,然后再次查看状态:

 

git使用教程2

这次提示: changes to be commited (修改需要被提交),我们使用git commit 进行提交后,再次查看状态:

 

git使用教程2

提示说:工作区很干净,没有任何需要提交,搞定!

3.4.3.版本回退

现在,我们再次修改readme.txt,添加一行内容:

 

git使用教程2

然后提交到版本库:

git使用教程2

 

3.4.3.1.日志查看

我们通过 git log 命令,可以查看历史的每次提交信息:

git使用教程2

 

 可以发现,目前为止,我们已经在本地仓库中提交了3次,也就是说有3个不同版本。其中,最近的这个版本有一个标示:HEAD ,这就是标记当前分支的当前版本所在位置。

本例当中,当前版本即 test version control这次提交,如果没有HEAD->MASTER,加上 --decorate查看,即git log --decorate。

git使用教程2

 

 另外,在log中,每一个版本的前面,都有一长串随即数字:2edf728e6fde09c9d33ce6dd96fd684ed09ebcc ,这是每次提交的commit id ,这是通过SHA1算法得到的值,Git通过这个唯一的id来区分每次提交。

3.4.3.2. 版本回退

现在,假设我们要回到上一级版本,该如何操作呢?

首先,Git通过HEAD来判断当前所在的版本位置。那么上一个版本,就用HEAD^标示,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

如果要从 “test version control” 回退到 “modify readme file” ,我们可以使用 git reset 命令

 

git使用教程2

提示说:HEAD 现在已经被设置到 35CEB36 的版本,即 modify readme file。

我们查看readme.txt:

 

git使用教程2

果然,版本已经回退了,最新添加的数据“test version control”已经没了。

此时再次查看日志,发现只剩下2次提交信息了,第三次提交的信息已经没了:

 

git使用教程2

假如此时我后悔了,还想回到第3次提交的版本,怎么办?

3.4.3.3. 查看所有关联日志

我们可以通过git reflog命令,看到以前的每次执行动作:

 

git使用教程2

其中红框内的部分,就是我们第三次提交的日志信息。前面的e498642 就是第三次提交的 commit id 的前几位数字。

我们可以通过指定commit id 的方式,来指定HEAD的位置:

指令:git reset --hard {commit id}

 

git使用教程2

查看日志:

 

git使用教程2

查看文件:

 

git使用教程2

 数据又回来了!

3.4.3.4. 总结

如果要进行版本回退或前进,一般分两步:

1) 通过git loggit reflog 查看操作日志,查找版本的commit id

2) 通过 git reset --hard  设置HEAD到指定版本

其实版本的回退,仅仅是修改HEAD指针的位置而已,因此Git进行版本的切换,比svn要快的多!

3.4.4.撤销修改

3.4.4.1.撤销工作区修改

现在我们在readme.txt中添加一行数据:

 

git使用教程2

在你提交前,你突然发现这个修改是有问题的,你打算恢复到原来的样子。怎么办?

如果修改的并不多,我们完全可以手动恢复到原始状态。但是如果改动比较大,手动处理就很容易有遗漏,而且很麻烦。怎么办?

查看状态:

 

git使用教程2

Git提示我们,现在文件已经修改,等待被staged(暂存)。我们有两个选择:

1) 可以使用git add 来添加到暂存区,接着去提交文件

2) 可以使git checkout --  来撤销修改

所以,这里我们选择第二种方案后,再次查看状态:

 

git使用教程2

工作区是干净的!修改已经被撤销了!

查看文件:

git使用教程2

 

3.4.4.2.撤销staged修改

刚才的案例中,我们修改了数据,并没有add带暂存区,处理起来还算简单。如果我们已经吧数据add 到了暂存区,又该如何处理呢?

 我们首先添加一行数据到readme.txt

 

git使用教程2

并且添加到staged(暂存区),然后查看状态

 

git使用教程2

 有一个修改等待被提交,并且有一行提示:

 

git使用教程2

可以使用 git reset HEAD  来撤销缓存修改。

我们前面说过,git reset 命令可以进行版本回退,此处reset 指定的是HEAD ,而不是其他版本,因此就有撤销缓存修改的作用:

 

git使用教程2

查看状态:

 

git使用教程2

 发现文件的修改被撤回到了工作区,尚未添加到staged(暂存区),我们再次执行git checkout --  即可撤销工作区修改

 

git使用教程2

工作区干净了!

查看文件:

 

git使用教程2

文件也恢复了原来的状态,整个世界都清净了!

3.4.4.3.总结

撤销修改分两种情况:

1) 撤销工作区修改,使用git checkout --

2) 撤销暂存区修改,分两步:

a) 使用git reset HEAD 来撤销暂存区修改。

b) 使用git checkout -- 来撤销工作区修改

4. 远程仓库

 到目前为止,我们已经学会了如何在本机利用git进行文件版本管理,但是如果要想进行多人协作,我们就必须使用远程仓库。将本地仓库的数据同步到远程仓库,实现多人协作开发。

 目前比较热门的代码托管社区:GitHub,网址:https://gtihub.com ,提供了免费的远程git仓库功能。不过网速不是特别流畅。 在国内,有很多的公司使用oschina提供的git服务:码云, https://gitee.com ,当然,我们也可以自己来搭建远程仓库。目前学校服务器中搭建了一个git私服,其地址为:http://192.168.50.33:10080

4.1. 访问远程仓库

4.1.1. 注册并登录

访问:http://192.168.50.33:10080

git使用教程2

 

大家自己注册并登录:

git使用教程2

 

 

4.1.2. 创建新的仓库

在页面左侧,选择创建新的仓库

 

git使用教程2

填写仓库信息:

git使用教程2

 

仓库创建完毕,可以看到,如果我们要与远程仓库同步,这里支持两种不同的通信协议,sshhttp。当我们选中一种协议后,后面会出现对应的远程仓库地址

git使用教程2

 

具体用那种协议要看企业团队,一般用HTTP协议的比较多,因为简单。

如果处于安全一般会使用ssh协议。但是要使用SSH协议进行同步,你就必须生成SSH**,并添加到当前仓库的许可列表中!接下来了解下SSH协议。作为开发人员我们不需关注这个协议,重点是使用git工具进行代码的远程操作。

4.1.3. SSH协议

4.1.3.1. 什么是ssh

 SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,相对于HTTP协议更安全。

 使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。

 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

 最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

4.1.3.2. 创建SSH**

Git-bash中已经集成了ssh功能,所以我们只需要简单的命令,即可生成**:ssh-****** -t rsa

一路回车向下走,不要输入任何内容即可!

git使用教程2

 

执行命令完成后,在window本地用户.ssh目录C:\Users\用户名.ssh下面生成如下名称的公钥和私钥:

git使用教程2

 

4.1.3.3. 添加SSH**到git私服

选择用户,个人设置:

 

git使用教程2

点击SSH**设置,并添加**:

git使用教程2

 

**的内容,就是刚刚生成的两个**中的公钥:id_rsa.pub,用文本编辑工具(EditPlus)打开,并且复制内容即可。

 

git使用教程2

 将这段公钥添加到用户,这就说明,这台公钥的机器具备了访问这个git账号中的远程仓库的权限!因此一定要慎重添加。不能随意让别人操作你的仓库!!

4.1.4. 推送远程仓库

通过控制面板,回到仓库页面,发现下面有一段帮助信息:

 

git使用教程2

关联远程仓库:

git remote add origin ssh://[email protected]:10022/fangqyou/hello-git.git

推送本地仓库到远程仓库的master分支:

git push -u origin master

 需要注意的是:git remote add origin 后面紧跟的,其实是上面的仓库地址信息

 执行命令,发现有提示信息:

git使用教程2

 

第一次推送,会有提示信息,我们输入yes:

git使用教程2

 

推送成功!此时登录远程仓库,刷新页面,可以看到数据已经推送,并且与本地仓库完全一致:

git使用教程2

 

从现在起,只要本地作了提交,就可以通过命令:

git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

4.1.5. 克隆远程仓库

 现在,假设一个新的成员要加入我们的开发队伍,那他首先要做的第一件事情,一定是从远程仓库获取所有代码。此时就可以使用克隆动作。

克隆远程仓库:就是从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库。

我们随意找到一个目录D:\test\world:

git使用教程2

 

打开控制台,输入命令:git clone 远程仓库地址

远程仓库地址可以在仓库页看到:

 

git使用教程2

输入命令:

git使用教程2

 

查看目录:

 

git使用教程2

内容:

 

git使用教程2

查看状态:

 

git使用教程2

OK,你已经与远程仓库完全一致了,开始你的工作吧!

4.1.6. 拉取远程仓库数据

 现在如果有人也向远程仓库推送了代码,那么当我们就需要拉取 远程仓库的最新代码到本地:

我们可以先手动修改远程仓库数据,模拟他人的提交:

git使用教程2

 

在本地拉取最新代码,使用git pull 命令

 

git使用教程2

查看readme文件:

 

git使用教程2

内容已经与远端保持一致。

4.2. 总结

注意:

1) 如果要使用SSH协议与远程仓库同步,就必须先在本地生成公钥和私钥,然后将公钥添加到远程的SSH列表

2) 如果已经有本地仓库,并且想要与远程仓库关联,一般需要两步:

a) 通过git remote add origin + 远程仓库地址 进行关联

b) 通过git push -u origin master推送本地仓库修改到远程仓库

3) 如果没有本地仓库,先创建远程仓库,然后通过git clone + 远程仓库地址 进行克隆并创建本地仓库