GIT的使用

Git的使用

git是一款开源的分布式版本控制工具

分布式和集中式的最大区别在于:在分布式下

  • 开发者可以本地提交
  • 每个开发者机器上都有一个服务器的数据库

工作原理

  • 如果想了解git的工作原理,有几个核心概念必须知道

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

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

      • 暂缓区(stage)

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

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

  • git add和git commit的原理

    • git add :把文件修改添加到暂存区

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

工作原理:

工作区的文件 –git add–> 版本库的暂缓区

暂缓区 –git commit–> 分支

创建配置仓库


初始化本地仓库

1
git init

配置仓库, 配置完成之后在.git的config文件查看或者通过控制台指令

1
2
3
4
git config user.name "danzi"
git config user.email "danzi@163.com"

git config -l

个人开发


基础

文件状态

  • 红色: 代表被添加或者修改的文件没有被添加到暂缓区
  • 绿色: 代表文件在暂缓区,等待提交
1
git status 

日志查看

  • 版本号是一个由SHA1生成的40位哈希值
  • 这样做的目的是保证版本号的唯一
1
2
git log 查看日志
git reflog 查看指令使用记录(能够查看所有的版本号)

彩色日志

1
2
3
4
5
// 配置
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 lg

配置别名

1
2
git config alias.st “status”
git config alias.ci “commit -m”

全局配置

  • –global进行全局配置,所有的版本库共享此配置
  • 查看全局配置(桌面前往->个人->.gitconfig

添加文件并提交

1
2
3
4
5
touch 文件

git add .

git commit -m "添加一个文件"

修改文件并提交

1
2
3
git add .

git commit -m "修改一个文件"

删除文件并提交

1
2
3
4
git rm Dog.h

git commit -m "通过指令删除一个文件"

1
2
git add .
git commit -m "通过Finder删除一个文件后同步"

版本回退

修改未提交的回退

重置到当前版本

1
git reset —-hard HEAD

修改且提交的回退

1
2
3
git reset —-hard HEAD^^ 重置到上上个版本(有几个^前几个版本)
git reset ——hard HEAD~2 重置到往上2个版本
git reset —-hard 七位版本号 重置到指定版本

团队开发


** 团队开发必须有一个共享库,这样成员之间才可以进行协作开发**

基础

共享库分类

  • 本地共享库(只能在本地面对面操作)
    • 电脑文件夹/U盘/移动硬盘
  • 远程共享库(可通过网络远程操作)
    • 自己搭建Git服务器(不建议)
    • 在Github上托管项目(** 建议**)
    • 在OSChina上托管项目(** 推荐**)

1. 搭建本地共享库

原因: 多人合作开发,代码共享

1
git init --bare

2. 经理初始化项目到本地共享库

1
git clone 本地代码仓库地址

3.多人进行开发

新建两个用户

创建经理, 葫芦娃两个文件夹, 进入文件夹从共享代码库clone到本地

1
2
3
4
5
mkdir jingli

cd jingli

git clone 本地代码仓库地址
1
2
3
4
5
mkdir huluwa

cd huluwa

git clone 本地代码仓库地址

新增文件同步

经理添加文件到工作区, 通过控制台将文件添加到暂缓区, 然后提交到共享库

1
2
3
4
5
6
7
8
touch file.h

git add .

git commit -m “创建文件”

git push

葫芦娃从共享库更新

1
git pull

修改文件同步

葫芦娃修改文件并提交到共享库

1
2
3
4
5
git add . 

git commit -m “修改文件”

git push

经理从共享库更新

1
git pull

删除文件同步

经理删除文件并提交到共享库

1
2
3
4
5
git rm file.h

git commit -m “删除文件”

git push

葫芦娃从共享库更新

1
git pull

解决冲突

经理修改文件并提交到共享库

1
2
3
4
5
git add .

git commit -m "经理修改文件"

git push

葫芦娃修改文件并提交到本地库

1
2
3
4
git add .

git commit -m "葫芦娃修改文件"

葫芦娃提交共享库发生错误, fetch first 代表当前文件过期,需要从远程共享库更新

1
git push 出错

葫芦娃重新从共享库更新本地库数据, 发生冲突, 修改冲突文件重新提交

1
2
3
4
5
6
7
8
9
git pull

---修改文件, 解决冲突---

git add .

git commit -m "葫芦娃解决冲突"

git push

忽略文件

1
2
3
4
5
touch .gitignore
open .gitignore 加入需要忽略的文件名
git add .
git commit -m "添加忽略文件"
git push

.gitignore文件配置规则, 参见Git的.gitignore配置

在真实开发中,配置.gitignore文件 , 去github里面搜索gitignore 选择OC版本的,拷贝到本地仓库即可,记得添加到本地版本库

git bug处理


创建共享库

1
git init --bare

正常开发

创建经理文件夹, 克隆

1
git clone 共享库地址

添加忽略文件, 提交到共享库

1
2
3
4
5
6
7
把忽略文件添加到工作区

git add .

git commit -m "添加忽略文件"

git push

Xcode创建项目, 完成功能1后提交到共享库

(该步控制台操作也可通过Xcode完成)

1
2
3
4
5
6
7
项目添加到工作区(如果是xcode进行操作, 则直接添加到暂缓区)

git add .

git commit -m "v1.0完成"

git push

添加标记, 查看标记后上传到共享库

1
2
3
4
5
6
git tag -a v1.0 -m "备份1.0版本"

git tag

git push origin v1.0

发现bug

开发2.0时候发现1.0有bug, 备份当前进度上传到共享库

1
2
3
4
5
6
7
开发新功能

git add .

git commit -m "2.0..."

git push

处理bug

创建葫芦娃文件夹, 克隆

1
git clone 共享库地址

根据v1.0版本建立新分支v1.0fixbug并切换到此分支

1
git checkout v1.0 -b v1.0fixbug

解决bug后, 提交到本地库, 添加标记后上传到共享库

1
2
3
4
5
6
7
8
9
解决bug

git add .

git commit -m "Fix 1.0 Bug"

git tag -a v1.1 -m "1.1版本备份"

git push origin v1.1

葫芦娃上传整个分支到共享库

1
git push origin v1.0fixbug

合并代码

更新本地master分支

1
git pull

合并远程v1.0fixbug分支到本地master分支

1
git merge origin/v1.0fixbug -m "合并分支解决bug"

提交本地库上传到共享库

1
git push

修复已发布版本bug操作流程


  1. 程序员在Trunk完成1.0, 提交
  • 项目经理添加到tags中进行重大版本备份v1.0

  • 程序员在Trunk继续开发2.0

  • 1.0发现重大bug, 程序员2.0尚未完成

  • 项目经理从tags的备份中拷贝一份到branch中 v1.0fixbug, 给程序员授权branch中V1.0fixbug的权限

  • 程序员把目前2.0进度保存到Trunk

  • 程序员debug

  • 项目经理将v1.0debug添加到tags进行重大版本备份v1.1

  • 项目经理从Trunk中下载一份目前2.0尚未完成的代码, 将branch中的已经debug的v1.0fixbug合并到当前2.0进度代码中

  • 程序员update, 继续开发