Git 30分钟简明教程

2018-10-08 10:46:43 浏览数 (1)

Git简介

Git是什么?

分布式版本控制系统。

Git的诞生

参考链接

1991年,Linus创建了开源的Linux,世界各地的志愿者为Linux编写代码,但是绝大多数的内核维护工作,都花费在提交补丁和保存档案的繁琐事务上。这期间所有的源代码,都由Linus手工合并。Linus坚定反对CVS和SVN,因为这些集中式的版本控制系统,不仅速度慢,而且必须联网才能使用。

不过,到了2002年,Linux系统已经发展十年了,代码库之大让Linus很难继续通过手工方式管理了。BitMover公司出于人道主义精神,授权Linux社区免费使用商业版本的分布式版本控制系统BitKeeper来管理和维护代码。安定团结的大好局面在2005年被打破,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,原因是Linux社区牛人聚集,开发Samba的Andrew试图破解BitKeeper的协议,这么干的其实也不只他一个,但是被BitMover公司发现了,于是BitMover公司收回了Linux社区的免费使用权。这就迫使Linux开源社区(特别是Linux的缔造者Linus Torvalds)不得不吸取教训,开发一套属于自己的版本控制系统。

Git的目标

  • 速度
  • 简单的设计
  • 对非线性开发模式的强力支持(允许上千个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)

Git和GitHub

2008年,GitHub网站上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

版本控制系统

主要分为两种:

  1. 集中式:CVS和SVN
  2. 分布式:Git

集中式的版本控制系统(SVN)

版本库是集中存放在中央服务器的,大家工作要先从中央服务器取得最新的版本,工作完成后把自己的修订推送到中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取得最新的文件或者提交更新。

Computer A和Computer B之间无法直接通信,只能通过中央服务器间接通信。

SVN

分布式的版本控制系统(Git)

根本没有“中央服务器”,每个人的电脑都是一个完整的版本库。这样你工作的时候,根本不需要联网,因为版本库就在你自己的电脑上。

那么多人如何协作?如果你在自己电脑上修改了A文件,你的同事在他的电脑上修改了B文件。你们俩之间只需要把各自的修改推送给对方就可以啦~

分布式比集中式的安全性高很多,因为每个人电脑里都有完整的版本库,一个人的电脑坏掉了不要紧,从其他人那里复制一个就可以了。分布式版本控制系统,也有一台充当“中央服务器”的电脑,但是这个服务器的作用,仅仅是用来方便“交换”大家的修改。

Computer A和Computer B之间,也是可以相互通信的。

Git

许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

Git配置

Git初始化

全局配置

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置:

代码语言:javascript复制
$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"

执行了上面的操作,会在家目录下建立一个.gitconfig的隐藏文件,可使用cat ~/.gitconfig命令查看:

代码语言:javascript复制
$ cat ~/.gitconfig
[user]
        email = schacon@gmail.com
        name = Scott Chacon

当前项目配置

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你当前的项目目录下创建.git/config,从而使用针对当前项目的配置。

GitHub新建仓库

GitHub新建repository

Clone一个仓库

代码语言:javascript复制
git clone https://github.com/LjyYano/test.git

这个命令是克隆出一个完整的版本库,而不是简单地拷贝文件,这和SVN不一样~版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。可以查看到目录中有.git的隐藏文件夹。

Git的工作流程

使用版本控制系统,无非就是以下几件事:

  1. 从服务器拉取文件
  2. 修改文件
  3. 提交文件
  4. 创建、合并分支

git的基本流程如下:

  1. 创建或修改文件
  2. 使用git add命令添加新创建或修改的文件到本地的缓存区
  3. 使用git commit命令提交到本地代码库
  4. 使用git push命令将本地代码库同步到远端代码库

文件有两种状态:

  1. tracked
  2. untracked

添加到本地的缓存区

新建一个文件git.txt,使用git status命令查看仓库状态。我们发现git.txt处于未跟踪状态:

上面的截图上已经提示了,使用git add添加可以commit的文件。

提交到本地仓库

需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本。

代码语言:javascript复制
git commit -m 'first'

同步到远程仓库

因为我们是从远程仓库clone的代码,所以使用

代码语言:javascript复制
git remote

发现已经有一个origin了,直接push即可

代码语言:javascript复制
git push

刷新GitHub页面,发现已经有了本地的修改(添加了git.txt文件)~

分支与合并

分支的作用体现在多人协作中,分支不影响主线(master分支)的开发。比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

下面以分支名exp为例:

查看分支

代码语言:javascript复制
git branch

创建分支

代码语言:javascript复制
git branch exp

切换分支

查看到当前还在master分支,如何切换到exp分支?

代码语言:javascript复制
git checkout exp

提交分支

exp分支和master分支中的文件是隔离的,修改exp分支下的文件,并不会影响到master分支的文件。注:push前也需要add、commit等操作~

代码语言:javascript复制
git push origin exp

合并分支

分别修改了master分支和exp分支的git.txt文件,如下图:

合并exp分支 → master分支

代码语言:javascript复制
git checkout master
git merge -m 'merge from exp' exp

撤销合并

代码语言:javascript复制
git reset --hard HEAD^

只能删除那些已经被当前分支的合并的分支, 如果你要强制删除某个分支的话就用git branch –D

删除分支

代码语言:javascript复制
git branch –d exp

SSH传输

我们会发现有GitHub有两种Clone方式:SSH 和 HTTPS。

SSH简介

SSH - 百度百科

SSH 为 Secure Shell的缩写,可以有效防止远程管理过程中的信息泄露问题。

验证

从客户端来看,SSH提供两种级别的安全验证:

  1. 基于口令的安全验证
  2. 基于密钥的安全认证

第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证)

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。

为什么使用SSH?

传统的网络服务程序,有以下漏洞:

  1. 明文传送口令和数据
  2. 易受到“中间人”攻击

明文传送口令和数据

传统的网络服务程序如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。

“中间人”攻击

容易受到“中间人”攻击,即:

代码语言:javascript复制
你的数据  ↔  ️中间人 ↔️ 服务器

使用SSH

创建 SSH Key

在用户的主目录下,查看是否有.ssh的隐藏目录,查看里面是否有id_rsaid_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:

代码语言:javascript复制
ssh-keygen  -t rsa –C “youremail@example.com”

id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

GitHub 添加 SSH Key

将本地生成的id_rsa.pub公钥内容,添加到GitHub上,以后就可以使用SSH来连接GitHub了~

Git 命令总结

  • git config:配置相关信息
  • git clone:复制仓库
  • git init:初始化仓库
  • git add:添加更新内容到索引中
  • git diff:比较内容
  • git status:获取当前项目状况
  • git commit:提交
  • git branch:分支相关
  • git checkout:切换分支
  • git merge:合并分支
  • git reset:恢复版本
  • git log:查看日志

参考链接

  1. Git使用教程
  2. SSH - 百度百科

0 人点赞