GIT
GIT简单介绍
GIT:是一款开源的分布式版本控制工具
在所有的分布式的版本控制工具中,git是最快、最简单、最流行的
-
git起源
- 作者:Linux之父 ,Linux Benedict Torvalds,2005年
- 开始Linux是用Bitkeeper管理的,开发git仅仅是为了辅助Linux内核的开发(管理源代码),10天的时间就把git写完了,第一次导入到git的代码大约有5000万行的代码
-
git现状
- 在国外已经非常普及
- 越来越多的开源项目已经转移到git上面
- 比如:php
-
其他版本控制工具
-
CVS
- 最早的开源、免费的集中式版本控制工具
- 自身设计有问题,会造成提交文件不完整,版本库莫名其妙的损害
-
SVN
- 修正了CVS的一些稳定性问题,是目前用的最多的集中式版本控制工具
-
ClearCase
- 收费的集中式版本控制工具,安装比Windows还大,运行比蜗牛还慢
- 人傻钱多的公司,世界五百强
-
VSS
- 微软的集中式版本控制工具,集成在Visual Studio中
- 这个工具很好用,比Xcode相对智能
-
-
集中式版本控制和分布式版本控制的区别
-
集中式版本控制
- 仓库放在服务器端
- checkout获得仓库,commit提交
- 不管有多少个终端,所有的操作都需要和服务器进行交互
- 仓库是集中式的放到服务器上,做任何操作都需要连接上服务器,没有网络就不能连接了,在公司里面做开发,一般是局域网,只能在公司加班,在公司才能连接服务器,才能提交
-
分布式版本控制
- 可以把在自己的电脑理解成服务器
- 共享仓库放在一个远程的服务器上的
- 本地电脑上也有一个仓库,可以先把操作提交到本地的仓库,push /pull,操作的时候可以先不用连接上服务器,可以先提交到本地仓库,等有网络的时候,可以一次性提交到远程的服务器上
-
- GIT和SVN对比
- 速度:在很多情况下,git的速度远远比SVN块
- 结构:SVN是集中式管理,git是分布式管理
- 其他:
- svn使用分支比较笨拙
- git可以轻松拥有无限个分支
- svn必须要联网才能正常工作
- git支持本地版本控制工作
- 旧版本的svn会在每一个目录放置一个.svn
- git只会在根目录拥有一个.git
- 工作流程
- SVN
- 服务器端
- 客户端 checkout commit update
- GIT
- 共享版本库
- 客户端
- clone 下载到本地
- 可以在本地修改,可以在本地提交commit,把本地的版本库提交到共享的版本库push
- 获得最新的共享版本库信息pull
- SVN
- 最大的区别在于:在分布式下开发者可以本地提交,每个开发者机器上都有一个服务器的数据库
GIT的初始化和访问设置
- 在本地初始化一个本地的git仓库
- 本地创建一个文件夹GIT
- GIT文件夹里新建文件夹
- manager
- demo初始化一个本地git仓库
- cd 来到demo路径
- git init
- 生成了一个.git的隐藏的文件夹
- manager
- 对该git仓库进行配置(用户名和邮箱)
- 用户名 $ git config user.name "manager"
- 邮箱 $ git config user.email "manager@126.com"
- 输入命令行
- 打开config查看配置文件
- 配置一个全局的用户名和邮箱
- 系统里面会有很多仓库,使用全局的就不用每个仓库都设置
- $ git config -- global user.name "xiaomage"
- $ git config -- global user.email "xiaomage@126.com"
- 打开.gitconfig
GIT仓库项目初始化操作
- 项目经理创建一个文件main.m
- $ touch main.m
- 查看git状态
- $ git status
- 查看是否被git管理
- 红色:表示该文件并没有被git仓库管理
- 把main.m文件 提交到git仓库的暂缓区
- 暂缓区的概念
$ git add main.m
- 查看状态
- $ git status
- 绿色:表示该文件已经被添加到git的暂缓区中
- 注意:文件的更改必须要先添加到暂缓区里面,才能从暂缓区提交
- 先把main.m提交到本地的版本库中
$ git commit - m "注释" main.m
- master:表示当前是主干
- 修改文件的内容
- echo "I am Main" >>main.m
- cat main.m
- 重新查看文件状态
$ git status
- 红色:表示被修改modified,当前的修改,没有在暂缓区中
- 把本地的修改提交到暂缓区中
- $ git add main.m
- 查看文件状态
- 把暂缓区中的修改提交到本地的版本库中
- $ git commit - m "修改了main文件"main.m
- 一个文件被修改了,一个文件被插入
- 结论:之前使用SVN的时候,只有新创建的文件才需要add操作,修改文件是不需要进行add操作的,但是在git中,不管是新创建文件,还是修改了某个文件都需要再做一次add操作,就是把修改提交到暂缓区
GIT工作原理
- 工作区(working directory)
- 仓库文件夹里除了.git目录以外的内容
- 版本库(Repository)
- .git目录,用于存储记录版本信息
- 暂缓区(stage)
- 分支(master):git自动创建的第一个分支
- HEAD指针:用于指向当前分支
- HEAD指向谁,谁就是当前的分支
- git add 和git comit 原理
- git add:把文件修改或者新添加的文件添加到暂缓区
- git commit :把暂缓区的所有内容提交到当前分支
GIT起别名的操作
- SVN简写
- update - up
- status - st
- checkout - co
- commit - ci
- remove - rm
- GIT
- GIT里面没有简写
- git -- help
- git提供了更加强大的功能,可以重命名
- $ git config alias.st "status"
- 相当于status == st
- $ git config alias.ci "commit"
- commit == ci
- $ git config alias.ci "commit - m"
- commit - m == ci
- 别名可以随便起,但是不能有中文
- 起的别名在config配置文件里面
- 上面配置的只是当前的仓库,在其他的仓库中这些简写是不可用的
- 全局的别名
- $ git config -- global alias.st "status"
GIT删除文件
- cd
- ls -la
- 删除文件
- 项目经理需要删除文件
- $ git rm 文件名称1 文件名2
- 删除操作在工作区里面进行的
- 项目经理需要删除文件
- 查看文件的状态,是绿色的
- $ git status
- 绿色:该修改已经被提交到暂缓区里面,不需要add操作
- 把删除操作提交奥本地的版本库
- $ git commit- m "删除文件"
- 一个文件被修改,一个文件被删除
查看版本信息
- SVN
- log
- GIT查看版本信息(基本版)
- $ git log
- :表示没有显示完全,按下箭头就可以查看后面的信息
- 版本信息里有什么内容
- 注释
- 谁修改的
- 什么时候修改的
- commit bf78……后面的内容是版本号
- 散列计算得到的,sha
- 散列值是版本号
- 按住Q退出
- CIT查看版本信息(加强版)
- 在之前的基础上还可以查看版本回退信息
- $ git reflog
- 更简洁
- HEAD
- commit后面是注释
- 最前面的是不完整的版本号,只有前七位
- 可以看到版本回退信息,直接log是看不到的
版本回退的两种情况
- 本地仓库修改了内容,但是修改还没有提交到版本库(相当于取消修改)
- $ git reset -- hard HEAD
- ls - la
- echo
- cat
- git status
- git add
- git reset -- hard HEAD
- 本地仓库修改了内容,并且修改已经被提交到版本库(回退到以前的版本)
$ git reset -- hard HEAD^回退到上一个版本
$ git reset --hard HEAD^^回退到上两个版本
$ git reset -- hard HEAD ~ N 回退到上N个版本
-
$ git reset -- hard 五位数字的版本号 指向任意的版本
- 拷贝前面五位数
创建共享版本库并初始化项目(忽略操作)
- 创建共享版本库
- 可以安装在服务器端 非常复杂(后台)
- 可以安装在一个文件夹里面
- 安装在U盘里面(自己查看资料)
- 把git远程仓库,托管在一些大型的网站上面(github/oschina)
- 在桌面创建一个文件夹(路径不能有中文), 把远程仓库把它安装在该文件夹中
- 先初始化一个远程仓库
- 初始化本地和初始化远程仓库区别?
- 初始化远程仓库 git -- bare init
- 本地仓库有一个.git文件,远程的共享仓库,没有.git文件
- 远程仓库bare= true ;本地仓库bare = faulse
- 创建一个空的文件夹(项目经理的客户端),项目经理连接上共享版本库,然后把共享版本库下载到本地
- $ git clone 仓库路径
- 项目经理配置本地仓库
- 设置用户名和邮箱
- $ git config user.name "manager"
- $ git config user.email "manager@qq.com"
- 打开config文件查看
- 创建一个忽略文件,进行忽略处理
- 新建一个文件$ touch .gitignore,拷贝内容到该文件中
- github- 搜索.gitignore
- 框架 找到oc的
- 拷贝内容到创建的.gitignore文件中
- 查看文件状态,把该文件添加到暂缓区
- git status
- git add .gitignore
- 把更改提交到本地的版本库
- git commit - m"进行忽略操作" .gitignore
- 使用Xcode创建一个新的项目
- 已经有一个git仓库了,不能再创建了
- 查看状态,内部会自动做一次 添加操作
- 用Xcode创建的项目,默认会做一次add操作
- 如果一次性添加多个文件
- $ git add .
- 如果一次性添加多个文件
- 把文件提交到本地 git commit -m "项目初始化处理"
- 把本地版本库的内容,提交到共享版本库Server
- $ git push
- 共享版本库是数据库,是以数据源的方式存储
- 张三连接上共享版本库,下载到本地
- git clone
- 更新 pull
- 先初始化一个远程仓库
Xcode多人开发和冲突处理
- 项目经理
- discard all changes 取消文件修改
- pull
- 项目经理开始开发,提交commit到本地的版本库
- push提交到共享的版本库
- 张三
- pull
- push
-
冲突
- 项目经理和张三修改了同一行代码
- 如果提交成功了,可能就是没有给项目经理和张三分配用户名和邮箱
- 解决冲突
- 张三添加了注释,提交了
- 项目经理pull,更新获得最新的
- 项目经理和张三修改了同一行代码
-
git仓库对于静态库的处理
- svn对于静态库不识别.a文件
- git不需要手动添加,内部会自动的做添加操作
把git远程仓库托管在github上面
注册github
-
创建一个仓库
- 点击加号
- 仓库名称repository name
- 描述信息:description
- 开源public | 私有 private(每一月几百元)
- initialize this repository readme 要不要装readme文件
- 选择要忽略的文件object-c
- 协议:MIT Licence
- 点击后面的i,可以查看协议的具体内容
- create repository
-
初始化处理
- 连接上仓库,把仓库下载到本地
- clone or download
- HTTPS
- SSH:秘钥对的方式处理的
- 公钥放在网站上
- 私钥放到电脑里
- 拷贝url,打开xcode,preperence,切换到账号,把拷贝的路径,粘贴到address上
- 用户名和密码是github的用户名(邮箱)和密码
- checkout
- next
- clone or download
- 不需要做忽略和添加操作
- 项目的初始化处理commit and push
- 连接上仓库,把仓库下载到本地
github删除代码仓库
- commits提交的次数
- branch 分支
- releases 备份信息
- fork复制一份仓库到本地
- pull requests 请求合并
- Wiki 公共界面,介绍框架的基本信息
- graphs 贡献度
- 删除:setting 最后面 delete this repository 需要输入要删除的仓库的名称
- 删除操作是不可逆的
- issues github上面提问题
- new
- submit new issues
- github上提意见
- 注意:在使用别人框架的时候,自己修改框架,对框架的原作者发送一个请求,请求合并自己的代码
- 复制fork到个人账号
- 下载clone download
- check out
- 下载下来之后就可以修改框架了
- new pull requests
- 跳转到原作者界面,请求标题,添加描述信息
- create pull request
- 请求合并的操作会在
创建项目导入已有项目
- 问题:显示的都是?,不能识别文件,需要手动的全部添加进去
- cd 仓库路径
- git st 红色
- git add .
- git st 绿色
- 能够识别了
托管到github上SSH认证
- 秘钥对
- SSH路径拷贝一份,认证信息要选中SSH Keys
- Public Key
- finder - 前往 - 个人 .ssh隐藏文件 - 删除里面的内容
- Private Key
- 如何生成公钥和私钥
- settings
- SSH ahd GPG keys
- generating an ssh keys
- 命令行
- 拷贝,后面改成自己的邮箱
- rsa 算法
- 保存的位置:可以不输入
- 密码可以不输入
- 生成秘钥的标识,出现一个正方形
- id_rsa
- id_rsa_pub拷贝一份到网站上
- 打开方式,文本编辑,全选拷贝
- 回到设置界面,new ssh key
- 标题可以随便写
- 把复制的信息粘贴到key栏
- 复制路径,打开Xcode,偏好设置,tepe:git
认证方式:SSH 再把仓库下载下来
github中使用tags标签备份
- 命令行
- cd
- 查看当前有没有备份信息
- git tag
- 对当前版本进行备份
- $ git tag - a MOMO1.0 - m"MOMO1.0"
- 把本地的提交到共享版本库
- $ git push orgin MMO1.0
- YES
- [new tag]表示新创建了一个tag
- release 里面查看备份信息
OSChina
- 码云
- 新建项目
- 项目名称
- 项目介绍
- 项目语言
- GitIgnore
- 开源许可证
- 项目属性:私有项目
- ReadMe
- 连接仓库 HTTPS |SSH
- 拷贝路径
- 偏好设置,仓库
- 账号的用户名和密码
- 同样的方式生成秘钥对