源代码管理之Git

  • 简介:是一款开源的分布式版本控制工具,在每个客户端都有一份完整的代码仓库, 可以在每个客户端自行管理
  • 学习网站: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)

三、使用环境

  1. 单人开发只需要一个本地库
  • 原因:不需要与他人共享代码,只负责管理自己代码即可;例如提交代码,删除代码,版本控制等等
  1. 多人开发时需要一个共享版本库,共享版本库的形式:
    -本地共享库:文件夹/U盘/硬盘
    -远程共享库:自己搭建git服务器/ 托管到第三方平台(例如github, oschina)
  2. 无论是单人开发还是多人开发,客户端都可以使用命令行或者图形界面使用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 初始化一个本地仓库
  1. 配置仓库
  • git config user.name “shunzi”
  • git config user.email "[email protected]"
  • git config -l 查看配置信息(.git -> config打开)
  1. 创建文件并提交
  • touch main.c(git status此时创建的文件为红色,没有放到暂缓区)
  • git add .(将工作区所有文件添加到暂缓区,此时为绿色)
  • git commit -m “注释”
  1. 修改文件并提交
  • 修改文件(git status查看文件状态)
  • git add .
  • git commit -m “注释”
  1. 删除文件并提交
  • git rm person.h
  • git commit -m “注释”
  • 另外手动删除,删除状态的文件在工作区需要先使用git add.加入暂缓区,再commit.
  1. 日志查看版本回退
  • 日志查看

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"
  1. 补充
  • 文件状态(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
  1. 打开oschina网站:[https://git.oschina.net]
  2. 注册账号(OneShunzi)
  3. 点击创建新仓库[https://git.oschina.net/projects/new]
  4. 填入项目名称,描述等信息
  5. 创建完成
  6. 可根据生成的版本库地址进行克隆下来进行操作
  1. 怎样加入合作伙伴?
//配置了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 "[email protected]" //不存在则生成
//通过ssh加入的合作伙伴通过ssh clone

另、问题:中途加入.gitignore

.gitignore文件(只对工作区有效)配置规则:http://www.cnblogs.com/haiq/archive/2012/12/26/2833746.html
----在真实开发中,配置.gitignore文件 , 去github里面搜索gitignore 选择OC版本的,拷贝到本地仓库即可,记得添加到本地版本库

  1. 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 的 文件
  1. 下拉代码无关文件冲突
    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(未忽略的缓存删除)

你可能感兴趣的:(源代码管理之Git)