linux 服务器安装 git 等知识的一些笔记

Posted 山河已无恙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 服务器安装 git 等知识的一些笔记相关的知识,希望对你有一定的参考价值。

写在前面


  • 嗯,Git一般都用平台上的,自己用GithupGitee,公司用的Gitlab,服务端的没搞过,基本用的都是客户端。
  • 之前实习分了一个项目做组长,所以自己在阿里云上面搭了SVN的服务端,折腾了大半夜,但是后来也没怎么用。感兴趣小伙伴可以去围观:阿里云Linux下搭建SVN服务端
  • 想把Linux的东西总结一下,然后告一段落,学学微服务,python,考一个华为RS认证。
  • 笔记基本是一个小伙伴报班的笔记,这里整理一下,不足之处小伙伴留言。另准备自己在服务器上搭一个Gitlab,时间原因以后有时间在搞。

似水流年,转眼到了不惑之年。我和大家一样,对周围的事逐渐司空见惯。过去的事过去了,未过去的事也不能叫我惊讶。--------王小波


一、Git概述

概述

版本控制

版本控制系统就是一个控制文件版本的系统

  • 版本仓库是版本控制的核心
  • 任意客户端可以连接使用版本仓库

主流的版本控制系统

  • 集中式版本控制系统
    • 所有客户端共享一个仓库
    • 所有操作都需要联网
    • 代表软件:Subversion
  • 分布式版本控制系统
    • 每个客户端都有一个仓库完整克隆
    • 支持断网操作
    • 代表软件:Git

集中式版本控制

服务器记录所有版本,客户端仅有最新版本,无法实现断网操作!

集中式版本控制

  • 客户端只会保留最新版本号
  • 如果发生断网客户端继续版本更新,就会导致丢失断网期间的数据版本

分布式版本控制

服务器记录所有版本,客户端也有所有版本,具有本地仓库功能,支持断网操作

分布式版本控制

  • 客户端拥有本地仓库,会保留所以的历史版本;
  • 如果发生断网,客户端继续版本更新,数据修改的版本会被提交到本地仓库;
  • 当网络回复时,客户端会将所有本地仓库的版本数据提交到远程服务器上

Git基本概念

  • Git 仓库: 保存所有数据的地方
  • 工作区: 实时编辑文件的地方 (只看到一个文件)
  • 暂存区: 就是一个文件,索引文件,保存下次将提交的文件列表信息

简易的命令行入门教程:

##Git 全局设置:
git config --global user.name "意必固我"
git config --global user.email "1224965096@qq.com"
##创建 git 仓库:
mkdir Demos
cd Demos
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:liruilonger/Demos.git
git push -u origin master
##已有仓库?
cd existing_git_repo
git remote add origin git@gitee.com:liruilonger/Demos.git
git push -u origin master

Git工作流

部署Git服务

部署Git仓库

  • 安装软件(192.168.2.100作为远程Git服务器)
yum -y install git
###git服务器的部署,需要先创建一个数据目录
[root@web1 ~]# mkdir /var/git
###初始化一个空的项目project,可以存放版本数据,让客户端上传和下载数据
#--bare 长选项,代指空仓库
[root@web1 ~]# git init /var/git/project --bare
初始化空的 Git 版本库于 /var/git/project/
###查看初始化后,项目project下的文件
[root@web1 ~]# ls /var/git/project/
branches description hooks objects
config HEAD info refs
git #存储的数据都是以密文的方式存储的,无法直接打开看到,需要通过git命令查看

客户端测试

  • 在客户端克隆服务器资源进行测试
###客户端安装git软件包
[root@web2 ~]# yum -y install git
###客户端克隆服务端的所有project数据,每次克隆,都会完整克隆一遍
[root@web2 ~]# git clone root@192.168.2.100:/var/git/project
正克隆到 'project'...
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:wpTzE5md4arrZVRHhaKFacrEHYWldSWAPwghApqXXfo.
ECDSA key fingerprint is MD5:7d:d3:26:9d:05:b4:f5:e0:0e:e4:2d:34:2d:c5:a4:3e.
Are you sure you want to continue connecting (yes/no)? yes ##ssh连接
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password: ##输入密码验证
warning: 您似乎克隆了一个空版本库。 #下载project成功
[root@web2 ~]# ls /root/project/ #空的版本库
[root@web2 ~]# ls -a /root/project/ #只有隐藏文件
. .. .git

二、GIt版本控制(上)

版本控制

新建数据

在客户端对仓库进行编辑,创建新资料:注意:web2为客户端

########## git客户端所有的操作都必须在相应的git仓库下进行 ###########
##进入project工作区
[root@web2 ~]# cd /root/project/
##编辑,操作文件
[root@web2 project]# mkdir demo
[root@web2 project]# cp /etc/hosts demo/
[root@web2 project]# cp /etc/passwd init.txt
##查看工作区 project 的状态信息
[root@web2 project]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# demo/
# init.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

提交数据到本地版本仓库

提交暂存区

#.代表当前目录,提交当前目录下的所有数据到暂存区中
[root@web2 project]# git add .
###每个工作区下,都有一个 .git 的隐藏目录,这个目录就是本地仓库
##提交数据时,就是把数据在 .git 目录下进行备份
[root@web2 project]# ls -a
. .. demo .git init.txt

将暂存区修改提交到本地仓库

###指定提交数据的人的邮箱和名字,只需要执行一次
[root@web2 project]# git config --global user.email "zhang@163.com"
[root@web2 project]# git config --global user.name "zhang san"
##将暂存区的修改提交到本地仓库(.git)
[root@web2 project]# git commit -m "first file version"
[master(根提交) 6023adb] first file version
2 files changed, 23 insertions(+)
create mode 100644 demo/init.txt
create mode 100644 init.txt

将数据推送至远程Git服务器

###配置提交方式,只需要执行一次
[root@web2 project]# git config --global push.default simple
###提交本地仓库的数据到远程的git服务器上;
#可以用 du -sh /var/git/project/ 查看web1提交前后目录大小的变化
[root@web2 project]# git push
root@192.168.2.100 s password: #输入密码
Counting objects: 5, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 787 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To root@192.168.2.100:/var/git/project
* [new branch] master -> master
####git pull 从服务端下载数据,每次下载的都是已经更新修改的数据,没有修改的不下载
[root@web2 project]# git pull
root@192.168.2.100's password: #输入密码
Already up-to-date.

生成更多版本

###创建文件new.txt,先提交到暂存区,再从暂存区提交数据到本地仓库
[root@web2 project]# echo "new file" > new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "add new.txt"
[master 02d4ef9] add new.txt
1 file changed, 1 insertion(+)
create mode 100644 new.txt
###给文件new.txt追加一行first,先提交到暂存区,再从暂存区提交数据到本地仓库
[root@web2 project]# echo "first" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:first line"
[master 7dc8c9e] new.txt:first line
1 file changed, 1 insertion(+)
###给文件new.txt追加一行second,先提交到暂存区,再从暂存区提交数据到本地仓库
[root@web2 project]# echo "second" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:second"
[master c191194] new.txt:second
1 file changed, 1 insertion(+)
###给文件new.txt追加一行third,先提交到暂存区,再再从暂存区提交数据到本地仓库
[root@web2 project]# echo "third" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:thired"
[master ebfe460] new.txt:thired
1 file changed, 1 insertion(+)
###将本地仓库(.git)中的数据提交到远程服务器上
[root@web2 project]# git push
root@192.168.2.100's password:
Counting objects: 13, done.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 961 bytes | 0 bytes/s, done.
Total 12 (delta 3), reused 0 (delta 0)
To root@192.168.2.100:/var/git/project
6023adb..ebfe460 master -> master

多次修改数据,生成更多版本信息

###创建文件num.txt,先提交到暂存区,再提交到本地仓库
[root@web2 project]# echo "123" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:123"
[master b35b1ce] num.txt:123
1 file changed, 1 insertion(+)
create mode 100644 num.txt
###将文件num.txt内容修改为456,先提交到暂存区,再提交到本地仓库
[root@web2 project]# echo "456" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:456"
[master 9595def] num.txt:456
1 file changed, 1 insertion(+), 1 deletion(-)
###将文件num.txt内容修改为789,先提交到暂存区,再提交到本地仓库
[root@web2 project]# echo "789" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num:txt:789"
[master 30d20ed] num:txt:789
1 file changed, 1 insertion(+), 1 deletion(-)
###将本地仓库(.git)中的数据提交到远程服务器上
[root@web2 project]# git push
root@192.168.2.100's password:
Counting objects: 10, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 663 bytes | 0 bytes/s, done.
Total 9 (delta 3), reused 0 (delta 0)
To root@192.168.2.100:/var/git/project
ebfe460..30d20ed master -> master

查看日志

###查看所有的版本日志信息
[root@web2 project]# git log
......
commit 6023adb8f6c785c41b1857e5027d34904b25ed05 #版本唯一编码
Author: zhang san <zhang@163.com> #上传人的姓名和邮箱
Date: Thu Jul 30 10:36:19 2020 +0800 #版本更新的日期
first file version #版本修改时的注释信息
......
###只查看版本的唯一编码和注释信息
[root@web2 project]# git log --pretty=oneline
......
7dc8c9e0e86c0eb3a5f976380e90f100cb6da999 new.txt:first line
02d4ef9d70844268d8c6048b1133dca2c1a5bc27 add new.txt
6023adb8f6c785c41b1857e5027d34904b25ed05 first file version
......
###只查看版本的唯一编码【前几位字符】和注释信息
[root@web2 project]# git log --oneline
......
7dc8c9e new.txt:first line
02d4ef9 add new.txt
6023adb first file version
......
###查看版本的唯一编码【前几位字符】、指针位置和注释信息
[root@web2 project]# git reflog
......
7dc8c9e HEAD@{5}: commit: new.txt:first line
02d4ef9 HEAD@{6}: commit: add new.txt
6023adb HEAD@{7}: commit (initial): first file version
.....

客户端软件rootewebi

三、Git版本控制(下)

数据恢复

HEAD指针下

HEAD指针是一个可以在任何分支任何版本移动的指针,通过移动过指针我们可以将数据还原至任何版本,当前HEAD指针HEAD@{0}

我们可以使用 git relog 查看当前指针

[root@web2 project]# git reflog
30d20ed HEAD@{0}: commit: num:txt:789
9595def HEAD@{1}: commit: num.txt:456
b35b1ce HEAD@{2}: commit: num.txt:123
ebfe460 HEAD@{3}: commit: new.txt:thired
c191194 HEAD@{4}: commit: new.txt:second
7dc8c9e HEAD@{5}: commit: new.txt:first line
02d4ef9 HEAD@{6}: commit: add new.txt
6023adb HEAD@{7}: commit (initial): first file version
HEAD #指针默认指定在最新修改的版本位置,如果想查看以前的版本号,只需将HEAD指针移动到相应版本的位置即可

查看Git日志信息

###只查看版本的唯一编码【前几位字符】和注释信息
[root@web2 project]# git log --oneline
30d20ed num:txt:789
9595def num.txt:456
b35b1ce num.txt:123
ebfe460 new.txt:thired
c191194 new.txt:second
7dc8c9e new.txt:first line
02d4ef9 add new.txt
6023adb first file version

移动HEAD指計

###通过版本编号,移动指针到版本num.txt:123
[root@web2 project]# git reset --hard b35b1ce
HEAD 现在位于 b35b1ce num.txt:123
### HEAD@{0} 始终指在当前版本的位置
[root@web2 project]# git reflog | head -2
b35b1ce HEAD@{0}: reset: moving to b35b1ce
30d20ed HEAD@{1}: commit: num:txt:789
### 查看文件内容
[root@web2 project]# cat num.txt
123
###通过版本编号,移动指针到版本num.txt:123
[root@web2 project]# git reset --hard 02d4ef9
HEAD 现在位于 02d4ef9 add new.txt
### HEAD@{0} 始终指在当前版本的位置
[root@web2 project]# git reflog | head -2
02d4ef9 HEAD@{0}: reset: moving to 02d4ef9
b35b1ce HEAD@{1}: reset: moving to b35b1ce
### 由于num.txt是在new.txt 之后产生的,移动指针后num.txt会消失
[root@web2 project]# ls
demo init.txt new.txt
### 查看文件内容
[root@web2 project]# cat new.txt
new file
### 通过git 查看到以前的版本内容,拷贝到其他位置后,要回到最新的版本下,否则会保存
##因为版本更新是按照顺序的,指针停留在以前的版本,则无法更新最新的版本
[root@web2 project]# git reset --hard 30d20ed
HEAD 现在位于 30d20ed num:txt:789

分支

分支可以让开发分多条主线同时进行,每个主线互不影响

  • 按功能模块分支、按版本分支
  • 分支也可以合并

常见分支规范如下:/常见的分支规范如下:

  • 默认master分支MASTER是主分支,是代码的核心
  • DEVELOP最新开发成果的分支
  • RELEASE分支,为发布新产品设置的分支
  • HOTFIX分支,为了修复软件BUG缺陷的分支
  • FEATURE分支,为开发新功能设置的分支
MASTER分支 #产品的主要代码,代码的核心
DEVELOP分支 #开发产品的一个大的功能模块
RELEASE分支 #发布产品给用户使用的分支
HOTFIX分支 #修复产品BUG缺陷的分支
FEATURE分支 #开发产品的一个小的功能

概述暂存区修改提交到本地仓库

创建分支

查看当前分支

###查看当前所在的分支
[root@web2 project]# git status
# 位于分支 master
无文件要提交,干净的工作区
###查看所有分支,以 * 打头,即为当前所处的分支
[root@web2 project]# git branch -v
* master 30d20ed num:txt:789

创建分支

###创建分支hotfix【修复bug】和feature【开发小功能】
[root@web2 project]# git branch hotfix
[root@web2 project]# git branch feature
###查看所有分支,以 * 打头,即为当前所处的分支
[root@web2 project]# git branch -v
feature 30d20ed num:txt:789
hotfix 30d20ed num:txt:789
* master 30d20ed num:txt:789

切换与合并分支

切换分支

###切换到hotfix【修复bug】分支
[root@web2 project]# git checkout hotfix
切换到分支 'hotfix'
###查看所有分支,以 * 打头,即为当前所处的分支
[root@web2 project]# git branch -v
feature 30d20ed num:txt:789
* hotfix 30d20ed num:txt:789
master 30d20ed num:txt:789

在新分支上进行数据操作(增、删、改、查)

###在分支hotfix下,给new.txt追加一行数据
[root@web2 project]# echo "fix a bug" >> new.txt
[root@web2 project]# cat new.txt
new file
first
second
third
fix a bug
###提交修改数据到暂存区
[root@web2 project]# git add .
###从暂存区提交修改数据到本地仓库
[root@web2 project]# git commit -m "fix a bug"
[hotfix e686c17] fix a bug
1 file changed, 1 insertion(+)

合并分支:将 hotfix 修改的数据合并到 master 分支

###切换分支到master下
[root@web2 project]# git checkout master
切换到分支 'master'
###发现hostfix分支中的修改,在master主分支下是没有生效的
[root@web2 project]# cat new.txt
new file
first
second
third
###查看所有分支,以 * 打头,即为当前所处的分支
[root@web2 project]# git branch -v
feature 30d20ed num:txt:789
hotfix e686c17 fix a bug
* master 30d20ed num:txt:789
###合并分支必须处在master分支下,将其他分支合并过来
[root@web2 project]# git merge hotfix
更新 30d20ed..e686c17
Fast-forward
new.txt | 1 +
1 file changed, 1 insertion(+)
###再次查看new.txt,合并成功
[root@web2 project]# cat new.txt
new file
first
second
third
fix a bug

解决分支的版本冲实问题

在不同分支中修改相同文件的相同行数据,模拟数据冲突

###切换到hotfix分支
[root@web2 project]# git checkout hotfix
切换到分支 'hotfix'
###hotfix分支下创建新文件a.txt
[root@web2 project]# echo AAA > a.txt
###提交修改数据到暂存区
[root@web2 project]# git add .
###从暂存区提交数据到本地仓库
[root@web2 project]# git commit -m "add a.txt by hotfix"
[hotfix d96f8ac] add a.txt by hotfix
1 file changed, 1 insertion(+)
create mode 100644 a.txt
###切换到master分支
[root@web2 project]# git checkout master
切换到分支 'master'
您的分支领先 'origin/master'1 个提交。
(使用 "git push" 来发布您的本地提交)
###master分支下,创建新文件a.txt
[root@web2 project]# echo "BBB" > a.txt
###提交修改数据到暂存区
[root@web2 project]# git add .
###从暂存区提交数据到本地仓库
[root@web2 project]# git commit -m "add a.txt by master"
[master afd5c52] add a.txt by master
1 file changed, 1 insertion(+)
create mode 100644 a.txt
###在master分支下,合并hotfix分支;修改相同行数据,发生冲突,无法合并
[root@web2 project]# git merge hotfix
自动合并 a.txt
冲突(添加/添加):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。

查看有冲突的文件,修改文件为最终版本的数据,解决冲突

###查看冲突的a.txt文件
[root@web2 project]# cat a.txt
<<<<<<< HEAD
BBB
=======
AAA
>>>>>>> hotfix
###冲突需要自己手动解决,修改master分支中的数据,则为最终数据
[root@web2 project]# vim a.txt #留下的为最终数据
BBB
###将修改提交到暂存区
[root@web2 project]# git add .
###将暂存区中的数据提交到本地,备注冲突解决
[root@web2 project]# git commit -m "resolved"
[master b5864d8] resolved

以上是关于linux 服务器安装 git 等知识的一些笔记的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux中shell 等知识的一些笔记

关于Linux中shell 等知识的一些笔记

Git学习笔记

关于Git分支基础知识的一些笔记

关于Git分支基础知识的一些笔记

linux安装git