什么是Git

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

其他常见版本管理工具

集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无法进行提交或备份文件。

QQ图片20200222132714.png

持续集成教程.pdf

Git安装

  • 需要查看系统版本并确认防火墙和selinux是否关闭
cat /etc/redhat-release
uname -a
uname -r
getenforce
systemctl status firewalld

yum命令安装

yum install -y git

git配置

[root@home ~]# git config
用法:git config [选项]

配置文件位置
    --global              使用全局配置文件
    --system              使用系统级配置文件
    --local               使用版本库级配置文件
    -f, --file <文件>     使用指定的配置文件

操作
    --get                 获取值:name [value-regex]
    --get-all             获得所有的值:key [value-regex]
    --get-regexp          根据正则表达式获得值:name-regex [value-regex]
    --replace-all         替换所有匹配的变量:name value [value_regex]
    --add                 添加一个新的变量:name value
    --unset               删除一个变量:name [value-regex]
    --unset-all           删除所有匹配项:name [value-regex]
    --rename-section      重命名小节:old-name new-name
    --remove-section      删除一个小节:name
    -l, --list            列出所有
    -e, --edit            打开一个编辑器
    --get-color <slot>    找到配置的颜色:[默认]
    --get-colorbool <slot>
                          找到颜色设置:[stdout-is-tty]

类型
    --bool                值是 "true" 或 "false"
    --int                 值是十进制数
    --bool-or-int         值是 --bool or --int
    --path                值是一个路径(文件或目录名)

其它
    -z, --null            终止值是NUL字节
    --includes            查询时参照 include 指令递归查找
  • 配置git
git config --global user.name "1997sty"
git config --global user.email "admin@1997sty.com"
git config --global color.ui true
  • 配置完成后可以使用命令查看也可以查看家目录下的配置文件
cat ~/.gitconfig
git config --list

git初始化

#初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化
[root@home ~]# mkdir git_data
[root@home ~]# cd git_data
#初始化
[root@home git_data]# git init
初始化空的 Git 版本库于 /root/git_data/.git/
[root@home git_data]# ll
总用量 0
#查看工作区状态
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

隐藏文件介绍

#查看目录结构
[root@home git_data]# tree ./ -a
./
└── .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
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

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

Git常规使用

创建数据-提交数据

QQ图片20200222134829.png

Git四种状态

QQ图片20200222134952.png

创建测试文件

[root@home git_data]# touch a b c
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       a
#       b
#       c
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

添加a后查看状态,出现了index文件

[root@home git_data]# git add a
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       b
#       c
[root@home git_data]# tree -a
.
├── a
├── b
├── c
└── .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

11 directories, 18 files

添加所有文件,再查看git状态

[root@home git_data]# git add .
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a
#       新文件:    b
#       新文件:    c
#

将文件撤出暂存区

[root@home git_data]# git rm --cached c
rm 'c'
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a
#       新文件:    b
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       c
#该命令不会删除文件
[root@home git_data]# ll
总用量 0
-rw-r--r-- 1 root root 0 2月  22 13:53 a
-rw-r--r-- 1 root root 0 2月  22 13:53 b
-rw-r--r-- 1 root root 0 2月  22 13:53 c

将文件撤出暂存区,并删除文件

#撤出暂存区
git rm --cached c
#删除文件
rm -f c
#撤出暂存区,删除文件
#git rm -f c
  • 使用git命令将文件撤出暂存区,并删除文件
[root@home git_data]# git rm -f c
rm 'c'
[root@home git_data]# ll
总用量 0
-rw-r--r-- 1 root root 0 2月  22 13:53 a
-rw-r--r-- 1 root root 0 2月  22 13:53 b
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a
#       新文件:    b
#

将暂存区文件重命名

#例如将a重命名
git rm --cached a
mv a a.txt
git add a.txt
  • 使用git命令将暂存区文件重命名
[root@home git_data]# git mv a a.txt
[root@home git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a.txt
#       新文件:    b
#
[root@home git_data]# ll
总用量 0
-rw-r--r-- 1 root root 0 2月  22 13:53 a.txt
-rw-r--r-- 1 root root 0 2月  22 13:53 b

查看文件改动

git status只能查看区域状态的不同,不能查看文件内容的变化git diff查看工作区内容和暂存区内容的不同

[root@home git_data]# echo aaa > a.txt 
[root@home git_data]# git diff
diff --git a/a.txt b/a.txt
index e69de29..72943a1 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+aaa
[root@home git_data]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       修改:      a.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

文件提交

在文件改动后可以通过命令提交,保存这一次文件的改动

[root@home git_data]# git diff
diff --git a/a.txt b/a.txt
index e69de29..72943a1 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+aaa
diff --git a/b b/b
index e69de29..f761ec1 100644
--- a/b
+++ b/b
@@ -0,0 +1 @@
+bbb
[root@home git_data]# git commit -m "test"

查看提交记录

[root@home git_data]# git log
commit 5a78ba7e5cdbd9c063acc74f507e3fdcd819a731
Author: 1997sty <admin@1997sty.com>
Date:   Sat Feb 22 14:38:46 2020 +0800

    test1

commit eb3672654a1ebf0e62ea0b6c8435669e8b3c3075
Author: 1997sty <admin@1997sty.com>
Date:   Sat Feb 22 14:37:41 2020 +0800

    test

commit a9a90bac0d404bd86d94d14876fc84f5484f37c5
Author: 1997sty <admin@1997sty.com>
Date:   Sat Feb 22 14:32:02 2020 +0800

    2

commit d87c2e78c0ff07d4a981221697454494e3b56e16
Author: 1997sty <admin@1997sty.com>
Date:   Sat Feb 22 14:31:42 2020 +0800

    1

commit 77fbe689066e42271959bb9682402d27f26253f1
Author: 1997sty <admin@1997sty.com>
Date:   Sat Feb 22 14:31:32 2020 +0800

    1
  • git log -p : 查看提交记录,显示具体内容的变化
  • git log --oneline : 单行显示提交记录
  • git log --oneline --decorate : 单行显示提交记录,显示指针位置
  • git log -1 : 显示1条提交记录
  • **** :

恢复文件

删除文件后查看状态,显示删除了文件,检出被删除的文件后,查看状态,显示无文件要提交,恢复了被删除的文件

[root@home git_data]# rm -f test 
[root@home git_data]# ll
总用量 8
-rw-r--r-- 1 root root 4 2月  22 14:34 a.txt
-rw-r--r-- 1 root root 4 2月  22 14:36 b
[root@home git_data]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add/rm <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       删除:      test
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@home git_data]# git checkout test
[root@home git_data]# ll
总用量 12
-rw-r--r-- 1 root root 4 2月  22 14:34 a.txt
-rw-r--r-- 1 root root 4 2月  22 14:36 b
-rw-r--r-- 1 root root 5 2月  22 14:56 test
[root@home git_data]# git status
# 位于分支 master
无文件要提交,干净的工作区

比对暂存区和本地仓库的内容

  • 没有使用git add a.txt添加到暂存区,git diff --cached无结果,git diff有结果
  • 使用git add a.txt添加到暂存区,git diff --cached有结果,git diff无结果
  • git diff --cached : 比对暂存区和本地仓库的内容
  • git diff : 比对工作区和暂存区的内容
[root@home git_data]# echo ccc > a.txt 
[root@home git_data]# git diff --cached
[root@home git_data]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       修改:      a.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@home git_data]# git diff
diff --git a/a.txt b/a.txt
index 72943a1..b2a7546 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-aaa
+ccc
[root@home git_data]# git add a.txt
[root@home git_data]# git diff --cached
diff --git a/a.txt b/a.txt
index 72943a1..b2a7546 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-aaa
+ccc
[root@home git_data]# git diff

git版本回调

  • Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式
  • 版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录
[root@home git_data]# git log --oneline
c48a177 ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1
[root@home git_data]# git reset --hard 77fbe68
HEAD 现在位于 77fbe68 1
[root@home git_data]# ll
总用量 0
-rw-r--r-- 1 root root 0 2月  22 15:25 a.txt
-rw-r--r-- 1 root root 0 2月  22 15:25 b
[root@home git_data]# git log --oneline
77fbe68 1
#查看记录后,使用命令跳转到了`77fbe68`这条记录,工作区的文件发生了变化,也恢复到了这条记录提交时的样子,但是日志记录却查不到之后的记录,只有当时的记录
#刚刚的操作实际上就是改变了一下HEAD版本指针的位置,就是你将HEAD指针放在那里,那么你的当前工作版本就会定位在那里,要想把内容再还原到最新提交的版本,先看查看下提交版本号
#使用git reflog 可查看总历史内容
[root@home git_data]# git reflog
77fbe68 HEAD@{0}: reset: moving to 77fbe68
c48a177 HEAD@{1}: reset: moving to c48a177
77fbe68 HEAD@{2}: reset: moving to 77fbe68
c48a177 HEAD@{3}: reset: moving to c48a177
66c0bf6 HEAD@{4}: commit: ddd
77fbe68 HEAD@{5}: reset: moving to 77fbe68
c48a177 HEAD@{6}: commit: ddd
eb42aad HEAD@{7}: reset: moving to eb42aad
77fbe68 HEAD@{8}: reset: moving to 77fbe68
eb42aad HEAD@{9}: commit: test2
5a78ba7 HEAD@{10}: commit: test1
eb36726 HEAD@{11}: commit: test
a9a90ba HEAD@{12}: commit: 2
d87c2e7 HEAD@{13}: commit: 1
77fbe68 HEAD@{14}: commit (initial): 1
[root@home git_data]# git reset --hard c48a177
HEAD 现在位于 c48a177 ddd
#回到c48a177版本后,工作区又恢复了文件
[root@home git_data]# ll
总用量 12
-rw-r--r-- 1 root root 8 2月  22 15:28 a.txt
-rw-r--r-- 1 root root 4 2月  22 15:28 b
-rw-r--r-- 1 root root 5 2月  22 15:28 test

Git分支

QQ图片20200222153208.png

分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之上创建一个名叫"拍照功能"的分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,这样即能保证代码不丢失,又不影响其他人的工作.

一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以创建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面的图那样.

Git分支操作

新建分支

#新建testing分支
[root@home git_data]# git branch testing
# *号在哪里就说明当前在哪个分支
[root@home git_data]# git branch
* master
  testing
#通过命令查看分支指向
[root@home git_data]# git log --oneline --decorate 
c48a177 (HEAD, testing, master) ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1

切换分支

  • git checkout -b testing : 创建testing分支,并切换到testing分支
#切换到testing分支
[root@home git_data]# git checkout testing
切换到分支 'testing'
# *号在哪里就说明当前在哪个分支
[root@home git_data]# git branch
  master
* testing
#通过命令查看分支指向
[root@home git_data]# git log --oneline --decorate 
c48a177 (HEAD, testing, master) ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1
#创建文件,添加到暂存区后提交,查看分支指向,会显示指针,和两个分支分别处在不同的版本
[root@home git_data]# touch newtest
[root@home git_data]# git add newtest
[root@home git_data]# git commit -am "newtest"
[testing d8a3eb7] newtest
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newtest
[root@home git_data]# git log --oneline --decorate 
d8a3eb7 (HEAD, testing) newtest
c48a177 (master) ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1
#切换回master,testing分支就不再显示,正常情况下是没有newtest文件,保证master分支是线上环境的
[root@home git_data]# git checkout master
切换到分支 'master'
[root@home git_data]# git log --oneline --decorate 
c48a177 (HEAD, master) ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1
[root@home git_data]# git branch
* master
  testing

合并分支

  • 使用git merge testing命令,就可以合并testing和主分支,如果出现文件冲突,会提示冲突的文件,需要手动调整冲突部分再提交
[root@home git_data]# git merge testing
更新 c48a177..d8a3eb7
Fast-forward
 newtest | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newtest
[root@home git_data]# git log --oneline --decorate
d8a3eb7 (HEAD, testing, master) newtest
c48a177 ddd
eb42aad test2
5a78ba7 test1
eb36726 test
a9a90ba 2
d87c2e7 1
77fbe68 1
[root@home git_data]# ll
总用量 12
-rw-r--r-- 1 root root 8 2月  22 15:28 a.txt
-rw-r--r-- 1 root root 4 2月  22 15:28 b
-rw-r--r-- 1 root root 0 2月  22 15:48 newtest
-rw-r--r-- 1 root root 5 2月  22 15:28 test

删除分支

[root@home git_data]# git branch -d testing
已删除分支 testing(曾为 d8a3eb7)。
[root@home git_data]# git branch
* master