- 简介:是一款开源的分布式版本控制工具,在每个客户端都有一份完整的代码仓库, 可以在每个客户端自行管理
- 学习网站:http://backlogtool.com/git-guide/cn/intro/intro1_1.html
一、与SVN对比
- 区别:SVN是集中式管理,git是分布式管理。在很多情况下,git的速度远远比SVN快。另外:SVN使用分支比较笨拙,git可以轻松拥有无限个分支。SVN必须联网才能正常工作,git支持本地版本控制工作。旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git
- 流程对比:
svn checkout —— git clone
//svn 只下载代码, git 会连同代码仓库一起下载下来
svn commit —— git commit
//svn 是提交到服务器,git 中是提交到本地仓库,需要使用push才能提交到服务器
svn update - git pull
//都是从服务器下载最新被修改的代码
- 分布式和集中式最大的区别在于:在分布式下,本地有个代码仓库(服务器数据库),开发者可以在本地提交; 而集中式版本控制, 只有在服务器才有一个代码仓库, 只能在服务器进行统一管理
二、Git工作原理
- 工作区:与.git文件夹同级的其他文件夹或者子文件夹。
- 版本控制库:.git目录,用于记录版本信息。
暂缓区
分支(Git不像SVN那样有主干和分支的概念. 仅仅存在分支,其中master分支为默认被创建的分支,类似于SVN中的主干)
HEAD指针:通过控制该指针指向不同的分支,就可以切换。
- 操作原则: 所有新添加/删除/修改的文件 必须先添加到暂缓区(git add),然后才能提交到HEAD指向的当前分支中(git commit)
三、使用环境
- 单人开发只需要一个本地库
- 原因:不需要与他人共享代码,只负责管理自己代码即可;例如提交代码,删除代码,版本控制等等
- 多人开发时需要一个共享版本库,共享版本库的形式:
-本地共享库:文件夹/U盘/硬盘
-远程共享库:自己搭建git服务器/ 托管到第三方平台(例如github, oschina) - 无论是单人开发还是多人开发,客户端都可以使用命令行或者图形界面使用git
- SourceTree:[http://www.sourcetreeapp.com/download/]
- GitHub:[https://desktop.github.com/]
- Xcode:虽然集成较好,但是只能做一些常用的简单操作,复杂操作还要使用命令行
四、Git命令行演练-个人开发
git命令格式&&必学命令
git help [子命令]
和学习SVN指令是一样的,只不过git是通过使用指南的形式展示给用户看(不能编辑的vim编辑器),使用q退出vim编辑器,按空格进入下一页,ctrl + B 回到上一页; /关键字 进行搜索
git命令使用流程
1.初始化一个本地仓库
- cd path 切换目录
- git init 初始化一个本地仓库
- 配置仓库
- git config user.name “shunzi”
- git config user.email "shunzi@qq.com"
- git config -l 查看配置信息(.git -> config打开)
- 创建文件并提交
- touch main.c(git status此时创建的文件为红色,没有放到暂缓区)
- git add .(将工作区所有文件添加到暂缓区,此时为绿色)
- git commit -m “注释”
- 修改文件并提交
- 修改文件(git status查看文件状态)
- git add .
- git commit -m “注释”
- 删除文件并提交
- git rm person.h
- git commit -m “注释”
- 另外手动删除,删除状态的文件在工作区需要先使用git add.加入暂缓区,再commit.
- 日志查看版本回退
- 日志查看
git log (person.m)
git reflog 简洁版日志
- 版本回退
git reset —-hard HEAD 重置到当前版本
git reset —-hard HEAD^^ 重置到上上个版本(一个^代表上个)
git reset ——hard HEAD~2 重置到往上2个版本
git reset —-hard 七位版本号 重置到指定版本(git reflog 查看版本日志)
- 配置别名
git config alias.st “status” 此后git st == git status
git config alias.ci “commit -m”
git config --global alias.st “status”所有项目都配置了别名
//--global可以进行全局配置,所有的版本库共享此配置,查看全局配置(桌面前往->个人->xiaomage->.gitconfig)
//设置全局的版本日志查看配置,版本日志好看一些
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
- 补充
- 文件状态(git status)
红色: 代表被添加或者修改的文件没有被添加到暂缓区
绿色: 代表文件在暂缓区,等待提交
- 版本号的含义
版本号是一个由SHA1生成的40位哈希值
这样做的目的是保证版本号的唯一
- vim编辑器
进入命令模式:等待编辑命令输入;所有输入的内容都被当做命令来执行(vim person.m进入文件的命令模式)
i插入模式:输入的所有内容都被显示,并被当做文件内容处理esc退回命令模式
命令行模式(冒号:):执行待定命令(保存文件并退出: wq ; 强制退出不保存: q! )
五、Git命令行演练-团队开发
1. 共享库分类
本地共享库(只能在本地面对面操作)
- 电脑文件夹/U盘/移动硬盘
远程共享库(可通过网络远程操作)
- 自己搭建Git服务器(不建议)
- 在Github上托管项目(** 建议)
Github网址(https://github.com); 公开项目免费, 私有项目收费
- 在OSChina上托管项目( 推荐**)
OSChina网址(https://git.oschina.net) 安全免费,在国内访问速度快
2. 搭建本地共享库,第一人初始化项目到本地共享库
原因: 多人合作开发,代码共享
命令: git init —-bare
命令: git clone 本地代码仓库地址,并在clone下来的共享库内创建项目并提交到搭建的本地共享库, 其他同个人开发
3.修改同一文件造成冲突解决(未冲突文件可直接pull,不会覆盖新修改)
Your local changes to the following files would be overwritten by merge……
先add commit 或者使用下面方法:
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git pull:拉取服务器上的代码;
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
六、Git命令行演练-团队开发
** 注意: 添加忽略文件, 不然Xcode有可能会把没必要的文件提交**
** 必须在使用Xcode之前把忽略文件添加进来, 因为Xcode创建工程时, 默认直接把所有文件添加到暂缓区, 加进去之后忽略文件对其就无效了**
七、OSChina的使用
1. 托管项目到OSChina
- 打开oschina网站:[https://git.oschina.net]
- 注册账号(OneShunzi)
- 点击创建新仓库[https://git.oschina.net/projects/new]
- 填入项目名称,描述等信息
- 创建完成
- 可根据生成的版本库地址进行克隆下来进行操作
- 怎样加入合作伙伴?
//配置了name后提交显示configname,配置了email显示该账号的oschina名,否则显示主机名
1. 点击”管理”-\>项目成员管理-\>选择成员权限进行创建
2. 或者直接只用SSH(以下是生成公钥私钥方法)
cd ~/.ssh//查看是否存在
open .
//若存在,打开里面存放着三个文件id_rsa、id_rsa.pub、known_hosts
//将id_rsa.pub(公钥ssh key)里的内容全部复制到服务器端(例如gitHub或gitLibe的公钥sshkey)
//id_rsa为私钥文件,要存储在本地保密
ssh-keygen -t rsa -C "youremail@example.com" //不存在则生成
//通过ssh加入的合作伙伴通过ssh clone
另、问题:中途加入.gitignore
.gitignore文件(只对工作区有效)配置规则:http://www.cnblogs.com/haiq/archive/2012/12/26/2833746.html
----在真实开发中,配置.gitignore文件 , 去github里面搜索gitignore 选择OC版本的,拷贝到本地仓库即可,记得添加到本地版本库
- git rm -r --cached .DS_Store 删除远端仓库的DS_Store,然后加入.gitignore
The following untracked working tree files would be overwritten by checkout
查看git status add commit后仍不可用如下方法:
git clean -d -fx删除 一些 没有 git add 的 文件
- 下拉代码无关文件冲突
Cannot merge binary files: ...
CONFLICT (content): Merge conflict in LucyDream/LucyDream.xcodeproj/project.xcworkspace/xcuserdata/qiaoli.xcuserdatad/UserInterfaceState.xcuserstate
Automatic merge failed; fix conflicts and then commit the result.
git rm --cached *xcuserstate
git rm --cached .DS_Store
git rm --cached [YourProjectName].xcodeproj/project.xcworkspace/xcuserdata/[YourUsername].xcuserdatad/UserInterfaceState.xcuserstate(未忽略的缓存删除)