开发者社区> sygxygq> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linuxwwwhj8828coml3099636600云计算运维学习之Git详解

简介: 皇家国际如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
+关注继续查看

一、关于版本控制

1.本地版本控制

本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

1.png

2.集中化的版本控制系统

如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

undefined

3.分布式版本控制系统

在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

undefined

二、Git简介

undefined

官网:https://git-scm.com

git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

1.Git历史

自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。

2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本。

三、安装Git

1.环境说明

[root@gitlab ~]# rpm -qa centos-release
centos-release-7-4.1708.el7.centos.x86_64
[root@gitlab ~]# uname -a
Linux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@gitlab ~]# getenforce
Disabled
[root@gitlab ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)

 Docs: man:firewalld(1)

本文使用的linux系统均为该系统

本文使用的windows系统为 Microsoft Windows [版本 10.0.15063]

2.Yum安装Git

centos 自带git

[root@gitlab ~]# rpm -qa git
git-1.8.3.1-11.el7.x86_64

安装方法

yum install git -y

3.编译安装
编译安装可以安装较新版本的git

Git下载地址:
https://github.com/git/git/releases

安装依赖关系

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

编译安装

tar -zxf git-2.0.0.tar.gz
cd git-2.0.0
make configure
./configure --prefix=/usr
make
make install
四、初次运行 Git 前的配置

1.配置git

命令集

git config --global user.name "oldboy" #配置git使用用户
git config --global user.email "admin@oldboyedu.com" #配置git使用邮箱
git config --global color.ui true #语法高亮
git config --list # 查看全局配置
配置过程

[root@gitlab ~]# git config --global user.name "oldboy" #配置git使用用户
[root@gitlab ~]# git config --global user.email "admin@oldboyedu.com" #配置git使用邮箱
[root@gitlab ~]# git config --global color.ui true #语法高亮
[root@gitlab ~]# git config --list # 查看全局配置
user.name=oldboy
user.email=admin@oldboyedu.com
color.ui=true
生成的配置文件

[root@gitlab ~]# cat .gitconfig
[user]

name = oldboy
email = admin@oldboyedu.com

[color]

ui = true

2.获取帮助

使用Git时需要获取帮助,有三种方法可以找到Git命令的使用手册:

git help
git --help
man git-
例如,要想获得配置命令的手册,执行

git help config
五、获取Git仓库(初始化仓库)

创建目录

mkdir git_data

进入目录

cd git_data/

初始化

git init

查看工作区状态

git status
操作过程

[root@gitlab ~]# mkdir git_data
[root@gitlab ~]# cd git_data/
[root@gitlab git_data]# git init
初始化空的 Git 版本库于 /root/git_data/.git/
[root@gitlab git_data]# git status

位于分支 master

初始提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
六、Git命令常规操作

常用命令说明
命令 命令说明
add 添加文件内容至索引
bisect 通过二分查找定位引入 bug 的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的
Git 版本库或重新初始化一个已存在的版本库
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前HEAD到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个GPG签名的 tag 对象

文件的状态变化周期
1.创建文件
[root@gitlab git_data]# touch README
[root@gitlab git_data]# git status

位于分支 master

初始提交

未跟踪的文件:

(使用 "git add ..." 以包含要提交的内容)

README

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
添加文件跟踪

[root@gitlab git_data]# git add ./*
[root@gitlab git_data]# git status

位于分支 master

初始提交

要提交的变更:

(使用 "git rm --cached ..." 撤出暂存区)

新文件: README

文件会添加到.git的隐藏目录

[root@gitlab git_data]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── objects
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs

├── heads
└── tags

由工作区提交到本地仓库

[root@gitlab git_data]# git commit -m 'first commit'
[master(根提交) bb963eb] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
查看git的状态

[root@gitlab git_data]# git status

位于分支 master

无文件要提交,干净的工作区
提交后的git目录状态

[root@gitlab git_data]# tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 54
│ │ └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd
│ ├── bb
│ │ └── 963eb32ad93a72d9ce93e4bb55105087f1227d
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs

├── heads
│   └── master
└── tags

2.添加新文件

git add * 添加到暂存区域
git commit 提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看
修改或删除原有文件

常规方法

git add *
git commit
简便方法

git commit -a -m "注释信息"
-a 表示直接提交

Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are
not affected.
3.删除git内的文件

命令说明

没有添加到暂存区的数据直接rm删除即可
已经添加到暂存区数据:
git rm --cached database

→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

git rm -f database

→将文件数据从git暂存区和工作目录一起删除

命令实践

创建新文件

[root@gitlab git_data]# touch 123
[root@gitlab git_data]# git status

位于分支 master

未跟踪的文件:

(使用 "git add ..." 以包含要提交的内容)

123

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

将文件添加到暂存区域

[root@gitlab git_data]# git add 123
[root@gitlab git_data]# git status

位于分支 master

要提交的变更:

(使用 "git reset HEAD ..." 撤出暂存区)

新文件: 123

删除文件

[root@gitlab git_data]# rm 123 -f
[root@gitlab git_data]# ls
[root@gitlab git_data]# git status

位于分支 master

要提交的变更:

(使用 "git reset HEAD ..." 撤出暂存区)

新文件: 123

尚未暂存以备提交的变更:

(使用 "git add/rm ..." 更新要提交的内容)

(使用 "git checkout -- ..." 丢弃工作区的改动)

删除: 123

[root@gitlab git_data]# git reset HEAD ./*
[root@gitlab git_data]# git status

位于分支 master

无文件要提交,干净的工作区
4.重命名暂存区数据

• 没有添加到暂存区的数据直接mv/rename改名即可。

• 已经添加到暂存区数据:

git mv README NOTICE
5.查看历史记录

• git log #→查看提交历史记录
• git log -2 #→查看最近几条记录
• git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异
• git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息
• git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息
• git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录
• git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。
使用format参数来指定具体的输出格式:

格式 说明
%s 提交说明。
%cd 提交日期。
%an 作者的名字。
%cn 提交者的姓名。
%ce 提交者的电子邮件。
%H 提交对象的完整SHA-1哈希字串。
%h 提交对象的简短SHA-1哈希字串。
%T 树对象的完整SHA-1哈希字串。
%t 树对象的简短SHA-1哈希字串。
%P 父对象的完整SHA-1哈希字串。
%p 父对象的简短SHA-1哈希字串。
%ad 作者的修订时间。
命令实践:

[root@gitlab git_data]# git log
commit a409fc46f792228a8119705e9cc97c2a013534ab
Author: oldboy admin@oldboyedu.com
Date: Wed Nov 29 11:44:14 2017 +0800

test

commit bb963eb32ad93a72d9ce93e4bb55105087f1227d
Author: oldboy admin@oldboyedu.com
Date: Wed Nov 29 10:57:02 2017 +0800

first commit

6.还原历史数据

Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

git reset --hard hash
git reset --hard HEAD^ #→还原历史提交版本上一次
git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)
测试命令:

[root@gitlab git_data]# git log
commit a409fc46f792228a8119705e9cc97c2a013534ab
Author: oldboy 123@oldboyedu.com
Date: Wed Nov 29 11:44:14 2017 +0800

test

commit bb963eb32ad93a72d9ce93e4bb55105087f1227d
Author: oldboy 123@oldboyedu.com
Date: Wed Nov 29 10:57:02 2017 +0800

first commit

还原数据

[root@gitlab git_data]# git reset --hard bb963
HEAD 现在位于 bb963eb first commit

查看数据

[root@gitlab git_data]# ls
README
7.还原未来数据

什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。

git reflog #→查看未来历史更新点
测试命令:

[root@gitlab git_data]# git reflog
bb963eb HEAD@{0}: reset: moving to bb963
a409fc4 HEAD@{1}: reset: moving to a409fc4
bb963eb HEAD@{2}: reset: moving to bb963
a409fc4 HEAD@{3}: commit: test
bb963eb HEAD@{4}: commit (initial): first commit
[root@gitlab git_data]#
8.标签使用

前面回滚使用的是一串字符串,又长又难记。
git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。
git tag #→查看当前所有的标签
git show v1.0 #→查看当前1.0版本的详细信息
git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字
git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0
测试命令:

[root@gitlab git_data]# git reset --hard 0bdf2e7
HEAD is now at 0bdf2e7 modified README file
[root@gitlab git_data]# git reset --hard V1.0
HEAD is now at a66370a add test dir

[root@gitlab git_data]# git tag v20171129
[root@gitlab git_data]# git tag
v20171129
9.对比数据

git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改后,再把它提交到仓库就放多了。

git diff README
七、分支结构

在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。

那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

1.分支切换

[root@gitlab git_data]# git branch linux
[root@gitlab git_data]# git branch 
  linux
* master
[root@gitlab git_data]# git checkout linux 
切换到分支 'linux'
[root@gitlab git_data]# git branch 
* linux
  master

在Linux分支进行修改

[root@gitlab git_data]# cat README 
[root@gitlab git_data]# echo "2017年11月30日" >> README 
[root@gitlab git_data]# git add .
[root@gitlab git_data]# git commit -m "2017年11月30日09点10分"
[linux 5a6c037] 2017年11月30日09点10分
 1 file changed, 1 insertion(+)
[root@gitlab git_data]# git status 
# 位于分支 linux
无文件要提交,干净的工作区

回到master分支

[root@gitlab git_data]# git checkout master 
切换到分支 'master'
[root@gitlab git_data]# cat README 
[root@gitlab git_data]# git log  -1
commit 7015bc7b316cc95e2dfe6c53e06e3900b2edf427
Author: oldboy <admin@oldboyedu.com>
Date:   Wed Nov 29 19:30:57 2017 +0800

    123

合并代码

[root@gitlab git_data]# git merge linux 
更新 7015bc7..5a6c037
Fast-forward
 README | 1 +
 1 file changed, 1 insertion(+)
[root@gitlab git_data]# git status 
# 位于分支 master
无文件要提交,干净的工作区
[root@gitlab git_data]# cat README 
2017年11月30日

2.合并失败解决

模拟冲突,在文件的同一行做不同修改

在master 分支进行修改

[root@gitlab git_data]# cat README
2017年11月30日
[root@gitlab git_data]# echo "oldboy in master">> README
[root@gitlab git_data]# git commit -a -m "oldboy 2017年11月30日 09点20分 "
[master 7ab71d4] oldboy 2017年11月30日 09点20分
1 file changed, 1 insertion(+)
切换到linux分支

[root@gitlab git_data]# git checkout linux
切换到分支 'linux'
[root@gitlab git_data]# cat README
2017年11月30日
[root@gitlab git_data]# echo "oldboy in linux" >> README
[root@gitlab git_data]# git commit -a -m "2017年11月30日 03"
[linux 20f1a13] 2017年11月30日 03
1 file changed, 1 insertion(+)
回到master分区,进行合并,出现冲突

[root@gitlab git_data]# git checkout master
切换到分支 'master'
[root@gitlab git_data]# git merge linux
自动合并 README
冲突(内容):合并冲突于 README
自动合并失败,修正冲突然后提交修正的结果。
解决冲突

[root@gitlab git_data]# vim README
2017年11月30日
oldboy in master
oldboy in linux

手工解决冲突

[root@gitlab git_data]# git commit -a -m "2017年11月30日 03"
[master b6a097f] 2017年11月30日 03
3.删除分支

因为之前已经合并了linux分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
查看所有包含未合并工作的分支,可以运行 git branch --no-merged:
git branch --no-merged
testing
这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:

git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
云计算——让学习更轻松
云计算——让学习更轻松
0 0
云计算基础:云计算越来越广泛,我们应该如何去学习云计算
学前介绍学习资料:HedEX Lite、产品文档、笔记、PPT、上课视频;IA:云计算概念、模式;学习虚拟化概念、特点、优势、传统方式区别;计算虚拟化(CPU虚拟化、内存虚拟机、IO虚拟化)、网络资源虚拟化、存储虚拟化;虚拟化的特性,包括迁移、HA、集群特性、磁盘特性、华为虚拟化产品的特性;云计算的发展趋势;实验;第一章 云计算简介云计算:提前将资源准备好,通过特定的技术使得用户可以随时随地、去使用这些资源;云计算的模型;传统方式;硬件设备、空调、供电;
0 0
Linux体验感悟--《云计算带来的学习方式变迁》
云起实验室面向开发者提供免费云产品资源、沉浸式体验环境、手把手操作手册,帮助开发者实现上云第一站,快速学习了解云计算及云产品。
0 0
学习云计算的认识与感悟
云计算现在与我们的生活息息相关,了解云计算的原理将会帮助我们更好地利用云计算。
0 0
Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)
Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)
0 0
云计算招聘岗位全方位需求解析+学习路径指南
在2020阿里云峰会上,阿里云智能总裁张建锋表示,阿里云今年再招5000人,大规模引进顶尖科技人才。7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,《阿里云技术面试红宝书》助你拿下Offer!马上投递简历: https://developer.aliyun.com/special/offerday01,在此,小编奉上云计算招聘岗位全方位需求解析+学习路径指南,帮你拿下好工作!
0 0
云计算学习从入门到实践(视频干货)
云计算是什么呢?从业相关者应该如何入门与学习云计算?企业又如何选择阿里云云产品来支持自己的业务形态?看行业大咖如何利用云产品来整合及优化自己的架构?超过三十节课,数十位阿里专家倾情奉献,一一为您解答! 十节课,轻松入门云计算 课程简介:从分布式调度、存储、数据库到分布式系统架构,十节课轻松了解云计...
1965 0
2019最潮云计算学习路径,速来认领! | 开发者必读(021期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
15 0
从0到1掌握云计算,2019最常规和最潮的学习路径
云计算已迈入了第二个十年,其仍在飞速发展之中。云原生、容器、编排、serverless等新技术在短短四五年间已发展的如火如荼。面对不断拓宽、加深的云计算知识领域,面对学习资源不是太少而是太多、乱花渐欲迷人眼的现状,本文将告诉您如何学习云计算,采用什么样的学习路径才能更高效、更扎实。
1805 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
云计算公网质量白皮书
立即下载
企业数字化基石——阿里巴巴云计算基础设施实践-试读
立即下载
阿里云认证的解析与实战-云计算ACP认证
立即下载