本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》从问题中去学习k8s
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
《DBA》db的介绍使用(mysql、redis、mongodb...)
Git安装及基础命令使用
一、版本控制系统
1.什么是版本控制系统
记录一个或多个变化的过程,以便随时会到某个时间点 #功能: 1.记录文件的历史变化 2.可以随时回到任何一个时间点 3.多人协作开发
2.为什么要用版本控制系统
版本控制是指在软件开发过程中对各种程序代码、配置文件及说明文档等文件变更的管理,版本控制系统能够随着时间的推进记录一系列文件的变化,方便以后随时回退到某个版本
3.版本并发控制类型
1)本地版本控制系统
平时开发不使用版本控制系统的情况下,我们习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这种方式需要对项目频繁进行复制,最终整个工作区会比较臃肿混乱且时间一长很难区分项目之间的差异。 为了解决这个问题,人们开发了本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。最流行的是RCS,它的工作原理是在硬盘上保存补丁集(补丁指文件修订前后的变化),通过应用所有的补丁,可以重新计算出各个版本的文件内容。 本地版本控制系统一定程度上解决了手动复制粘贴代码的问题,但无法解决多人协作的问题。
2)集中式版本控制系统
集中式版本控制系统的出现是为了解决不同系统上的开发者协同开发,即多人协作的问题,主要有 CVS 和 SVN。集中式版本控制系统有一个单一的集中管理的中央服务器,保存所有文件的修订版本,由管理员管理和控制开发人员的权限,而协同工作的人们通过客户端连到中央服务器,从服务器上拉取最新的代码,在本地开发,开发完成再提交到中央服务器。
#集中式版本控制系统有许多优点: 1.操作比较简单,只需要拉取代码,开发,提交代码。 2.基本解决多人协作问题,每个人都可以从服务器拉取最新代码了解伙伴的进度。 3.同时管理员可以轻松控制各开发者的权限。 3.只需要维护中央服务器上的数据库即可。 #缺点也很明显: 1.本地没有全套代码,没有版本信息,提交更新都需联网跟服务器进行交互,对网络要求较高。 2.集中式的通病:风险较大,服务器一旦宕机,所有人无法工作,服务器磁盘一旦损坏,如果没有备份将丢失所有数据。
3)分布式版本控制系统
分布式版本控制系统很好地解决了集中式版本控制系统的缺点。首先,在分布式版本控制系统中,系统保存的不是文件变化的差量,而是文件的快照,即把文件的整体复制下来保存,其次,最重要的是分布式版本控制系统是去中心化的,当你从中央服务器拉取下来代码时,拉取的是一个完整的版本库,不仅仅是一份生硬的代码,还有历史记录,提交记录等版本信息,这样即使某一台机器宕机也能找到文件的完整备份。 Git 是 Linux 发明者 Linus 开发的一款分布式版本控制系统,是目前最为流行和软件开发者必须掌握的工具。
二、安装git
1.环境准备
主机 | IP | 配置 |
---|---|---|
git | 10.0.0.80 | 3G内存 |
2.基本优化
#关闭selinux和防火墙 #时间同步 [root@git ~]# ntpdate time1.aliyun.com
3.安装git
[root@git ~]# yum install -y git [root@git ~]# git config --global use global config file #使用全局的配置文件 --system use system config file #使用系统的配置文件 --local use repository config file #使用版本库的配置文件
4.创建git的用户
#配置用户 [root@git ~]# git config --global user.name "lhd" #配置用户邮箱 [root@git ~]# git config --global user.email "1240206455@qq.com" #显示语法高亮 [root@git ~]# git config --global color.ui true #查看全局配置 [root@git ~]# git config --list user.name=lhd user.email=1240206455@qq.com color.ui=true #生成了一个文件 [root@git ~]# cat .gitconfig [user] name = lhd email = 1240206455@qq.com [color] ui = true
5.初始化git
#初始化需要工作目录 [root@git ~]# mkdir git_data #初始化 [root@git ~]# cd git_data/ [root@git git_data]# git init . Initialized empty Git repository in /root/git_data/.git/ #初始化会生成多个文件 [root@git git_data]# ll .git/ total 12 drwxr-xr-x 2 root root 6 Sep 17 16:13 branches #分支目录 -rw-r--r-- 1 root root 92 Sep 17 16:13 config #配置文件 -rw-r--r-- 1 root root 73 Sep 17 16:13 description #程序使用的文件 -rw-r--r-- 1 root root 23 Sep 17 16:13 HEAD #版本指针 drwxr-xr-x 2 root root 242 Sep 17 16:13 hooks #钩子文件 drwxr-xr-x 2 root root 21 Sep 17 16:13 info #排除文件 drwxr-xr-x 4 root root 30 Sep 17 16:13 objects #存放数据的子文件 drwxr-xr-x 4 root root 31 Sep 17 16:13 refs #数据指针
三、git介绍
1.git组成
1.工作区 (workspace) 就是我们当前工作空间,也就是我们当前能在本地文件夹下面看到的文件结构。初始化工作空间或者工作空间 clean 的时候,文件内容和 index 暂存区是一致的,随着修改,工作区文件在没有 add 到暂存区时候,工作区将和暂存区是不一致的。 2.暂存区 (index) 老版本概念也叫 Cache 区,就是文件暂时存放的地方,所有暂时存放在暂存区中的文件将随着一个 commit 一起提交到 local repository 此时 local repository 里面文件将完全被暂存区所取代。暂存区是 git 架构设计中非常重要和难理解的一部分。 3.本地仓库 (local repository) git 是分布式版本控制系统,和其他版本控制系统不同的是他可以完全去中心化工作,你可以不用和中央服务器 (remote server) 进行通信,在本地即可进行全部离线操作,包括 log,history,commit,diff 等等。完成离线操作最核心是因为 git 有一个几乎和远程一样的本地仓库,所有本地离线操作都可以在本地完成,等需要的时候再和远程服务进行交互。 4.远程仓库 (remote repository) 中心化仓库,所有人共享,本地仓库会需要和远程仓库进行交互,也就能将其他所有人内容更新到本地仓库把自己内容上传分享给其他人。结构大体和本地仓库一样。
2.git的四种状态
#文件在不同的操作下可能处于不同的 git 生命周期 1.Untracked #未跟踪 1)新建的文件,还没有被git管理过 2)将文件从git跟踪管理中删除,那么readme处于unstacked状态 2.Staged #已暂存 1)文件已经使用git add提交到暂存区 2)然后在对modifed状态的文件执行git add命令,那么readme文件又变成staged状态 3.Unmodified #未修改 1)将处于staged状态的文件git commit到仓库,那么文件处于unmodified状态 4.Modified #已修改 1)如果当前文件正处于unmodified状态,然后修改工作区的文件,那么文件变为modifed状态
四、git基础命令
1.查看状态
[root@git git_data]# git status # On branch master # 暂存区数据 # # Initial commit # 未跟踪 # nothing to commit (create/ files and use "git add" to track)
2.文件操作
1)新建文件
[root@git git_data]# touch {1,2,3} [root@git git_data]# ll total 0 -rw-r--r-- 1 root root 0 Sep 17 16:38 1 -rw-r--r-- 1 root root 0 Sep 17 16:38 2 -rw-r--r-- 1 root root 0 Sep 17 16:38 3
2)提交文件
#提交文件到暂存区 [root@git git_data]# git add 1 [root@git git_data]# git status #提交所有工作区域的文件 [root@git git_data]# git add . [root@git git_data]# git status #提交暂存区文件到本地仓库 git commit -m "提交注释"
3)删除文件
1>将暂存区的文件移除
[root@git git_data]# git rm --cache 1 rm '1' [root@git git_data]# git status
2>删除工作目录的文件
[root@git git_data]# rm -rf 1 [root@git git_data]# git status
3>同时删除
#同时删除暂存区和工作区的文件 [root@git git_data]# git rm -f 2 rm '2' [root@git git_data]# git status
4)提交到仓库
#将暂存区的文件提交到仓库 [root@git git_data]# git commit -m "add new file 3" [master (root-commit) a4566ae] add new file 3 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 3 -m #注释 #查看状态,没有可提交的内容 [root@git git_data]# git status # On branch master nothing to commit, working directory clean
5)修改文件
1>重命名
#方式一: 1.本地重命名 [root@git git_data]# mv 3 3.txt [root@git git_data]# git status 2.从暂存区删除文件 [root@git git_data]# git rm --cached 3 rm '3' 3.再次提交文件 [root@git git_data]# git add 3.txt [root@git git_data]# git status 4.提交到本地仓库 [root@git git_data]# git commit -m "rename 3.txt"
2>同时修改
1.同时修改暂存区和工作目录的文件名字 [root@git git_data]# git mv 3.txt 3 [root@git git_data]# git status 2.提交本地仓库 [root@git git_data]# git commit -m "rename 3 too"
6)对比文件
git status 只能查看区域的状态的不同,不能查看内容是否相同 git diff #可以查看文件的不同 # 对比工作目录和暂存区的文件 [root@git git_data]# git diff 3 diff --git a/3 b/3 index 573541a..58c9bdf 100644 --- a/3 +++ b/3 @@ -1 +1 @@ -0 +111 # 对比本地仓库和暂存区的数据 [root@git git_data]# git diff --cached 3 diff --git a/3 b/3 index 573541a..58c9bdf 100644 --- a/3 +++ b/3 @@ -1 +1 @@ -0 +111
3.提交历史
当我们执行git commit后,发现代码错了,需要回滚 git任何操作都相当于做快照,我们可以恢复到任意时刻
1)查看历史
[root@git git_data]# git log commit 43f49f38976593194516ab68228faaa09b746270 Author: lhd <1240206455@qq.com> Date: Thu Sep 17 17:09:21 2020 +0800 modified 3 commit 90f573fa6524704cc3457cd3e3a1ccb24e5230ef Author: lhd <1240206455@qq.com> Date: Thu Sep 17 16:58:06 2020 +0800 rename 3 too
2)查看简单的历史提交
[root@git git_data]# git log --oneline 43f49f3 modified 3 90f573f rename 3 too 5d61056 rename 3.txt a4566ae add new file 3
3)查看当前分支
[root@git git_data]# git log --oneline --decorate 43f49f3 (HEAD, master) modified 3 90f573f rename 3 too 5d61056 rename 3.txt a4566ae add new file 3
4)查看提交的详细信息
[root@git git_data]# git log -p
5)显示最近提交的数据
[root@git git_data]# git log --oneline -2 # 只显示两行 43f49f3 modified 3 90f573f rename 3 too
6)恢复了历史数据
1>暂存区数据取出至工作区
#从暂存区将数据取出 [root@git git_data]# git checkout -- 3
2>修改了工作区并且提交到了暂存区
# 回到上一次提交的节点(也就是本地仓库退回暂存区) [root@git git_data]# git reset HEAD 3 Unstaged changes after reset: M 3 #从暂存区将数据取出(将暂存区数据取出至工作区) [root@git git_data]# git checkout -- 3 [root@git git_data]# git diff 3
3>修改了工作区并且提交到了暂存区在提交到了本地仓库
1.修改文件并一路提交到本地仓库 [root@git git_data]# echo 333 > 3 [root@git git_data]# git add 3 [root@git git_data]# git commit -m "错误的提交" [master 3044a5a] 错误的提交 1 file changed, 1 insertion(+), 1 deletion(-) 2.发现错误,想要回滚 #查看提交历史 [root@git git_data]# git log --oneline 3044a5a 错误的提交 43f49f3 modified 3 90f573f rename 3 too 5d61056 rename 3.txt a4566ae add new file 3 3.使用指针回到上一次提交的时间点 [root@git git_data]# git reset --hard 43f49f3 HEAD is now at 43f49f3 modified 3 [root@git git_data]# git log --oneline --decorate 43f49f3 (HEAD, master) modified 3 90f573f rename 3 too 5d61056 rename 3.txt a4566ae add new file 3 4.发现回滚错了,又看不到新提交的时间点 #查看所有的经历时间节点 [root@git git_data]# git reflog 43f49f3 HEAD@{0}: reset: moving to 43f49f3 3044a5a HEAD@{1}: commit: 错误的提交 43f49f3 HEAD@{2}: commit: modified 3 90f573f HEAD@{3}: commit: rename 3 too 5d61056 HEAD@{4}: commit: rename 3.txt a4566ae HEAD@{5}: commit (initial): add new file 3 5.回到回滚之前的时间点 [root@git git_data]# git reset --hard 3044a5a HEAD is now at 3044a5a 错误的提交 [root@git git_data]# cat 3 333