什么是Git
版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统.记录文件的所有历史变化,随时可恢复到任何一个历史状态.
其他常见版本管理工具
集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无法进行提交或备份文件。
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常规使用
创建数据-提交数据
Git四种状态
创建测试文件
[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分支
分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了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
最后一次更新于2020-03-02 14:04
0 条评论