文章目录
Linux云计算架构-GIT分布式版本控制系统的原理介绍及部署使用【含github的使用】
1. git服务介绍
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目。
git工作原理:在git中绝大多数操作只需要访问本地文件和资源。在git中,文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
已修改:表示对文件进行了修改,但是没有保存到暂存区域。
已暂存:表示文件已修改,并放到了下次提交时要保存的清单中。
已提交:表示文件已提交,保存到本地数据库中。
文件流转的工作区域:
①git工作区:在本地上的git工作区,clone远程git服务器上的git资源。
②暂存区:stage或index,已修改内容的存放区,一般指.git目录下的index文件,也可以称之为索引。
③版本库:当暂存区的已修改内容被提交,会永久保存到本地版本库的某一分支上。一般指git工作目录下的隐藏目录.git
基本的git工作流程:
①从git服务器上的git资源上clone一个git资源作为工作目录。
②对git工作目录中的文件进行修改。如果其他人也修改了git工作目录,并推送到了git资源库。可以更新自己git工作目录。
③对修改的文件进行快照, 并保存到暂存区域
④提交更新,把保存在暂存区域的文件快照永久转储到git工作目录中。
⑤如果在暂存区域中的内容错误,可以修改再次提交到本地git工作目录。
git优点:
①工作流程流畅,开发过程中,可以离线操作。
②git分布式架构使得本地仓库包含所有的历史版本信息,可以快速的在不同版本之间切换。
③可以快速的创建本地分支
④本地仓库目录结构简单,用git复制项目仅会创建一个.git目录。
⑤内容按元数据方式存储,所有的版本信息都存放在.git目录下。
⑥完整性好,易于协作开发。
⑦用户群大,采用git做项目管理有成千上万个,采用github做项目的更是无数个。【github也是一个git服务器】
git用法:
命令 | 作用 |
---|---|
git init [gitname] | 创建并初始化本地仓库。在当前目录下创建一个本地仓库,在gitname目录下会创建一个.git的文件夹,存储所有的版本信息、标记等。 |
git remote add [short name] [url] | 添加远程版本库,建立本地仓库与远程仓库的连接,用于push最新代码到远程仓库。连接后,push不用再进行连接。 |
git clone <远程git仓库> <指定目录> | 从git仓库拷贝项目版本库,默认与远程git仓库同名。也可以自定在末尾指定本地版本库名称。 |
git add | 在暂存区中增加内容,暂存区的目录会更新【临时保存】 |
git status | 查看仓库当前的状态,显示有变更的文件 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit -m “注释” | 提交,把暂存区的内容提交到本地版本库。【本地保存、永久保存】 |
git push <远程主机名> <本地分支名>:<远程分支名> | 把本地分支推送到远程主机的远程分支。如果本地分支和远程分支名字相同,可写为【git push <远程主机名> <本地分支名> 】【–force 用在当本地分支和远程分支版本不一致时强制推送】【–delete 删除远程主机的分支】 |
git pull <远程主机名> <远程分支名>:<本地分支名> | 从远程主机的远程分支上,获取代码并合并到本地分支上 。如果远程分支与当前分支合并,可写为【git pull <远程主机名> <远程分支名> 】 |
git fetch [alias] | 从远程仓库获取代码 |
git merge [alias]/[branch] | 从远程仓库获取代码,并合并到当前分支 |
git remote | 远程仓库操作【-v 显示所有远程仓库】【show 显示某个远程仓库的信息】 |
git remote rm name | 删除远程仓库 |
git remote rename old_name new_name | 修改远程仓库名 |
git status | 查看状态 |
git add -A | 提交全部修改 |
git config --global user.name “xxx” | 配置用户名 |
git config --global user.email “xxx” | 配置邮箱 |
git config --list | 查看当前配置列表 |
git config -e | 配置仅对当前仓库有效 |
git config -e global | 对系统上所有仓库有效 |
git rm xxx | 从暂存区和工作区中删除文件 |
git rm -r xxx | 从暂存区和工作区中删除目录 |
git rm --cached <file> | 删除暂存区的文件,但保留工作区的文件 |
git mv | 移动或者重命名工作区文件 |
git checkout .或者git checkout – <file> | 用暂存区的全部或者指定文件替换工作区的文件,会清除工作区中所有已修改但未暂存的文件。 |
git checkout HEAD或者git checkout HEAD <file> | 用版本库的某一分支的全部或部分文件替换暂存区以及工作区的文件,会清除暂存区中已修改已暂存未提交的文件,以及工作区中已修改未暂存的文件。 |
git reset HEAD | 暂存区的目录会被重写,用master某一分支的目录替换暂存区的目录,不影响工作区的目录。 |
git log | 查询本地git仓库有多少次commit修改。包含各版本的版本号 |
git blame <file> | 以列表形式查看指定文件的历史修改记录 |
git log --oneline | 查看历史记录的简洁版本 |
git log --reverse --oneline | 反序显示历史记录 |
git log --author=name --oneline -5 | 显示最后5次由name提交的版本 |
git log --oneline --before={} --after={} --no-merges | 查看某个时间段提交的版本,还可以使用–until和–since选项 |
git reset [ --soft | --hard | --mixed] 版本号 | 版本回退,版本号可通过git log查询。取前7位即可。 |
git tag | 查看所有的标签 |
git tag -a tagname | 为当前版本添加标签 |
git tag -a tagname 版本号 | 为已发布的版本添加标签 |
git tag -a tagname -m “标签信息” | 指定标签信息 |
git tag -s tagname -m ”标签信息“ | PGP签名标签 |
常用操作:
2. 搭建git服务器
git下载地址:https://centos.pkgs.org/7/centos-x86_64/git-1.8.3.1-21.el7_7.x86_64.rpm.html
# 下载git的rpm包,并安装。
[root@server ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/git-1.8.3.1-21.el7_7.x86_64.rpm
# git的依赖包
[root@server ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/perl-Git-1.8.3.1-21.el7_7.noarch.rpm
[root@server ~]# rpm -ivh perl-Git-1.8.3.1-21.el7_7.noarch.rpm git-1.8.3.1-21.el7_7.x86_64.rpm
==================================================================
如果配置了本地yum源或者网络yum源,可以使用命令yum install git -y安装
==================================================================
# 在git用户的家目录下创建一个git版本库
[root@server ~]# useradd -m git
[root@server ~]# echo "123456" | passwd --stdin git
更改用户 git 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# su - git
[git@server ~]$ mkdir project.git # .git目录即版本库
[git@server ~]$ cd project.git/
[git@server project.git]$ git init --bare # 初始化版本库
初始化空的 Git 版本库于 /home/git/project.git/ # 版本库目录
# 这时git服务器已经安装好了。
在客户端上创建本地仓库(本地版本库):
# 在客户端上创建一个文件夹,用来存放本地仓库。【本地仓库=本地版本库】【远程仓库=远程版本库】
# 从git远程服务器上clone项目project的版本库
[root@client ~]# mkdir git
[root@client ~]# cd git/
[root@client git]# git clone [email protected]:/home/git/project.git
正克隆到 'project'...
The authenticity of host '192.168.8.192 (192.168.8.192)' can't be established.
ECDSA key fingerprint is SHA256:x7z6w2U0N2YSeuGofvUAlF5E8lT4Dz2fT4VZsjFsv2g.
ECDSA key fingerprint is MD5:17:d2:32:03:09:7e:35:b2:57:5b:50:a9:8f:13:12:bf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.8.192' (ECDSA) to the list of known hosts.
[email protected]'s password:
warning: 您似乎克隆了一个空版本库。
对本地版本库project进行操作: 修改、添加到缓存区(add)、提交到本地仓库(commit)、push到远程仓库(push)。
[root@client git]# ll
总用量 0
drwxr-xr-x 3 root root 18 9月 5 21:39 project
[root@client git]# cd project/
[root@client project]# ll
总用量 0
[root@client project]# echo "haha version 1" > a.html
[root@client project]# git add a.html # 添加到缓存区
[root@client project]# git commit -m "version 1" # 提交缓存区的内容到本地仓库,输出很多欢迎信息,用于协同操作提示作用。这里提示要配置用户名和邮箱,否则提交不成功。
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
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)')
在第一次push的时候报错了,报错如下:
这是因为在执行git commit时未将缓存内容提交到本地仓库,故本地仓库仍然是空目录,无法push空目录到git远程服务器。
# 配置用户名和邮箱
git config --global user.name "abong"
git config --global user.email "root@localhost"
# 再次提交,可以看到已经可以提交成功
[root@client project]# git commit -m "version 1"
[master(根提交) 90b2ac5] version 1
1 file changed, 1 insertion(+)
create mode 100644 a.html
# 再次push,可以看到已经push成功了。
[root@client project]# git remote add origin [email protected]:/home/git/project.git # 添加远程仓库
fatal: 远程 origin 已经存在。
[root@client project]# git push origin master # 把本地master分支推送到origin的master分支上
[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/home/git/project.git
* [new branch] master -> master
修改内容继续push:
[root@client project]# echo hahah > b.html
[root@client project]# echo haha >> a.html
[root@client project]# git add ./ # 保存到缓存区
[root@client project]# git commit -m "version 2" # 提交到本地仓库
[master 789b5ab] version 2
2 files changed, 2 insertions(+)
create mode 100644 b.html
[root@client project]# git push # push到git远程仓库
warning: push.default 未设置,它的默认值将会在 Git 2.0 由 'matching'
修改为 'simple'。若要不再显示本信息并在其默认值改变后维持当前使用习惯,
进行如下设置:
git config --global push.default matching
若要不再显示本信息并从现在开始采用新的使用习惯,设置:
git config --global push.default simple
参见 'git help config' 并查找 'push.default' 以获取更多信息。
('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,
为保持兼容,请用 'current' 代替 'simple' 模式)
[email protected]'s password:
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 288 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To [email protected]:/home/git/project.git
90b2ac5..789b5ab master -> master
以上git工作流程:克隆版本库,保存到缓存区,提交到本地仓库,push到git远程服务器。
3. git本地分支管理
命令 | 作用 |
---|---|
git branch branchname | 创建分支 |
git checkout branchname | 切换分支,切换到分支A,会使用分支A最后提交的快照替换工作区的目录。类似虚拟机的快照切换。 |
git merge branchname | 合并branchname分支到当前分支 |
git branch | 列出本地所有的分支 |
git checkout -b branchname | 创建新分支,并切换到该新分支下 |
git branch -d branchname | 删除分支 |
git log --graph | 查看分支合并图 |
合并冲突:当两个分支对同文件名的文件分别提交了相同的次数,此时合并两个分支,会产生合并冲突。此时该文件内容已经改变。
解决冲突:把冲突的内容,写成想要保留的内容,然后再次提交即可解决冲突。
4. windows客户端的使用
4.1 windows客户端工具下载
下载地址:https://tortoisegit.org/download/
点击安装,所有默认即可。
git.exe下载:https://gitforwindows.org/
即总共要下载并安装三个工具:tortoisegit安装包
、tortoisegit语言包
、git.exe可执行程序
。
4.2 git for windows工具的使用
安装git.exe可执行程序即可使用。
clone存在的仓库
Target Directory目录会自动创建,故要求一开始不存在。
由于从远程仓库clone版本库是通过ssh协议进行传输的,故需要使用ssh进行连接。
密码可能要输入多次。
可以看到已经自动创建了git目录,并且项目的内容也在里面。
日常工作流程:
下载版本库最新版本:
对版本库进行增加、删除、修改内容。√
表示已经提交到本地仓库。?
表示仅修改,并未保存到缓存区。+
号表示修改,并保存到缓存区。
至此,在无法连接git服务器的情况下也能永久保存提交的代码。当能连接git服务器时,可以将提交过的代码push到git远程服务器上。
如果需要配置用户名和邮件,可以打开git bash界面,输入以下命令配置:
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
修改过的代码,只有commit到本地仓库,才算永久保存,但仅仅是永久保存到本地仓库。push到远程仓库,才算是真正的永久保存。
4.3 tortoisegit工具的使用
下载并安装三个工具:tortoisegit安装包
、tortoisegit语言包
、git.exe可执行程序
。
新建git本地仓库
可以看到,已经从git服务器上clone项目project版本库到本地仓库中了。
添加内容:
提交后,会提示是否要推送到git远程服务器。
push到git远程服务器
点击关闭,即完成了一次push。
5. github的使用
github官网:https://github.com/
github工作原理:
注册账号:
注册成功后可以看到以下界面:
设置ssh密钥登录:
[root@server ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:shpdhMpxQTaVVIiG04hRu5MKdTwwZ187z4g8e6zKHfw root@server
The key's randomart image is:
+---[RSA 2048]----+
| +++==+++. |
| .*+++=o. |
| . *o+ + |
| . o O o = |
|. * = S o |
| . . + B |
| . . * o |
| . + = |
| +.o E |
+----[SHA256]-----+
[root@server ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQb/MDp2fDXer0hMVDwqbeeIvFQOlx2CO3RqgfiYzf3o3dT/o6GiyyQdcqCcP5riCMQGKobr0XSmJ9wuAgovXgXsvf7wxDKwTOdWPNLoJJz8NzVfIuBYvkc14tcaY8p0Fu4g6Bz5rZewrCNNPAKFzgMNnghQmhJWV/c790yD0+zfOYk6QkYashqbbHwyqihdaC5j+S0rPsD68HmEvp0f038JrA8u3eR/iv50A5LOTJYwGifu1Q+m1kdKf9TrPHHxdj2/XfKxy6nQcQzohhr+n1hH1Uwyr7hrM9Wvdfh+IPBPpfWESbebVb5T6f9nCy+yxui8a8M8i2a6b5yHyLYQ3X root@server
将公钥导入github中:
测试登录github:
创建代码仓库:
如上,已经成功建立了一个代码仓库,仓库名为test_projects。现在终于可以在github上提交和下载版本了。
代码仓库地为:https://github.com/Abong-demo/test_projects/
在本地创建一个代码仓库,修改代码仓库内容,并把修改的内容推送到github仓库。
[root@server ~]# mkdir git
[root@server ~]# cd git
[root@server git]# git init
[root@server git]# echo "haha" >> README.md
初始化空的 Git 版本库于 /root/git/.git/
[root@server git]# git add README.md
[root@server git]# git config --global user.name "abong"
[root@server git]# git config --global user.email "[email protected]"
[root@server git]# git commit -m "version1"
[master(根提交) b878046] version1
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@server git]# git remote add origin [email protected]:Abong-demo/test_projects.git
[root@server git]# git push -u origin master
github是一台公共的git服务器,多人合作的时候可以对同一个代码仓库的代码进行拉取和推送自己更新的内容。在学习使用git服务器时,最好是理解git服务器的原理和git用法,最后再辅以windows客户端工具进行版本的更新迭代。