一、版本控制工具概述
1. 版本控制
工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。
思想:版本控制
实现:版本控制工具
2.版本控制工具功能
1.协同修改
2.多人并行不悖的修改服务器端的同一个文件。
3.数据备份
4.不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
5.版本管理
6.在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面SVN采用的是增量式管理的方式,而Git采取了文件系统快照的方式。
7.权限控制
8.对团队中参与开发的人员进行权限控制。
9.对团队外开发者贡献的代码进行审核——Git 独有。
10.历史记录
11.查看修改人、修改时间、修改内容、日志信息。
12.将本地文件恢复到某一个历史状态。
13.分支管理
14.允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
3.版本控制工具
1)集中式版本控制工具
CVS、SVN、VSS……
2)分布式版本控制工具
Git、Mercurial、Bazaar、Darcs……
二、Git工具概述与安装
1.Git的简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而是一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必有服务器端软件支持。
2.Git简史
3.Git 官网和 Logo
官网地址:https://git-scm.com/
4.Git优势
1.大部分操作在本地完成,不需要联网
2.完整性保证
3.尽可能添加数据而不是删除或修改数据
4.分支操作非常快捷流畅
5.与 Linux 命令全面兼容
5.Windows下Git安装
6.Centos下Git安装
#1.安装
[root@m01 ~]# yum -y install git
#2.查看Git版本
[root@m01 ~]# git --version
git version 1.8.3.1
#3.修改基本配置
[root@m01 ~]# git config --global user.name "jh"
[root@m01 ~]# git config --global user.email "974089352@qq.com"
#4.查看配置
[root@m01 ~]# git config -l
user.name=jh
user.email=974089352@qq.com
三、Git仓库概述
git仓库本地库对应的就是一个目录,这个目录中的所有文件被git管理起来。以后会将一个项目的根目录,作为仓库。仓库中的每个文件的改动都由git跟踪。
1.Git结构
2.Git 和代码托管中心
代码托管中心的任务:维护远程库
1.局域网环境下
GitLab 服务器
2.外网环境下
Gitee
GitHub
码云
3.Git本地库和远程库
1)团队内部协作
2)跨团队协作
四、Git命令行操作
1.本地库初始化
#1.新建仓库
[root@m01 ~]# mkdir test
#2.初始化空的 Git 版本库
[root@m01 ~]# cd test/
[root@m01 ~/test]# git init
Initialized empty Git repository in /root/test/.git/
#3.查看仓库
[root@m01 ~/test]# ll -a
total 0
drwxr-xr-x 3 root root 18 Dec 22 19:33 .
dr-xr-x---. 4 root root 215 Dec 22 19:33 ..
drwxr-xr-x 7 root root 119 Dec 22 19:33 .git
2.设置签名
1.形式
用户名:hui.jin
Email 地址:hui.jin@atom-intelligence.com
2.作用:
区分不同开发人员的身份
3.辨析:
这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关 系。
4.命令
1)项目级别/仓库级别:仅在当前本地库范围内有效
[root@m1 ~/test]# git config user.name hui.jin
[root@m1 ~/test]# git config user.email hui.jin@atom-intelligence.com
[root@m1 ~/test]# cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[user]
name = hui.jin
email = hui.jin@atom-intelligence.com
信息保存位置:./.git/config 文件
2)系统用户级别:登录当前操作系统的用户范围
[root@m1 ~]# git config --global user.name jin.hui
[root@m1 ~]# git config --global user.email jin.hui@atom-intelligence.com
[root@m1 ~]# git config -l
user.name=jin.hui
user.email=jin.hui@atom-intelligence.com
信息保存位置:~/.gitconfig 文件
3)级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别 的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
五、Git基本操作
1.创建远程仓库
#1.Github上创建仓库
#2.Gitee上创建仓库(以此为例)
选择语言,其他按照自己需求的来.
2.链接远程仓库
1)通过HTTPS连接远程仓库
[root@m01 ~/test]# git remote add origin https://gitee.com/jhno1/oldboy-jenkins.git
ps: 点击克隆/下载选择HTTPS方式,复制链接
2)通过ssh方式连接
1.生成公钥对,一直回车即可
[root@m01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CLeRI42hKnREMfbbwLYXmrpmx4NvYHHJvgI8NMPkDaM root@m01
The key's randomart image is:
+---[RSA 2048]----+
| .*o |
| +o.++ . |
|=.=.==B. |
|EB.o.BB=. |
|= o +=ooS |
|.+ o... |
| +.+ . |
| =.* |
o.=.. |
+----[SHA256]-----+
2.查看公钥
[root@m01 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1EV7n0r+ma/6Lj5FKM1QaWy2w7au2qvvFY/+bmhcFv86b
XXn3AVKgWhSrzqZPZzSkiuFAATzXqjGl8WJ9EYBamCgYqV/bzysS5BPI2f31zjkgX2XKNzcMHzXKw6GEG4X0
0qVmwJq2ajSxSrnaLzZRpV9lTdDtSO8WIVZGxWRPiU3aZvq/tFW08fQBKKcV5AlY04WVlRCZZKpKhZ1opmGK
oqmJ6nh/vJVeCohvrdMhjDtj6zvciHf3sJGAxY6zmH6PaeV+lZS+3pbGR24KIEdARoJuCpSw2NbBo40dn9Mn
Apsl0K+l2L57Aw+kvmXXd886ZnIIMLwopKumEM4n+xeB root@m01
3.复制公钥配置到Gitee仓库
# 管理--> 部署公钥管理-->添加公钥
4.返回克隆下载复制ssh链接执行
[root@m01 ~/test]# git remote add origin git@gitee.com:jhno1/oldboy-jenkins.git
5.查看远程连接
[root@m01 ~/test]# git remote -v
origin https://gitee.com/jhno1/oldboy-jenkins.git (fetch)
origin https://gitee.com/jhno1/oldboy-jenkins.git (push)
6.删除远程连接
[root@m01 ~/test]# git remote rm origin
3.Git同步远程仓库内容
# 当本地没有代码仓库时
[root@m01 ~/test]# git clone https://gitee.com/jhno1/oldboy-jenkins.git
Cloning into 'oldboy-jenkins'...
Username for 'https://gitee.com': jhno1
Password for 'https://jhno1@gitee.com':
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
# 当本地已经有了代码仓库,现在需要同步远程仓库内容
[root@m01 ~/test]# git pull origin master
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From gitee.com:jhno1/oldboy-jenkins
4.Git本地文件推送到远程仓库
1)查看工作区、暂存区的状态
#1.查看工作区、暂存区的状态
[root@m01 ~/test]# git status
# On branch master
# Untracked files:
(use "git add <file>..." to include in what will be committed)
#
# oldboy-jenkins/
nothing added to commit but untracked files present (use "git add" to track)
2)将工作区的“新建/修改”添加到暂存区
#1.创建新文件
[root@m01 ~/test]# cd oldboy-jenkins/
[root@m01 ~/test/oldboy-jenkins]# vim 1.txt
<h1> 你是</h1>
"1.txt" [New] 1L, 17C written
#2.将文件添加到暂存区
[root@m01 ~/test/oldboy-jenkins]# git add 1.txt
[root@m01 ~/test/oldboy-jenkins]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 1.txt
3)将暂存区的内容提交到本地库
#1.提交更改,添加备注信息(此时将暂存区的信息提交到本地仓库)
[root@m01 ~/test/oldboy-jenkins]# git commit -m "zhehsi。。。"
[master 729e679] zhehsi。。。
1 file changed, 1 insertion(+)
create mode 100644 1.txt
4)推送到远程仓库
#1. 将本地仓库的文件push到远程仓库(若 push 不成功,可加 -f 进行强推操作)
[root@m01 ~/test/oldboy-jenkins]# git push origin master
Username for 'https://gitee.com': jhno1
Password for 'https://jhno1@gitee.com':
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/jhno1/oldboy-jenkins.git
c671512..729e679 master -> master
5.Git查看历史记录
1)查看历史,列出历史提交记录
#1.用于显示仓库中所有 commit 的信息。默认情况下,该命令会显示仓库中每个 commit 的:SHA 作者 日期 消息
[root@m1 ~/test]# git log
多屏显示控制方式:
空格向下翻页 b 向上翻页
q 退出
2)查看历史记录的简洁的版本
#1.选项用于更改 git log 显示信息的方式。此命令:
每行显示一个 commit
显示 commit 的 SHA 的前 7 个字符
显示 commit 的消息
[root@m1 ~/test]# git log --oneline
#2.用 --graph 选项,查看历史中什么时候出现了分支、合并
[root@m1 ~/test]# git log --oneline --graph
#3.查找指定用户的提交日志
[root@m1 ~/test]# git log --author=jin.hui --oneline -5
3)逆向显示所有日志
#1.用 '--reverse'参数来逆向显示所有日志
[root@m1 ~/test]# git log --reverse --oneline
4)指定日期显示日志
#1.指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。
例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交)
[root@m1 ~/test]# git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
5)更改历史信息的显示方式
#1.git log -p(--patch) 用来更改git log 显示信息的方式。此命令会向默认输出中添加以下信息:
显示被修改的文件
显示添加/删除的行所在的位置
显示做出的实际更改
[root@m1 ~/test]# git log -p(--patch)--oneline
6)查看所有分支的所有操作记录
#1.查看所有分支的所有操作记录,(包括已经被删除的 [commit](https://so.csdn.net/so/search?q=commit&spm=1001.2101.3001.7020) 记录和 reset 的操作)
[root@m1 ~/test]# git reflog
HEAD@{移动到当前版本需要多少步}
1.基于索引值操作[推荐]
git reset --hard [局部索引值]
[root@m1 ~/test]# git reset --hard a6ace91
2.使用^符号:只能后退
[root@m1 ~/test]# git reset --hard HEAD^
注:一个^表示后退一步,n 个表示后退 n 步
3.使用~符号:只能后退
[root@m1 ~/test]# git reset --hard HEAD~n
注:表示后退 n 步
6.Git reset命令参数对比
1)--soft参数
1.仅仅在本地库移动 HEAD 指针
2)--mixed参数
1.在本地库移动 HEAD 指针
2.重置暂存区
3)--hard参数
1.在本地库移动 HEAD 指针
2.重置暂存区
3.重置工作区
7.删除文件并找回
1.前提:删除前,文件存在时的状态提交到了本地库。
2.操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
8.比较文件差异
# 将工作区中的文件和暂存区进行比较
git diff [文件名]
[root@m01 ~/test/oldboy-jenkins]# git diff 1.txt
# 将工作区中的文件和本地库历史记录比较
git diff [本地库中历史版本] [文件名]
# 查看所有变化
[root@m01 ~/test/oldboy-jenkins]# git diff