文章目录
为什么需要?
-
防止文件丢失
-
保存各个版本
有了又怎么样?
-
自动生成备份
-
随时回滚
-
知道改动的地方
常见的版本管理工具
- svn
集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无法进行提交或备份文件。
- git
分布式的版本控制系统,在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用Git。当然为了习惯及团队协作,会将本地数据同步到Git服务器或者GitHub等代码仓库。 #一般只做代码级的共享,团队合作搭建gitlab/GitHub
git安装配置
-
Git分布式版本控制系统最佳实践 - 老男孩教育博客 http://blog.oldboyedu.com/git/
-
系统环境 :CentOS7.2 防火墙和selinux关闭 (适用于Linux,Windows下载git软件安装)
systemctl disable firewalld
vim /etc/selinux/config
getenforce
- 安装Git
yum -y install git #系统也可能自带了
- Git全局配置(配置一次)
git config --global user.name "zy" #配置git使用用户
git config --global user.email "zhangyao@oldboyedu.com" #配置git使用邮箱
git config --global color.ui true #语法高亮
git config --list # 查看全局配置
ssh-keygen -t rsa -C "your@mail.com" #生成秘钥,上次公钥,也可以不带邮箱,就没有邮箱认证了
初始化GIT工作目录
mkdir git_data
cd git_data/
# 初始化
git init
# 查看工作区状态
git status
常规使用(创建数 据-提交数据)
touch README
git status
git add README ##所有工作都添加到暂存区,一天之后才添加到仓库
git status
git commit -m 'first commit' #→git commit提交暂存文件至版本库
GIT COMMIT –A参数
- 添加新文件
git add . 添加到暂存区域
git commit 提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看
- 修改或删除原有文件
常规方法
git add * #添加到暂存区域
git commit #提交到git仓库
简便方法
git commit -a -m "注释信息,关于本次提交的说明,方便自己或他人查看" -a 表示直接提交
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are
not affected.
删除暂存区数据
-
没有添加到暂存区的数据直接rm删除即可。
-
已经添加到暂存区数据:
git rm --cached database
git rm --cached file
#→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
git rm -f database
git rm -f file
#→将文件数据从git暂存区和工作目录一起删除
# 服务器存储的目录是密文
重命名暂存区数据
-
没有添加到暂存区的数据直接mv/rename改名即可。
-
已经添加到暂存区数据:
git mv README NOTICE #改名
git commit -a -m 'modifief README file' #将git add 和git commit的功能二合一
- 注意:git不会提交空目录
查看历史记录
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哈希字串与提交着的姓名,其他格式见备注。
还原历史数据
Git服务程序中有一个叫做HEAD的版本指针(软链接),当用户申请还原数据时,其实就是将HEAD指针指向到某特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD,上上一个版本则会叫做HEAD^,当然一般会用HEAD~5来表示往上数第五个提交版本。
git reset --hard HEAD^ #→还原历史提交版本上一次
git reset --hard HEAD~5
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
[root@centos7 git_data]# git reset --hard 0bdf2e7
HEAD is now at 0bdf2e7 modified README file
[root@centos7 git_data]# git reset --hard V1.0
HEAD is now at a66370a add oldboy dir
对比数据
git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改后,再把它提交到仓库就放⼼多了。
git diff README
分支结构
在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。
那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。#一般开发没权改动master,只有管理员可以改动
所以团队的合作分支看起来会像下图那样。#专门负责某一项功能,但不修改同一个配置文件
创建分支
git branch #查看当前分支
git branch linux #→创建分支
git checkout linux #→切换分支
git checkout -- README #一键还原,直接将git仓库的文件覆盖当前文件,危险
git branch #→查看当前分支情况,当前分支前有*号 • 测试在linux分支修改文件并提交到git仓库,最后切换回master分支,你会发现什么呢?
合并分支
在其他分支做的操作不会相互影响,且一般只会在主分支合并,其他的都不需要合并
想把linux的工作成果合并到master分支上
先切换到master分支
git merge linux #→合并Linux分支至master
查看合并的文件
git branch -d linux #→确认合并完成后,可以放心地删除Linux
分支冲突
- 同时修改master和linux分支同一个文件并提交,最后merge。
- 查看合并结果
- 如何解决?
- 冲突原因:修改了同目录同文件同一行
- 解决方法:人工选择想要保留的内容
实验:
创建新的分支
git branch linux
在master分支修改文件
echo master >>README
git commit -a -m "this is master commit"
切换到Linux分支,并修改文件
git checkout Linux
echo Linux >>README
git commit -a -m "this is Linux commit" #可以正常提交
#主分支和Linux的仓库是分开的
#切换到主分支
git checkout master
git merge Linux #无法合并
cat README #会把变更的信息写到一个文件,让你选择需要保留的内容,在主分支上改
#可以把不需要的删掉,重新提交
#修改了同名目录同名文件同一行会造成冲突
WINDOWS客户端使用
-
前面讲的都是linux客户端,在讲讲windows客户端使用,安装Git-2.10.0-64-bit。
-
windows的git,本质是windows上的linux系统
-
TortoiseGit-2.2.0.0-64bit 给git加外壳,svn客户端的git版本
GIT服务器
- 前面我们已经知道Git人人都是中心,那他们怎么交互数据呢?
- 使用GitHub或者码云等公共代码仓库
- 使用GitLab私有仓库