Git
一、版本控制
版本控制是一种记录若干文件内容变化,方便将来查阅特定版本修订情况的系统。换种说法是备份和记录。
1.本地版本控制系统
这种做法好处是简单, 但坏处也不少比如备份比较多或许就会混淆不同版本之间的区别. 那为了解决这个问题, 有人就开发了一个本地版本的管理系统。
2.集中化版本控制系统
本地版本控制系统能够将不同版本的文档保存下来并且借助版本记录可以很方便定位相关文件但又引入了新的问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,
而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这样做的好处是解决了人们开发协同的问题, 但是把所有的代码提交到同一台服务器上有一个很明显的问题就是单点故障, 如果这台服务器宕机了, 那所有人都不能提交代码, 还有如果这台服务器如果磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
3.分布式版本控制系统
为了解决集中化版本管理所带来的问题分布式版本管理控制系统(Distributed Version ControlSystem,简称 DVCS)就应运而生了. 在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端不只是提取出最新版的文件快照, 而是把最原始的代码仓库镜像到本地. 这样一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。所以综上来看的集中化版本控制系统是对本地版本控制系统的一次升级, 因为它加入了协同操作,分布式版本控制系统是对集中化控制系统的一次补充, 使之更加完善。
二、Git的三种状态与工作模式
文件的状态有以下三种:
三个工作区域:工作区、暂存区、Git仓库
基本的Git工作流程描述:
- 在工作区中修改某些文件。
- 对修改后的文件进行快照,放入暂存区
- 提交更新,将保存在暂存区的文件快照永久转储到Git仓库中。
三、Git命令
1.创建版本库并提交
##本地仓库初始化
git init
##查看工作目录与暂存区文件状态
git status
##添加文件到暂存区 文件/指定目录/当前目录的所有文件
git add [file]/[dir]/.
##提交文件到本地版本仓库
git commit -m ""
##查看日志
git log
2.时光穿梭机
1).修改文件与文件提交
##与版本库内容进行比较结果
git diff HEAD -- [file]
2).版本回退
##撤销操作,将误提交在暂存区的文件执行撤销
git reset HEAD
##版本记录简化输出
git log --pretty=oneline
##返回上一版本
git reset --hard HEAD^
#返回指定版本
git reset --hard [版本号]
##记录用户操作的每一次命令,查看记录在本地的HEAD和分支引用在过去指向的位置
git reflog
3).文件删除
Git世界中,Git只关注文件是否被修改(添加、更新、删除)
##若工作目录中的文件误删,可重新从版本库中检出
git checkout -- [file]
##执行删除操作
git rm [file]
3.远程仓库
1).克隆远程项目到本地
##在当前目录下克隆远程仓库
git clone [http]/[ssh]
##ssh速度较快
2).将本地库推送到远程仓库
- 创建本地版本库并提交文件到本地库
- 使用GitHub创建远程库
- 推送本地Git版本库文件到远程库
使用Https比较简单,使用SSH加密方式是Git建议的一种推送,时间上与响应上效率都更高。
SSH推送方式配置:
##1.本地Git客户端生成SSH公钥和私钥
ssh-keygen -t rsa -C "GitHub账户邮箱"
##2.找到公钥在GitHub中配置
##3.检查测试连接
ssh -T git@github.com
##4.使用SSH执行远程推送操作
##5.绑定远程仓库
git remote add origin [SSH]
##6.远程推送
git push -u origin master
4.Git分支操作
开发企业项目中在使用Git 或者其他类似版本控制软件对项目版本进行管理时,多人合作的项目在开发时通常不会直接在主干master 上进行操作,而是重新开辟新的分支,在新的分支上进行开发 调试 等操作,当项目调试通过时才会将分支项目的代码合并到主干中,这是在实战中比较好的一种策略,特别是多人协同开发一个项目的情况下尤其明显。
1).本地分支创建、合并、重命名与删除
##切换到指定分支
git checkout branch
##新建分支并切换到新建分支
git checkout -b [new_branch]
##删除指定分支
git branch -d branch
##查看所有分支,并且*号标记为当前分支
git branch
##合并分支
git merge branch
##分支重命名 -M强制重命名 -m重命名
git branch -M | -m [oldbranch] [newbranch]
2).分支push和pull操作
##查看本地与远程分支
git branch -a
##推送本地分支到远程
git push origin [branch_name]
##删除远程分支(本地分支还保留)
git push origin :[remote_branch]
##拉去远程指定分支并在本地创建分支
git checkout -b [local_branch] origin/[remote_branch]
3).分支操作冲突出现与解决
a.本地分支操作冲突
- 分支1下修改文件并执行提交操作
- 主干下修改同一文件并执行操作提交
- 执行合并操作,此时发现git在合并中产生冲突
- 冲突后,对文件内容进行修改
b.多人协同操作冲突
- C1客户端本地修改某分支下的文件并执行提交操作,执行远程推送。
- C2客户端在本地同样修改了该分支下的同一文件并执行提交以及远程推送
- 在推送操作时,冲突出现,
- 解决方式:先执行pull拉取,查看冲突文件内容,在本地先处理冲突,后将文本进行合并提交,推送远程。
5.标签管理
##新建标签 默认为HEAD
git tag [tagname]
##添加标签并指定标签描述信息
git tag -a [tag_name] -m "描述信息"
##查看所有标签
git tag
##删除一个本地标签
git tag -d [tag_name]
##推送本地标签到远程
git push origin [tag_name]
##推送全部未推送过的本地标签到远程
git push origin --tags
##删除一个远程标签
git push origin :[refs/tags/tag_name]