git 使用

96
珍此良辰
2016.05.04 18:50* 字数 3687

前言


  • 有什么问题或者建议,可以联系通过 277511806@qq.com 联系我。
  • 如果想了解SVN版本控制的朋友,请移步SVN使用

更新公告:

  • 客官,本文已经进行更新,更新内容如下:
    - 优化排版。
    - 新增 .gitignore 语法说明及使用,可以自己自定义,爽爽哒。
    - 新增 将项目托管到 github 等平台 命令行 方式

git工作原理


  • 工作区(Working Directory):仓库文件夹里除.git目录以外的内容。

  • 版本库(Repository):.git目录,用于存储记录版本信息。

  • 暂缓区(stage):也叫暂存区。

  • 分支(master):.git自动创建的第一个分支。

  • HEAD指针:用于指向当前分支。

  • git addgit commit 原理:

  • git add:把文件修改或者新添加文件添加到暂缓区(暂存区)。

  • git commit:把暂缓区(暂存区)中的所有内容提交到当前分支。

git大概运作流程.gif

什么是分支?


  • git 可以创建无数个分支,且在创建一个 git仓库 的同时会自动创建第一个分支。

  • 分支的作用:举个栗子 ==> 一个已经上架的项目,发现有重要Bug,为了不影响主分支的开发进度,一般会开个分支出来专门修复 Bug 用,等到Bug修复后,再与主分支进行合并操作,这样在不影响主分支的开发进度的同时,可以进行 Bug 的修复。

HEAD头指针运作原理


  • HEAD指针 就是为了在各个分支间进行切换,我们开发哪个分支,它就会指向哪个分支
git中HEAD原理.gif

git初始化和访问配置(命令行方式)

  • 初始化一个本地版本库
git init

  • 设置用户名和邮箱
git config user.name "用户名"
git config user.email "xxxxxx@qq.com"
  • 设置全局用户名和邮箱(优先级较高,如果同时设置,优先使用全局)
git config --global user.name "用户名"
git config --global user.email "xxxxxx@qq.com"
  • git 仓库项目初始化操作

  • git工作区(同级目录和同级目录的子目录)中创建一个文件 main.m

touch main.m
  • 查看文件状态(查看文件是否被管理)
git status

译注:

  • 如果文件的颜色为红色,说明该文件并没有被添加到git的暂缓区中
  • 如果文件颜色为绿色,说明该文件已经被添加到git的暂缓区中
  • 添加文件到暂缓区中,查看文件状态
git add main.m
git status
  • 提交到本地版本库中
git commit -m "创建了main.m文件" main.m

译注:

  • 可以 直接 在后面跟上文件,表示把该文件提交到本地版本库(不推荐
  • 不跟任何文件名称,表示把当前所有暂缓区中的内容都提交到 本地版本库
  • 修改文件,重新提交更改到本地版本库(git中如果修改了文件,需要重新将文件添加到暂缓区中才能提交)
git add main.m
git commit -m "修改了main文件" main.m

注意: git 中和 svn 不一样的地方在于 —— 不管是创建文件还是修改文件都需要添加到暂缓区中然后再提交。

git 好用的功能 —— 别名


  • git 流行起来还有个原因,就是它贴心的功能 —— 别名,它支持我们对某些命令进行 别名 设置,让使用者使用起来更加顺手,更加效率,这边我们通过下面的例子来看看怎么给 git 起别名:

  • 我们来给status起别名 st

  • 基本方式:(只能在当前文件夹内的git工作区内使用)

git config alias.st "status"
  • 这样以后要查询文件状态就可以直接使用
git st
  • 高级方式:(只能在当前文件夹内的git工作区内使用)
// git commit -m "注释" 
git config alias.ci "git commit -m"
  • 这样以后要提交文件就可以直接使用
git ci "注释"
  • 你以为只能是 局部的别名?错!它还支持 全局的别名,是不是感动到泪奔,怎么可以这么贴心,赶紧来看一下示例:

  • 全局别名:(设置一次,电脑中所有的地方都可以使用)

git config --global alias.st "status"

译注:全局别名和局部别名的使用区别就在于有没有跟上 --global,所以其他方式就不再赘述!

git删除文件


  • 作为一款主流的 版本控制器,怎么可以少了删除功能,马上来看下面示例:

  • 先创建一个新的文件:

touch test.m
  • 将文件提交到暂缓区中:
git add test.m
  • 提交删除操作到本地版本库:
git commit -m "删除了test.m"文件
  • 删除test.m文件
git rm test.m

查看 git 版本信息


  • 版本信息也是重要的一部分,一定要会,知道么!告诉我,你知道。

  • 首先肯定要进到我们需要查看的 git 工程目录下,接着 git 给我们提供了下面2种方式查看版本信息:

  • 基础方式:

git log
  • 高级方式:(可查看版本回退操作)
git reflog
  • 因为 git 是分布式版本控制,有 多个git本地版本库,为了使版本号之间不互相冲突,所以 git版本号是通过SHA1加密得到的密文
git分布式版本控制示意图.png

版本回退操作


  • 开发中,经常会发生我们或者其他开发人员因修改不当造成 软件运行不正常等情况,这时候就需要用到版本回退功能,将代码退回到之前正常运行的版本,再继续进行开发,根据情况不同,git 提供了下面 2 种方式:

  • 修改了本地版本库文件,但还未提交

git reset --hard HEAD
  • 修改了本地版本库文件,且已经提交(这种情况只能回退到正常版本了),git 提供 3 种方式:
  • 方式一(推荐,但如果需要回退多个版本时不推荐):
//  一个“^”号表示一个版本,下面表示退回到上个版本
// 上上个版本:^^,以此类推
git reset --hard HEAD^
  • 方式二(不推荐,连续回退多个版本):
//  ~号后面表示回退几个版本(如10就是回退10个版本)
git reset --hard HEAD~1                 ```
- 方式三(推荐,回退到指定版本):

```git
// 查看版本信息,看需要回退到哪个版本
git reflog
// 指定回退的版本号
// 复制需要的版本号,然后跟上版本号即可
git reset --hard 版本号(5位)

创建共享版本库并初始化项目


  • 创建共享版本库方式:

  • 自己搭建服务器,自己在服务器上配置(复杂)。

  • 在U旁上创建共享版本库。

  • 把共享版本库创建到文件夹中。

  • 托管到github、oschina网站:

  • 初始化一个空的git共享版本库(和本地版本库不同的是,共享版本库不会生成.git文件夹)

git init --bare
  • 管理者连接仓库并下载仓库到本地
git clone 共享版本库路径
  • 初始化项目

  • 在初始化项目前,我们需要先忽略一些不必要的文件

  • 创建一个忽略文件.gitignore

cd git工程路径
touch .gitignore
  • 到github上搜索gitignore并拷贝Objective-OC文件中的内容到我自己创建的忽略文件内保存(文件中里面包含了我们需要忽略的文件配置),也可以自己自定义,语法在下面会提到!

  • 添加并提交忽略文件到本地版本库

git add .gitignore
git commit -m "新建.gitignore忽略文件" .gitignore
  • 创建我们的Xcode工程

  • 项目保存路径选择我们本地的版本库(这是下面的 git选项就会变灰不可点击,这是正常的,因为我们当前的目录下就有了 git 仓库)

  • 提交到本地版本库:创建完成后点击XCode上面的Source Control --> Commit --> 添加注释 --> 提交

  • 提交到远程版本库(共享版本库):Source Control --> Push --> 选择远程版本库 --> Push

译注:

  • 怎么查看使用的版本库是共享版本库还是本地版本库,我们可以打开git 中的config配置文件查看里面的“bare”字段,如果显示为true表示为共享版本库。

.gitignore 语法


  • 上面提到了 .gitignore 文件,那它到底是什么东西呢?—— .gitignore 是 git 中常见想配置文件,它里面包含了一些文件规则(如:忽略哪些文件等等)这边就来说说其语法:

  • 这边先介绍下怎么配置 .gitignore

  • /:表示目录

  • *:为通配多个字符

  • ?:通配单个字符

  • []:包含单个字符的匹配列表

  • !:表示不忽略匹配到的文件和目录

// 示例
// 忽略ios文件夹下的所有内容
/ios/*

// 忽略所有文件,除ios文件夹和.gitignore文件
/*
!.gitignore
!/ios/

  • 知道了 gitignore 语法,我们就可以轻松控制文件的提交方式,感兴趣的可以试一下。

XCode 使用 git(添加第三方框架)


  • 开发中我们或多或少会使用到第三方框架,通常框架会使用 cocoapods 进管理,但偶尔会有公司与公司之间内部使用的框架,而我们将框架拖入工程的时候会发现git无法识别的情况,这个原因是因为我们拖入的是整个文件夹,如果我们直接拖入的文件不是包含在文件夹下,那么就可以识别。

  • git中内部第三方框架(静态库)的处理方式:

  • 方式一:直接创建和框架相对应的文件夹,然后将框架文件夹内的文件拖入到工程中

  • 方式二:直接右击需要添加的文件 --> source control --> add

  • 方式三:点击需要添加文件所属的文件夹 --> Source Control --> Add "xxxx"

  • 方式四(命令行):

cd 文件所在路径
git add .

Xcode 回退操作


  • 在 XCode 中,如果还没提交到远程版本库中,我们要进行回退操作很简单:Source Control --> Discard All Changes(取消所有的更改)就可以了 。

Xcode 多人开发冲突解决


  • 在多人开发中,很容易出现版本之间的冲突问题,一般我们都是先提交代码到本地仓库,然后一段时间提交一次到远程版本库中,这段时间可能别的开发者已经提交过文件,并且修改了和你同一文件的同一行,那么此时要提交就会报错。

  • 处理方式:

  • Source Control --> Pull --> 修改冲突的代码 —-> 确定

  • Source Control --> push --> 提交

创建新成员的共享版本库


  • 有时候开发过程中会出现新的团队成员,而考虑到新成员和老成员使用git方式不一样或者不熟悉,为了保证代码的安全性,会新建一个专门给新成员的共享版本库,以供观察!

  • 创建新成员共享版本库(步骤):

  • 在远程共享版本库中新建一个新成员文件夹

  • 打开远程共享版本库

cd 远程共享版本库中新成员文件夹的路径
  • 初始化新的共享版本库
git init --bare
  • 为确保拷贝到新成员共享版本库中的工程为最新版,操作之前先pull一次工程

  • Source Control --> 鼠标移至工程分支选项 --> 选择弹出菜单中的Configure ... --> 在弹出窗口中选择 --> Remotes(远程) --> 点击左下角"+" --> Add Remote... --> name:分支标记 Address:需要添加的仓库地址 --> Done --> Source Control --> Push --> 选择新成员分支 --> push

  • 到此,新成员拿到仓库地址,进行下面步骤:

  • 打开本地仓库

cd 本地仓库路径
  • 下载远程仓库中的工程
git clone 远程仓库路径
  • 如果要检查新成员的工作成果,那么也需要下载新人共享版本库的工程:

  • 先在本地创建一个存储目录

  • 然后打开该目录

cd 本地存储目录路径
  • 下载工程
git clone 新人共享版本库的路径

Xcode 查看提交日志


  • Source Control --> History...
  • 在日志中可以点击对应日志中右边的 show 查看修改的情况

将工程托管到 github 或 osChina 平台


github篇

  • 使用github有个比较不好的地方 -- 要想免费必须开源,如果不开源只能付费使用

  • 肯定要有账号(步骤就不演示了)

  • 创建远程git版本库

  • 点击右上角 “+” 号 --> New repository

  • repository name(一般为项目名称) --> Description(项目描述) --> 开源选择“Public”(免费)不开源选择"Private"(收费,7美元/1个月) --> 选择是否生成README说明文档 --> 忽略文件选择(选择Objective-OC)--> 选择协议(一般选择 Apache License 2.0协议)--> 创建

  • 连接远程版本库配置

  • 打开XCode --> XCode --> Preferences --> Accounts --> 左下角 “+” --> Add Repository... --> Address:远程版本库的HTTPS地址 Type:管理工具类型 Authentication:认证方式 User Name:用户名 Password:密码 --> Add

  • 连接远程版本库:

  • Source Control --> Chack Out --> 在弹出的窗口中找到我们需要的版本库并选择 --> Next --> 在弹出窗口中选择需要存储的位置 。

  • 创建工程:将项目添加到版本库的目录下 --> Source Control --> Commit --> 提交。

  • 将本地版本库的工程提交到远程版本库:Source Control --> Push --> 提交。

oschina篇:这边就不写了,因为oschina可以看成是github的中文版,排版和操作都差不多,但是他比较好的一点就是全免费,而且服务器在国内,速度比较稳定且快,所以推荐使用。

github 删除代码仓库


  • 登录github --> 找到仓库 --> Settings --> 最下面有个Delete this repository -- 输入需要删除的仓库名 -- 提交。

将项目托管到 github 等平台 命令行 方式


  • 这边我们在来说说命令行的方式将项目托管到 github 平台。

    • 首先,电脑需要有 git 客户端,否则会提示找不到命令等提示,(mac自带)

    • 其实方式有很多,这边我比较习惯下面的步骤做:

      • 在 github 上创建仓库

      • 复制 仓库 网址

      • 打开终端,输入:

          git clone 远程仓库网址
      
      • 将下载下来的项目文件夹中所有的文件以及文件夹拷贝到需要托管的项目根目录

      • 进入 需要托管的项目根目录,添加所有文件为管理

          cd 项目根目录地址
          git add .
      
      • 提交到本地仓库
          git commit -m "注释"
      
      • 提交到远程仓库
          git push -u origin master
      
      • 输入 github 账号和密码,等待提交完成即可。

      • 要确定是否成功提交,登陆github查看下就知道了!

译注:

  • 感谢许多朋友给出的意见和建议,有什么不好的地方,希望各位还是能够提出来。

  • 到这里本篇内容更新完毕,很感谢大家对我的支持!

版本控制
Web note ad 1