首页
Linux教程
Linux实战教程
Shell教程
Mysql教程
Keepalived教程
Linux基础教程
Linux进阶教程
运维题库
运维干货
视频教程
运维资讯
资源下载
关于我们
首页 运维干货图文详解 | 从 0 开始学习 Git , 简单明了,一目了然!

图文详解 | 从 0 开始学习 Git , 简单明了,一目了然!

Git是什么

  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
  • Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
  • Git 与常用的版本控制工具 CVS 等不同,它采用了分布式版本库的方式,不必服务器端软件支持

什么是版本控制系统

vcs version control system

  • 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统
  • 记录文件的所有历史变化
  • 随时可恢复到任何一个历史状态
  • 多人协作开发

使用版本控制系统的好处

协同合作

试想一下,如果没有版本控制系统,当你需要处理那些共享文件夹中的文件时,你必须告知办公室里的所有人,你正在对哪些文件进行编辑;

与此同时,其他人必须要避免与操作相同的文件。这是一个不现实和完全错误的流程。当你花了很长时间完成你的编辑后,可能这些文件早已经被团队里的其他开发成员修改或者删除了。

如果使用了版本控制系统,每一个团队成员都可以在任何时间对任何文件毫无顾虑的进行修改,版本控制系统可以把之后所有的改动合并成一个共同的版本,不论是一个文件还是整个项目。

这个共同的中心平台就是我们的版本控制系统。

版本存储

经常性地保存项目的改动是一个非常重要的习惯。但是如果没有版本控制系统这个操作将是非常困难的,并且非常容易出错的:

  • 你到底改动了什么?仅仅是针对一些特定文件的改动还是整个项目?
    • 你必须及时并小心地审查整个项目的每一个可能的改动细节,然后要付出大量的时间来整理它
  • 你如何命名这些版本?
    • 如果你是一个思维很有条理的人,你也许会定义一个比较容易理解的通用命名规则
    • 然而一旦涉及到一个多样性的改变,仅仅通过名字是很难追踪和判断这些改动的
  • 最重要的问题可能就是你如何知道在第一个版本和第二个版本之间到底进行了哪些改动?
    • 很少人会真正地去花时间来仔细记录每一个重要的变化,如在项目文件夹里的README文件

每一个版本控制系统仅仅对应一个项目。因此,在你的本地只存在一个版本,那就是这个项目的当前工作版本。

除此之外,而其它所有之前的版本和改动都已经被有序地存储在版本控制系统中了。当你需要时,你可以随时来查看之前的任何一个版本,而且还可以得到整个项目的快照。

恢复之前的版本

要把一些文件恢复到上次改动之前的版本(甚至整个项目恢复到之前的版本)。这可能意味着你发现了一些严重的问题!如果你确定那些改动是错误的或者是没有必要的,那轻松的点几下你就可以简单地撤销它。

在项目的每一个重要阶段,认识和正确地使用撤销这个功能会让你的工作变得非常轻松。

了解发生了什么

每当你提交一次对项目新的改动时,你的版本管理系统会要求你添加一个对这次改动的简短描述。

除此之外(如果是一个代码或者文本文件),你还可以看到一个改动前和改动后的内容的详细对照。这样也可以帮助你很好地了解版本与版本之间的发展关系。

备份

备份是一个分布式版本控制系统(例如 Git)提供的非常好的附带功能。

每一个团队成员都会在他的本地有一个完整的项目副本,包括整个项目的历史记录。如果你所依赖的服务器宕机了,或者是你的存储硬盘坏,所有你需要的恢复文件都可以在另外的团队成员的 Git 本地仓库中得到。

Git安装

系统环境准备

[root@oldboy-git ~]# cat /etc/redhat-release #查看系统版本
CentOS Linux release 7.9.2009 (Core)
[root@oldboy-git ~]# uname -r #查看内核版本
3.10.0-1160.el7.x86_64
[root@oldboy-git ~]# getenforce #确认Selinux关闭状态
Disabled
[root@oldboy-git ~]# systemctl stop firewalld #关闭防火墙

Git安装部署

安装Git

[root@oldboy-git ~]# yum install git -y
[root@oldboy-git ~]# git config
--global              使用全局配置文件
--system              使用系统级配置文件
--local               使用版本库级配置文件

配置git使用用户

[root@oldboy-git ~]# git config --global user.name "oldboy"

配置git使用邮箱

[root@oldboy-git ~]# git config --global user.email "oldboy@mail.com"

语法高亮

[root@oldboy-git ~]# git config --global color.ui true
[root@oldboy-git ~]# git config --list 
user.name=oldboy
user.email=oldboy@mail.com
color.ui=true
[root@oldboy-git ~]# cat .gitconfig 
[user]
    name = oldboy
    email = oldboy@mail.com
[color]
    ui = true

Git初始化

初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化

[root@oldboy-git ~]# mkdir git_data
[root@oldboy-git ~]# cd git_data/
[root@oldboy-git git_data]# 

初始化

[root@oldboy-git git_data]# git init 
Initialized empty Git repository in /root/git_data/.git/

查看工作区状态

[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

隐藏文件介绍:

文件名 文件作用
branches 分支目录
config 定义项目特有的配置选项
description 仅供git web程序使用
HEAD 指示当前的分支
hooks 包含git钩子文件
info 包含一个全局排除文件(exclude文件)
objects 存放所有数据内容,有info和pack两个子文件夹
refs 存放指向数据(分支)的提交对象的指针
index 保存暂存区信息,在执行git init的时候,这个文件还没有

Git 创建数据-提交数据

Git四种状态

Git基础命令

提交文件至Git仓库

[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

[root@oldboy-git git_data]# touch a b c
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  a
#  b
#  c
nothing added to commit but untracked files present (use "git add" to track)

[root@oldboy-git git_data]# git add a
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  b
#  c

[root@oldboy-git git_data]# ll .git/
total 16
drwxr-xr-x 2 root root   6 Apr 18 10:44 branches
-rw-r--r-- 1 root root  92 Apr 18 10:44 config
-rw-r--r-- 1 root root  73 Apr 18 10:44 description
-rw-r--r-- 1 root root  23 Apr 18 10:44 HEAD
drwxr-xr-x 2 root root 242 Apr 18 10:44 hooks
-rw-r--r-- 1 root root  96 Apr 18 11:09 index       # git add a 把文件提交到了暂存区
drwxr-xr-x 2 root root  21 Apr 18 10:44 info
drwxr-xr-x 5 root root  40 Apr 18 11:09 objects
drwxr-xr-x 4 root root  31 Apr 18 10:44 refs

[root@oldboy-git git_data]# git add .   # 使用git add . 或者* 添加目录中所有改动过的文件
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a
#  new file:   b
#  new file:   c
#

删除Git仓库内文件

删除文件

  1. 先从暂存区撤回到工作区、然后直接删除文件
   git rm --cached c
   rm -f c
  1. 直接从暂存区域同工作区域一同删除文件命令
   git rm -f b
[root@oldboy-git git_data]# git rm --cached c
rm 'c'
[root@oldboy-git git_data]# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 18 11:08 a
-rw-r--r-- 1 root root 0 Apr 18 11:08 b
-rw-r--r-- 1 root root 0 Apr 18 11:08 c
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a
#  new file:   b
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  c

修改文件名

方法一:

[root@oldboy-git git_data]# mv a a.txt
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a
#  new file:   b
#  new file:   c
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#  deleted:    a
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  a.txt
[root@oldboy-git git_data]# git rm --cached a
rm 'a'
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   b
#  new file:   c
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#  a.txt
[root@oldboy-git git_data]# git add a.txt
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a.txt
#  new file:   b
#  new file:   c
#

方法二:

[root@oldboy-git git_data]# git mv a.txt a
[root@oldboy-git git_data]# git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#  new file:   a
#  new file:   b
#  new file:   c
#

git diff 查看内容的不同

[root@oldboy-git git_data]# echo "aaa" >a
[root@oldboy-git git_data]# git diff a
diff --git a/a b/a
index e69de29..72943a1 100644
--- a/a
+++ b/a
@@ -0,0 +1 @@
+aaa
[root@oldboy-git git_data]# git add a      # 提交a文件到暂存区域、在用git diff是相同的
[root@oldboy-git git_data]# git diff --cached a   # 比对的是暂存区和本地仓库文件的不同处
diff --git a/a b/a
new file mode 100644
index 0000000..72943a1
--- /dev/null
+++ b/a
@@ -0,0 +1 @@
+aaa
[root@oldboy-git git_data]# git commit -m "modified a"  # 提交后在比对则暂存区和本地仓库内容相同
[master (root-commit) 9f99fb6] modified a
 3 files changed, 1 insertion(+)
 create mode 100644 a
 create mode 100644 b
 create mode 100644 c
[root@oldboy-git git_data]# git diff --cached a
[root@oldboy-git git_data]# 

git commit

相当于虚拟机的镜像、任何操作都被做了一次快照,可恢复到任意一个位置

[root@oldboy-git git_data]# git log  # 查看历史的git commit快照操作
commit 9f99fb695f0046a1bcd10e08cf9e3dbe40092884
Author: oldboy <oldboy@mail.com>
Date:   Mon Apr 18 11:35:34 2022 +0800

    modified a
[root@oldboy-git git_data]# git log --oneline         # 一行简单的显示commit信息
9f99fb6 modified a
[root@oldboy-git git_data]# git log --oneline --decorate  # 显示当前的指针指向哪里
9f99fb6 (HEAD, master) modified a
[root@oldboy-git git_data]# git log -p  # 显示具体内容的变化
[root@oldboy-git git_data]# git log -1  # 只显示1条内容

恢复历史数据

1.只更改了当前目录

[root@oldboy-git git_data]# echo "333" > a
[root@oldboy-git git_data]# cat a
333
[root@oldboy-git git_data]# git status 
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#  modified:   a
#
no changes added to commit (use "git add" and/or "git commit -a")

# 恢复
[root@oldboy-git git_data]# git checkout -- a    # 从暂存区覆盖本地工作目录
[root@oldboy-git git_data]# git status 
# On branch master
nothing to commit, working directory clean
[root@oldboy-git git_data]# cat a
aaa

2. 修改了本地目录且同时提交到了暂存区

[root@oldboy-git git_data]# echo "333" >> a # 添加新内容
[root@oldboy-git git_data]# git add a       # 提交到暂存区
[root@oldboy-git git_data]# git diff --cached #比对暂存区和本地仓库的内容
diff --git a/a b/a
index 72943a1..a7caab9 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
 aaa
+333
[root@oldboy-git git_data]# git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#  modified:   a
#
[root@oldboy-git git_data]# git reset HEAD a       # 本地仓库覆盖暂存区域
Unstaged changes after reset:
M   a
[root@oldboy-git git_data]# git diff a
diff --git a/a b/a
index 72943a1..a7caab9 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
 aaa
+333
[root@oldboy-git git_data]# git diff --cached a
[root@oldboy-git git_data]# 

3.修改了工作目录后提交到了暂存区和本地仓库后进行数据恢复

[root@oldboy-git git_data]# echo bbb >>a    # 提交新的bbb文件到a
[root@oldboy-git git_data]# git add a
[root@oldboy-git git_data]# git commit -m "add bbb"
[master f7cab2e] add bbb
 1 file changed, 1 insertion(+)
[root@oldboy-git git_data]# echo ccc >> a
[root@oldboy-git git_data]# git add a
[root@oldboy-git git_data]# git commit -am "add ccc"     # 这时候发现改错代码了,想还原某一次提交的文件快照
[master 2cbb088] add ccc
 1 file changed, 1 insertion(+)
[root@oldboy-git git_data]# git log --oneline 
2cbb088 add ccc
f7cab2e add bbb
9f99fb6 modified a
# Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式 版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录 

[root@oldboy-git git_data]# git reset --hard 9f99fb6
HEAD is now at 9f99fb6 modified a
# 刚刚的操作实际上就是改变了一下HEAD版本指针的位置,就是你将HEAD指针放在那里,那么你的当前工作版本就会定位在那里,要想把内容再还原到最新提交的版本,先看查看下提交版本号
[root@oldboy-git git_data]# cat a    # 打开发现回退错了,应该回退到bbb版本
aaa
[root@oldboy-git git_data]# git log --oneline      # 这时候查看log没有commit bbb的历史了
9f99fb6 modified a
# 怎么搞得?竟然没有了add bbb这个提交版本记录?
# 原因很简单,因为我们当前的工作版本是历史的一个提交点,这个历史提交点还没有发生过add bbb 更新记录,所以当然就看不到了,要是想”还原到未来”的历史更新点,可以用git reflog命令来查看所有的历史记录:
[root@oldboy-git git_data]# git reflog 
9f99fb6 HEAD@{0}: reset: moving to 9f99fb6
2cbb088 HEAD@{1}: commit: add ccc
f7cab2e HEAD@{2}: commit: add bbb
9f99fb6 HEAD@{3}: commit (initial): modified a
[root@oldboy-git git_data]# git reset --hard f7cab2e
HEAD is now at f7cab2e add bbb
[root@oldboy-git git_data]# cat a
aaa
bbb

GitLab安装

GitLab介绍

GitLab 是一个用于仓库管理系统的开源项目。

使用Git作为代码管理工具,并在此基础上搭建起来的web服务。

可通过Web界面进行访问公开的或者私人项目。

它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。

可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。

它还提供一个代码片段收集功能可以轻松实现代码复用。

常用的网站:
官网:https://about.gitlab.com/
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

环境准备

安装环境:

  1. CentOS 6或者 7
  2. 2G内存(实验)生产(至少4G)
  3. 安装包:gitlab-ce-10.2.2-ce
  4. 禁用防火墙,关闭selinux

https://about.gitlab.com/installation/#centos-7 # git官网

开始安装

[root@oldboy-git git_data]# yum install -y curl policycoreutils-python openssh-server       # 安装依赖

添加GitLab的yum源仓库

[root@oldboy-git ~]# curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash
[root@oldboy-gi ~]# yum -y install gitlab-ce

手动上传gitlab-ce的rpm包

[root@oldboy-git ~]# cd tools/
[root@oldboy-git tools]# rz -bye gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm        # 上传gitlab安装包 下载方式可通过国内清华源gitlab-ce社区
# 清华源下载GitLab网址 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
[root@oldboy-git tools]# ls
gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
[root@oldboy-git tools]# yum localinstall gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm -y

修改GitLab配置文件

[root@oldboy-git tools]# vim /etc/gitlab/gitlab.rb 
[root@oldboy-git tools]# egrep -v "^$|#" /etc/gitlab/gitlab.rb
external_url '192.168.56.144'  # 更改url地址为本机IP地址
[root@oldboy-git tools]# gitlab-ctl reconfigure          # 更改配置文件后需重新配置

# 正常启动关闭GitLab
gitlab-ctl start   # 启动GitLab
gitlab-ctl stop   # 关闭GitLab
gitlab-ctl restart   # 重新启动GitLab

通过浏览器输入IP地址进行访问gitlab

192.168.56.144

GitLab的命令和目录

目录或命令 作用
/opt/gitlab/ gitlab的程序安装目录
/var/opt/gitlab gitlab目录数据目录
/var/opt/gitlab/git-dfata 存放仓库数据
gitlab-ctl status 查看目前gitlab所有服务运维状态
gitlab-ctl start 启动GitLab服务
gitlab-ctl restart 重新启动GitLab服务
gitlab-ctl stop 关闭GitLab服务
gitlab-ctl stop nginx 单独停止某个服务
gitlab-ctl tail 查看所有服务的日志

Gitlab的服务构成

服务名称 作用
nginx 静态web服务器
gitlab-workhorse 轻量级的反向代理服务器
logrotate 日志文件管理工具
postgresql 数据库
redis 缓存数据库
sidekiq 用于在后台执行队列任务(异步执行)。(Ruby)
unicorn An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的

gitlab汉化

# 1. 下载汉化补丁
git clone https://gitlab.com/xhang/gitlab.git
# 2. 查看全部分支版本
git branch -a
# 3. 对比版本、生成补丁包
git diff remotes/origin/10-2-stable remotes/origin/10-2-stable-zh > ../10.2.2-zh.diff
# 4. 停止服务器
gitlab-ctl stop
# 5. 打补丁
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < /tmp/10.2.2-zh.diff 
# 6. 启动和重新配置
gitlab-ctl start
gitlab-ctl reconfigure

完全卸载删除GitLab

# 1. 停止gitlab
gitlab-ctl stop
# 2. 卸载gitlab
rpm -e gitlab-ce
# 3. 查看gitlab进程
ps aux | grep gitlab
# 4. 杀掉第一个进程(就是带有好多.............的进程)
kill -9 18777
# 5. 删除所有包含gitlab文件
find / -name gitlab | xargs rm -rf

本文链接:https://www.yunweibase.com/archives/720

网友评论comments

发表评论

邮箱地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 运维基地 保留所有权
扫二维码
扫二维码
返回顶部