Git 简介
官网:https://git-scm.com
Git 是一个分布式版本控制软件,最初由林纳斯●托瓦兹(Linus Torvalds)创作,于 2005 年以 GPL 发布。最初目的是为更好地管理 Linux 内核开发而设计。
GIt 官方中文手册 https://git-scm.com/book/zh/v2
Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。一个原始 Git 版本仓库,可以让其他主机克隆这个原始版本仓库,从而使得一个 Git 版本仓库可以同时分布到不同的主机上,并且每台主机的版本库都是一样的,并没有主次之分,极大的保证了数据的安全性,并使得用户能够自主选择 Git 服务器推送文件了,其实部署一个 Git 服务器是一件非常简单的事情。
如上所述,作为一个分布式的版本控制系统,在 Git 中并不存在主库这样的概念。每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。GitHub 可以提供给用户空间创建 Git 仓储,保存用户的一些数据文档或者代码等。
GitHub 作为开源代码库以及版本控制系统,目前拥有 140 多万开发者用户。随着越来越多的应用程序转移到了云上,GitHub 已经成为了管理软件开发以及发现已有代码的首选方法。
GitHub 可以托管各种 Git 库,并提供一个 Web 界面,但与其他向 SourceForge 或 Google Code 这样的服务不同,GitHub 的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单,首先点击项目站点的 "fork" 的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的"pull request" 机制向项目负责人申请代码合并。
GitLab 是一个基于 Git 的项目管理软件,用于仓库管理系统的开源项目。使用 Git 作为代码管理工具, 并在此基础上搭建起来 Web 服务。
Git,GitHub,GitLab 都是基于 Git的,可以说是 Git 的衍生品。
Git 功能特性
● 克隆数据库版本:从服务器上克隆数据库(包括代码和版本信息)到本机上;
● 提交代码:在本机上自己创建的分支上提交代码;
● 合并分支:在本机上合并分支;
● 拉取合并分支:新建一个分支,把服务器上最新版的代码 Fetch 下来,然后跟自己的最分支合并;
● 代码冲突解决:一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
案例环境
服务器 | IP地址 | 主机名 | 角色 |
CentOS7.5 | 192.168.200.123 | gitlab | Git 服务器 |
CentOS7.5 | 192.168.200.124 | git | Git 服务器 |
安装 Git
初始环境
systemctl stop firewalld
iptables -F
setenforce 0
编译安装 Git
编译安装可以安装较新版本的 Git
Git 下载地址:https://github.com/git/git/releases
安装依赖关系
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf
编译安装
wget https://github.com/git/git/archive/v2.22.0.tar.gz
tar xf git-2.22.0.tar.gz -C /usr/src/
cd /usr/src/git-2.22.0/
make configure
./configure --prefix=/usr/local/git && make && make install
ln -sf /usr/local/git/bin/git /usr/bin/
git --version
初次运行 Git 前的配置
命令集
git config --global user.name "crushlinux" #配置 Git 使用用户
git config --global user.email "crushlinux@163.com" #配置 Git 使用邮箱
git config --global color.ui true #语法高亮
git config --list #查看全局配置
配置过程
git config --global user.name "2567"
git config --global user.email "wxl25678@163.com"
git config --global color.ui true
git config --list
生成的配置文件
cat .gitconfig
获取帮助
使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
● git help config
● git config --help
● man git config
初始化及获取 Git 仓库
Git 服务器操作
mkdir git_data.git
cd git_data.git/
git --bare init
Git 客户端操作
ssh-keygen
ssh-copy-id 192.168.200.123
git clone root@192.168.200.123:/root/git_data.git #克隆
git status #查看
Git 命令常规操作
常用命令说明
add #添加文件内容至暂存区(索引)
bisect #通过二分查找定位引入 bug 的变更
branch #列出、创建或删除分支
checkout #检出一个分支或路径到工作区
clone #克隆一个版本库到一个新目录
commit #记录变更到版本库(本地)
diff #显示提交之间、提交和工作区之间等的差异
fetch #从另外一个版本库下载对象和引用
grep #输出和模式匹配的行
init #创建一个空的
Git #版本库或重新初始化一个已存在的版本库
log #显示提交日志
merge #合并两个或更多开发历史
mv #移动或重命名一个文件、目录或符号链接
pull #获取并合并另外的版本库或一个本地分支
push #更新远程引用和相关的对象
rebase #本地提交转移至更新后的上游分支中
reset #重置当前 HEAD 到指定状态
rm #从工作区和索引中删除文件
show #显示各种类型的对象
status #显示工作区状态
tag #创建、列出、删除或校验一个 GPG 签名的 tag 对象
Git 原理示意图
checkout 有两个功能,一个是从本地仓库把代码检出到工作区,另一个是用来切换分支
添加新文件
git add 文件名 #添加到暂存区
git commit -m 文件名 #提交到本地仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看
git commit -a -m #提交到本地仓库 只能对文件的修改进行操作
git push root@192.168.200.111:/root/git_data.git #提交到远程仓库
删除 git 内的文件
git rm --cached database #将文件从 git 暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
git rm -f database #将文件数据从 git 暂存区和工作目录一起删除
git reset HEAD 文件名 #将文件数据从 git 暂存区记录中移除
注释:
只在本地目录:
rm -rf test.txt
添加到了暂存区,想删除暂存区记录并保留本地文件
git add test.txt
git rm --cached test.txt 或 git reset HEAD test.txt
添加到了暂存区,想删除暂存区记录并删除本地文件
git add test.txt
git rm -f test.txt
重命名暂存区数据
没有添加到暂存区的数据直接 mv/rename 改名即可
已经添加到暂存区的数据:git mv 原文件名 新文件名
查看历史记录
git log #查看提交历史记录
git log -2 #查看最近几条记录
git log -p -1 # -p 显示每次提交的内容差异,例如仅查看最近一次差异
git log --stat -2 # --stat 简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息
git log --pretty=oneline # --pretty 根据不同的格式展示提交的历史信息
git log --pretty=fuller -2 # 以更详细的模块输出提交的历史记录
git log --pretty=fomat:"%h %cn" # 查看当前所有提交记录的简短 SHA-1 哈希字串与提交者的姓名
使用 format 参数来制定具体的输出格式
%s # 提交说明
%cd # 提交日期
%an # 作者的名字
%cn # 提交者的姓名
%ce # 提交者的电子邮件
%H # 提交对象的完整 SHA-1 哈希字串
%h # 提交对象的简短 SHA-1 哈希字串
%T # 树对象的完整 SHA-1 哈希字串
%t # 树对象的简短 SHA-1 哈希字串
%P # 父对象的完整 SHA-1 哈希字串
%p # 父对象的简短 SHA-1 哈希字串
%ad # 作者的修订时间
还原历史数据
Git 服务程序中有一个叫做 HEAD 的版本指针,当用户申请还原数据时,其实就是将 HEAD 指针指向到某个特定的提交版本,但是因为 Git 是分布式版本控制系统,为了避免历史记录冲突,故使用了 SHA-1 计算出十六进制的哈希字串来区分每个提交版本,另外默认的 HEAD 版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫 HEAD^,上上一个提交版本会叫做 HEAD^^,当然一般会用 HEAD~5 来表示往上数第五个提交版本。
git reset --hard hash
git reset --hard HEAD^ #还原历史提交版本上一次
git reset --hard 3de15d4 #找到历史还原点的 SHA-1 值后,就可以还原(值不写全,系统会自动匹配)
还原未来数据
什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是 git log 已经找不到这个版本了。
git reflog #查看未来历史更新点
标签使用
前面回滚使用的是一串字符串,又长又难记。
git tag v1.0 #当前提交内容打一个标签(方便快速回滚),每次提交都可以打个 tag。
git tag #查看当前所有的标签
git show v1.0 #查看当前1.0版本的详细信息
git tag v1.2 -m "version 1.2 release is test" #创建带有说明的标签,-a 指定标签名字,-m 指定说明文字
git tag -d v1.0 #我们为同一个提交版本设置了两次标签,删除之前的 v1.0
对比数据
git diff 可以对比当前文件与仓库已保存文件的区别,知道了对 NOTICE 作了什么修改后,再把它提交到仓库就放心多了。
分支结构
在实际的项目开发中,尽量保证 master 分支稳定,仅用于发布新版本,平时不要随便直接修改 master 分支里面的数据文件
干活都在 dev 分支上。每个人从 dev 分支创建自己个人分支,开发完合并到 dev 分支,最后 dev 分支合并到 master 分支。所以团队的合作分支看起来会像下图那样。
分支切换
git branch 分支名 #创建分支
git branch #查看分支
git checkout 分支名 #切换分支
合并代码
git merge 分支名 #合并分支
删除分支
因为之前已经合并了分支,所以现在看到它在列表中。在这个列表中分支名字前没有 * 号 的分支通常都可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
查看所有包含未合并工作的分支,可以运行 git branch --no-merged
如果真的想要删除分支并丢弃掉那些工作,如同帮助信息里所指出的,可以使用-D选项 强制删除它。
Windows 上Git的使用
windows 上 git 软件网站 https://git-for-windows.github.io
软件下载地址
https://github.com/git-for-windows/git/releases/download/v2.22.0.windows.1/Git-2.22.0-64-bit.exe
GitHub 托管服务
GitHub 顾名思义是一个 Git 版本库的托管服务,是目前全球最大的软件仓库,拥有上百万的开发者用户,也是软件开发和寻找资源的最佳路径,GitHub 不仅可以托管各种 Git 版本仓库,还拥有了更美观的web 界面,您的代码文件可以被任何人克隆,使得开发者为开源项贡献代码变得更加容易,当然也可以付费购买私有库,这样高性价比的私有库真的是帮助到了很多团队和企业。
注册GitHub
浏览器访问 GitHub 官网:https://github.com/,点击 Sign up 进行注册
添加密钥
ssh-keygen
[root@client ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWJtMx/u9a99MW1iMerj5+R2qlMyDXH0uFiebr0EFd5zUf5jjzX+HJC+gERfeVpD0MfoqHOjXtcoEbopXX7ntD0xvcH7j1FI5OqeWtvts9C3AxXYSjH1d2Bv2wfG8LNHGVovK3J9UKbmR3e1ygmRzOpQSSHGUL+sImTWH8dU8qCPuPQL0HjZMWFODCS8tteyKP9k8IyrNhZBiX4BvYd0klMqTLtM47hZVRmmEgw50iEO63jtJa+zPGXlus6SG5/sUFGMkLHlLPvzW/3gO3Eg8FzLrTR2tusTdjW3ZkxCWzxnnIax5OON1OXsJiGONbzPPBbxzxqXaZ9ehlG8G6HDyb root@localhost.localdomain
git 常用命令
我从master分支创建了一个issue5560分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是'Everything up-to-date',发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的master分支,因为master分支默认指向了origin master 分支,这里要使用git push origin issue5560:master 就可以把issue5560推送到远程的master分支了。
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。$ git push origin test:master // 提交本地test分支作为远程的master分支 //好像只写这一句,远程的github就会自动创建一个test分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。
$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心
git删除文件
rm add2.txt
git rm add2.txt
git commit -m "rm test"
git push web
-----------at server
cd /var/www/foo.git;sudo git update-server-info
------------检查删除效果
cd;rm foo3 -rf;git clone http://[某ip]/foo.git foo3
------------更新已经存在的local code
cd;cd foo2
git remote add web [某user]@[某ip]:/var/www/foo.git/
git pull web master