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等等。
版本控制系统
主要分为两种:
- 集中式:CVS和SVN
- 分布式: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
命令查看:
$ 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的工作流程
使用版本控制系统,无非就是以下几件事:
- 从服务器拉取文件
- 修改文件
- 提交文件
- 创建、合并分支
git的基本流程如下:
- 创建或修改文件
- 使用
git add
命令添加新创建或修改的文件到本地的缓存区 - 使用
git commit
命令提交到本地代码库 - 使用
git push
命令将本地代码库同步到远端代码库
文件有两种状态:
- tracked
- 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等操作~
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提供两种级别的安全验证:
- 基于
口令
的安全验证 - 基于
密钥
的安全认证
第一种级别(基于口令的安全验证)
只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
第二种级别(基于密匙的安全验证)
需要依靠密匙,也就是你必须为自己创建一对密匙
,并把公用密匙
放在需要访问的服务器
上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”
(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密
再把它发送给服务器。
用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。
第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。
为什么使用SSH?
传统的网络服务程序,有以下漏洞:
- 明文传送口令和数据
- 易受到“中间人”攻击
明文传送口令和数据
传统的网络服务程序如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文
传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。
“中间人”攻击
容易受到“中间人”攻击,即:
代码语言:javascript复制你的数据 ↔ ️中间人 ↔️ 服务器
使用SSH
创建 SSH Key
在用户的主目录下,查看是否有.ssh
的隐藏目录,查看里面是否有id_rsa
和id_rsa.pub
这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:
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:查看日志
参考链接
- Git使用教程
- SSH - 百度百科