Git概述
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git概述相关的知识,希望对你有一定的参考价值。
文章目录
一、Git版本控制器概述
(1)什么是版本控制器
- 版本控制器就是用来存放代码的
- 版本控制器的种类:
SVN:集中式的版本控制器,也就是所有的代码都存放在一台服务器上,写代码之前都需要上传或下载
GIT:分布式的版本控制器
(2)Git简介
- Git是目前世界上最先进的分布式版本控制系统,没有之一
- Git是一个开源的分布式版本控制系统,用以有效、高速的处理从小到大的项目版本管理
- Git是Linus Torvalds为了帮助管理linux内核开发而开发的一个开源的版本控制软件
(3)扩展——Git的诞生
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,php,Ruby等等。
(4)Git的作用
我们用word写文档会遇到一下问题:
1.想删除一个段落,又怕将来想恢复找不回,然后把文件另存为,最后在windwos下生成好多的文档。
- 过段时间想找回被删除的文字,已经不知道删除前保存在哪个文件
- 想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删
- 有些文档需要别人帮助填写,你传给同事以后,你又更新了文档,然后同事填完文件又传给了你,怎么去合并文档。
而使用git以后就可以解决上面遇到的所有问题。它可以统一进行版本控制,自动记录每次文件的改动,进行代码合并,不需要把文件传来传去,如果想查看某次改动,只需要在软件里瞄一眼就可以
(5)集中式和分布式的区别
- 集中式:
CVS和SVN都是集中式的版本控制系统
集中式版本控制系统,版本库是集中存放在中央服务器的,但是因为工作使用的是自己的电脑,所以在工作之前需要从中央服务器获取最新的代码,并且在工作完成后需要再上传到中央服务器
集中式版本控制器的最大缺点就是需要联网才能工作,如果是局域网还行,带宽大,速度够大,可是如果在互联网上,遇到网速慢的话传一个10M的文件可能都需要五分钟,工作效率太慢,尤其是都是下班的时候才会上传代码,在下班点上传的请求更多,导致上传速度更慢
- 分布式:
分布式版本控制器是没有“中央服务器”的,每个人的电脑上都是一个完整的版本库,这样在工作时就不需要联网了,因为版本库就在自己的电脑上,在多人协作时,只需要把各自的修改推送给对方,就可以互相看到对方的修改了
和集中式版本控制器相比,分布式版本控制器的安全性显然是比较好的,因为每个人的电脑都有完整的版本库,当一台电脑损坏不要紧只需要从别人电脑在复制一份就行,但是集中式的版本控制器一旦损坏,代码就会丢失
在实际使用分布式版本控制器时,很少在两人之间互相推送版本库,因为可能两个人不在一个局域网内,所以分布式版本控制器也有一个“中央服务器”,但是这个中央服务器仅仅是用来方便交换大家的修改,并不像集中式版本控制器那样中央服务器一坏数据就丢失
(6)Git的工作原理
对于任何一个文件,Git对其都有四种状态,分别是:工作目录、暂存区、本地仓库、远程仓库
一个文件刚刚创建时,是工作目录的状态,当在里面写好代码之后,这个文件会到暂存区,在暂存区的文件是可以取消提交的,之后文件就会到本地仓库,本地仓库的文件可以上传到远程仓库,方便和其他人共享
(7)Git的优点
更顺畅的工作流程,开发过程中,完全可以离线操作
快速,Git分布式架构使得本地仓库包含所有的历史版本信息,你可以在不同的版本之间快速切换
弹性的本地分支,在svn下,你建一个分支需要把源代码复制到另外一个文件夹,而在Git下,创建分支的代价是非常小的,只需一条命令
仓库目录结构简洁,用Git复制一个项目,只会在项目根目录创建一个.git的目录,而其他目录很干净
内容按元数据方式存储,所有的版本信息都位于.git目录下
完整性好,更易于协作开发
用户群大,现在已经有成千上万个开源项目采用Git来做项目管理,github上更是有无数个代码仓库
(8)分支讲解
我们在公司里面一般使用master作为主分支,开发人员使用开发分支,当开发人员开发完代码以后,会合并到master主分支,进行上线部署服务,我们还可以使用测试分支,当开发人员写完代码以后,可以合并到测试分支,进行测试,测试成功以后,合并到master分支进行生产环境部署,当然为了安全部署,防止线上代码BUG,我们可以创建回滚分支,当我们部署的新版本的软件出现问题,可以马上使用回滚分支进行回滚到上一个稳定版。
#常用命令
查看所有分支 git branch
分支创建 git branch bb #bb为分支名称
分支切换 git checkout bb
创建加切换分支 git checkout -b bb
删除本地分支 git branch -d dgf
删除远程分支 git push origin --delete dgf
二、部署Git
(1)实验环境
主机名 | ip | 角色 | 软件 | 系统 |
---|---|---|---|---|
git | 192.168.100.202 | server | git | centos7.4 |
client | 192.168.100.203 | client | git | centos7.4 |
(2)实验步骤
在两台主机上都安装git,需要ssh的支持,某些版本服务器需要安装git-core才是服务器
******(1)git主机步骤
[root@Centos7 ~]# hostnamectl set-hostname git
[root@Centos7 ~]# su
[root@git ~]# yum -y install git #默认就有,没有的话就使用yum安装
******(2)client主机步骤
[root@Centos7 ~]# hostnamectl set-hostname client
[root@Centos7 ~]# su
[root@client ~]# yum -y install git
(3)使用git
-服务端创建空仓库
******(1)创建git用户,这里使用root用户也是可以的
[root@git ~]# useradd git
[root@git ~]# echo git:123123 | chpasswd
[root@git ~]# su git
******(2)创建仓库
[git@git ~]$ mkdir project #要先cd到自己的家目录进行创建,仓库名称叫做project
[git@git ~]$ ls
project
[git@git ~]$ cd project/
[git@git project]$ git init --bare #必须执行完这个命令初始化版本仓库后,project才可以称得上是git的仓库
初始化空的 Git 版本库于 /home/git/project/
-linux客户端进行测试
******(1)这个不需要创建其他用户,直接使用root用户即可,创建工作目录
[root@client ~]# mkdir git
[root@client ~]# cd git/
******(2)拉取库到本地
[root@client git]# git clone git@192.168.100.202:/home/git/project #复制202的库到本地
正克隆到 'project'...
The authenticity of host '192.168.100.202 (192.168.100.202)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.202' (ECDSA) to the list of known hosts.
git@192.168.100.202's password: #输入git用户密码
warning: 您似乎克隆了一个空版本库。
[root@client git]# ll #查看是否成功拉取了中央服务器的库
总用量 0
drwxr-xr-x 3 root root 18 6月 25 22:58 project
******(3)往本地的仓库添加新文件
[root@client git]# cd project/
[root@client project]# touch aaa.txt
[root@client project]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月 25 23:00 aaa.txt
******(4)添加到暂存区
[root@client project]# git add . #把当前目录的文件添加到暂存区
[root@client project]# git status #查看暂存区的文件状态
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: aaa.txt #这个就是刚刚放到仓库的新文件
#
******(5)提交到本地仓库
[root@client project]# git commit -m "aaa" #-m后面加备注信息
*** Please tell me who you are.
Run
git config --global user.email "you@example.com" #发现报错,需要登录邮箱,指定name,输入这两条命令,随便写就行
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@client.(none)')
[root@client project]# git config --global user.email "aaa@qq.com"
[root@client project]# git config --global user.name "aaa"
[root@client project]# git commit -m "aaa" #重新提交到本地仓库
[master(根提交) 47fcee0] aaa
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 aaa.txt
[root@client project]# git remote add origin git@192.168.100.202:/home/git/project.git #确认本地仓库和远程仓库的状态正常,也就是监测origin项目是否存在,默认在初始化仓库后就会生成一个origin项目
fatal: 远程 origin 已经存在。
******(6)将本地仓库代码推送到远程仓库
[root@client project]# git push origin master #推送到远程仓库
git@192.168.100.202's password: #输入git中央服务器的密码
Counting objects: 3, done.
Writing objects: 100% (3/3), 189 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.202:/home/git/project
* [new branch] master -> master
******(7)将本地仓库删除,重新同步远程仓库
[root@client project]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月 25 23:00 aaa.txt
[root@client project]# cd ..
[root@client git]# rm -rf *
[root@client git]# ll
总用量 0
[root@client git]# git clone git@192.168.100.202:/home/git/project #重新拉取库到本地
正克隆到 'project'...
git@192.168.100.202's password:
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
[root@client git]# ll
总用量 0
drwxr-xr-x 3 root root 33 6月 25 23:25 project
[root@client git]# cd project/
[root@client project]# ll #成功复制
总用量 0
-rw-r--r-- 1 root root 0 6月 25 23:25 aaa.txt
-Windows使用方法
-
Windows使用的是TortoiseGit软件,也叫乌龟
-
TortoiseGit是一个开放的git版本控制系统的源客户端,支持windows xp、vista、7的软件版本,该软件功能和git是相同的
-
TortoiseGit是界面化操作,而git是命令行操作,默认安装好是英文语言,可以使用中文的语言包
-
TortoiseGit只是一个程序外壳,想要使用必须依赖一个Git Core,所以必须安装windows的git,下载地址为: https://gitforwindows.org/
-
TortoiseGit的官网:https://tortoisegit.org/download/,官网下载慢的话,可以去360软件管家下载
到windows安装git
先安装git,最好切换到Administered登录
安装好之后,在桌面点击右键就会出现git的选项,如果没有需要重启系统
复制远程库(项目),点击GUI图形化方式
URL:git@192.168.100.202:/home/git/project
选择本地仓库时会自动创建目录
注意:git密码需要输入三次
选择项目分支
添加个性化交互信息
点击删除,删除本地仓库,然后复制远程仓库,按照上面的步骤进行复制远程仓库
-使用TortoiseGit
安装TortoiseGit,默认安装就可以满足所有要求,并且之前已经安装和设置过Windows的git,所以安装时全部选择默认的即可
TortoiseGit的汉化包同样全部下一步
添加到暂存区
点击推送,推送到远程仓库
-使用Github
-
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。
-
GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、python 等。
-
GIT服务器并不需要我们搭建,我们使用github就可以满足我们的需求
-
官网: https://github.com/
#生成密钥
[root@git ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:it268x6RVv9esC4hxQ8XHtcl1AmauD9CG4ZASn1YuBY root@git
The key's randomart image is:
+---[RSA 2048]----+
| ...+. o+.=|
| . oE . . o oo+|
| . .+ ..+ . + |
| o. .o..+ o |
| . .S= ..+. |
| o +o.= ...o |
| . o oo + .o .|
| .. .. oo . |
| o=o .o |
+----[SHA256]-----+
[root@git ~]# cat .ssh/id_rsa.pub #查看密钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC54DY7BCQ04clFqFwSToMFUf1fU2w7FVuzVkqg8rUSGmjohh2Dy6ViPI0q1A23FW0KExGw+3kSDgz5wEsU5wjfqrrNySXI2xEcsTZZqYZv2hIlMavfXD74pqiHy1g2fjSLfnsneN3a1aPyETbq0wYSjz4nHzIFFrflDnKb1n0JsfHqUstgp3AHRgOG2hI75LbTWO3I9lLz+3rC5i6YEMFYPBPhVneLiboKA3E3cFWhcr/yjeVi3XcdWW3Q7MjI/3/txNwWIYBMIdZKkHuFHs1g4OhKmadEy60yPOicoL0MSMyiLRmD9C25weM7limmAN93BsbhIa24Hiq+DOxGGzoT root@git
点击设置
成功添加
-测试在git机器上登录
[root@git ~]# ssh -T git@github.com
The authenticity of host 'github.com (13.229.188.59)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.229.188.59' (RSA) to the list of known hosts.
Hi renzeyuan! You've successfully authenticated, but GitHub does not provide shell access.
-新建存储库
创建存储库以后,GitHub会提示我们相关仓库操作,一种是我们本地没有仓库,需要先创建再推送,另一种就是我们本地已经有了仓库,直接推送上去就行了
-客户端工作流程
[root@git ~]# mkdir git-test
[root@git ~]# cd git-test/
[root@git git-test]# echo "aaa" > abc.txt
[root@git git-test]# git init
初始化空的 Git 版本库于 /root/git-test/.git/
[root@git git-test]# git add abc.txt
[root@git git-test]# git commit -m "abc"
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@git.(none)')
[root@git git-test]# git config --global user.name "renzeyuan"
[root@git git-test]# git config --global user.email "1248873545@qq.com"
[root@git git-test]# git commit -m "abc"
[master(根提交) de847c9] abc
1 file changed, 1 insertion(+)
create mode 100644 abc.txt
[root@git git-test]# git remote add origin https://github.com/renzeyuan/test.git #把本地仓库和远程仓库连接
[root@git git-test]# git push -u origin master
Username for 'https://github.com': renzeyuan #输入账户
Password for 'https://renzeyuan@github.com': #输入密码
Counting objects: 3, done.
Writing objects: 100% (3/3), 208 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/renzeyuan/test.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。 #显示成功
以上是关于Git概述的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段