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 [版本号]
git reflog
3).文件删除 Git世界中,Git只关注文件是否被修改(添加、更新、删除)
git checkout -- [file]
git rm [file]
3.远程仓库
1).克隆远程项目到本地
git clone [http]/[ssh]
2).将本地库推送到远程仓库
- 创建本地版本库并提交文件到本地库
- 使用GitHub创建远程库
- 推送本地Git版本库文件到远程库
使用Https比较简单,使用SSH加密方式是Git建议的一种推送,时间上与响应上效率都更高。 SSH推送方式配置:
ssh-keygen -t rsa -C "GitHub账户邮箱"
ssh -T git@github.com
git remote add origin [SSH]
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
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.标签管理
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]
|