源代码管理

git

==========Wh.少爷===========

显⽰示隐藏⽂文件
defaults write com.apple.finder AppleShowAllFiles -bool true

1.git简介

  • 什么是 git?
    -- git 是一款开源的分布式版本控制工具
    -- 在世界上所有的分布式版本控制工具中,git 是最快、最简单、最流行的
  • git的起源
    -- 作者是Linux之父:Linus Benedict Torvalds
    -- 当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)
  • git的现状
    -- 在国外已经非常普及,国内并未普及(在慢慢普及)
    -- 越来越多的开源项目已经转移到git

2.git 和 svn的区别

  • 速度
    -- 在很多情况下,git的速度远远比SVN快
  • 结构
    -- SVN是集中式管理,git是分布式管理
  • 其他
    -- SVN使用分支比较笨拙,git可以轻松拥有无限个分支
    -- SVN必须联网才能正常工作,git支持本地版本控制工作
    -- 旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git

3.git 工作流程

分布式和集中式的最大区别在于:在分布式下
开发者可以本地提交
每个开发者机器上都有一个服务器的数据库
Paste_Image.png

分布式管理


Paste_Image.png

4.git 的基本使用

  • git 的重要概念及工作原理

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

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

      • 暂缓区(stage)
      • 分支(master):git自动创建的第一个分支
      • HEAD指针:用于指向当前分支
    git add和git commit的原理
    git add :把文件修改添加到暂存区
    git commit :把暂存区的所有内容提交到当前分支
    
  • 学习git指令:

    • 学习git指令和SVN指令的学习其实是一样的, 只不过展现的方式不太一样, git是通过使用指南的方式告诉我们某一个指令如何使用
    • 这个指南其实是一个不可编辑的vim
    $ git help
    查看svn所有命令的帮助
    $ git help 子命
    
. 要退出帮助信息,按"q"

. 翻看下页,按"空格"

. 翻看上页,按"CTRL+B"

. 要搜索相关文字,按"/"然后输"相关文字"
  • git常规指令:
    • git status 查看文件状态

    • git add 添加文件到“暂存区”

      • 添加之前的颜色
        红色 代表在”工作区“
      • 添加到暂存区之后的颜色
        绿色 代码在”暂存区“
    • git commit 文件名称 添加文件到”本地仓库“

      • 注意:如果没有在commit后面加上 -m说明修改了什么, 会自动进入vim界面,要求我们输入修改信息,按键盘上的i代表开始输入内容
        输入完毕之后按 esc 然后按 :wq
        所以:如果以后在终端中提交最好在后面加上-m

      • 注意:git中的add和SVN中的add不太一样, SVN中只需要add一次,而git中每次新建或者修改之后都需要重新add

    • 查看log
      查看所有版本库日志$ git log
      查看指定文件的版本库日志git log 文件名
      git reflog 查看所有修改信息(所有版本)

      • 注意: GIt中的版本号是一个”40位“的哈希值, 而SVN中的版本号是一个递增的整数
   配置带颜色的log别名
   
   ```
  $ 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 config alias.st status
$ git config alias.ci "commit -m"
```

个人建议:除非特殊原因,最好不要设置别名,否则换一台机器就不会用了

 . 注意: git默认没有简写指令

 . 注意: 一般情况下不建议自定义简写指令

 . git中的简写称之为起别名
  • 版本号,让我们在任意版本之间穿梭

       git reset —hard 版本号(只需要写前7位)
       其中—hard代表强制重置
       回到当前版本,放弃所有没有提交的修改
       $ git reset --hard HEAD
       回到上一个版本
       $ git reset --hard HEAD^
       回到之前第3个修订版本
       $ git reset --hard HEAD~(3)
       回到指定版本号的版本
       $ git reset e695b67
       查看分支引用记录
       $ git reflog
    
```

   - 已经提交
   
   ```
    git reset —hard HEAD^ 返回上一个版本
    其中—hard代表强制重置
    git reset —hard 版本号(只需要写前7位)
   ```
   - 未提交
   
   ```
    git checkout 文件名 回退到上一次提交的版本
    git reset —hard HEAD  回退到上一次提交的版, 注意HEAD后面没有尖号^
   ```      
  • 单个文件的修改管理

     查看文件变化
     $ git diff
     如果显示绿色代表新增
     如果显示红色代表删除
     撤销对文件做的修改
     $ git checkout Person.h
     从代码库(暂存区中删除文件)
    

a.本地操作

  • 1.创建代码库 & 配置个人信息

    • 1> 进入工作目录中,新建一个“本地仓库”
       $ cd 进入工作目录
       $ git init
    
    • 2> 告诉git你是谁
      告诉git怎么联系你
     $ git config user.name lnj
     $ git config user.email lnj@itcast.cn
    

    》上面一种配置方式是一次性的配置, 会配置到被管理文件的。git文件夹下的config 中

    》下面一种配置方式是一劳永逸的方式:
    两个命令会将用户信息保存在用户目录下的 .gitconfig 文件中

     $ git config --global user.name lmj
     $ git config --global user.email lmj@itcast.cn
    
    • 3> 查看当前所有配置
     $ git config -l
    
  • 2.实际开发

    • 1> 创建代码,开始开发
       $ touch main.c
       $ open main.c
    
    • 2> 将代码添加到代码库
     查看当前代码库状态
     $ git status
     将文件添加到代码库
     $ git add main.c
     将修改提交到代码库
     $ git commit -m "添加了main.c"      
    

    提示:

    在此一定要使用 -m 参数指定修改的备注信息

    否则会进入 vim 编辑器,如果对vim不熟悉,会是很糟糕的事情

    将当前文件夹下的所有新建或修改的文件一次性添加到代码库
    $ git add .

    • 3> 添加多个文件
     $ touch Person.h Person.m
     $ git add .
     $ git commit -m "添加了Person类"
     $ open Person.h
     $ git add .
     $ git commit -m "增加Person类属性"
    

b.团队开发

远程仓库(专门用于团队开发的代码仓库

SVN需要一个单独的服务器

Git不需要: 文件中、U盘中、云上、github、OSChina...

1.新建git远程仓库,这个仓库仅仅是用于管理代码,不参与开发

  ```
  # 切换目录
  $ cd /Users/lnj/Desktop/git演练/公司/weibo
  # 建立空白代码库(专门用于团队开发)
  $ git init --bare
  ```

2.项目经理初始化项目

 - 切换目录
 
 ```
  $ cd /Users/lnj/Desktop/git演练/经理
 ```
 - "克隆"代码库到本地
 
 ```
  $ git clone /Users/lnj/Desktop/git演练/公司/weibo/
 ```
 - 忽略不需要加入版本控制器的文件以及文件夹.gitignore
 
 ```
 touch .gitignore
 open .gitignore
 
 ```
 
 - 要忽略的⽂文件 可以去https://github.com/github/gitignore/blob/master/Objective-C.gitignore查看OC需要忽略 的内容,将内容填写到. gitignore中,.gitignore一定要在和.git隐藏文件夹同一级的目录下


    - 生成好.gitignore文件之后, 还需要将.gitignore文件添加到版本控制
    
 ```  
    git add  .gitignore
    git commit .gitignore -m”将.gitignore文件添加到版本控制”
 ```
 
   - 新建项目,初始化项目在.git同目录下      
  
 ```
   source conrol—>commit  将代码提交到本地仓库
   source conrol—>push 将代码提交到远程仓库
 ```

3.新人加入
- git clone 共享代码库的地址
- 修改代码—>git commit —>git push

4.分支管理

```  
 # 查看当前标签
 $ git tag
 在本地代码库给项目打上一个标签
 $ git tag -a v1.0 -m 'Version 1.0'
 将标签添推送到远程代码库中
 $ git push origin v1.0

 使用tag,就能够将项目快速切换到某一个中间状态,例如产品开发线上的某一个稳     定版本
 签出v1.0标签
 $ git checkout v1.0
 从签出状态创建v1.0bugfix分支
 $ git checkout -b bugfix1.0

 查看远程分支
 $ git branch -r
 删除远程分支
 $ git branch -r -d origin/bugfix1.0
 
 $ git merge v1.0
 
``` 

5.注意
- git中默认就会创建一个分支, 这个分支叫做origin/master, 相当于svn中的trunk
- 专业人员只需要在git仓库的hooks文件夹中写一些指令, 就可以完成自动测试(压力测试、自动测试、集成测试、冒烟测试、。。。)
- 和SVN一样, 如果服务器仓库的代码被修改了, 我们再提交代码也会报错。
fetch first == out of data

 **要先从服务器`pull`之后再提交***


 - 总结:
   git和svn最大的区别
   
     1.git每次修改新增都需要add 
             
     2.git每台电脑都有一个仓库
     
     3.git是先提交到本地仓库, 再提交到远程仓库

c.新人服务器的搭建

1.新建一个新人服务器
cd /Users/lnj/Desktop/... 新人服务器
2.初始化仓库
git init --bare

3.添加一个新的远程仓库
source control —> master —>config —>remotes —>add —> add remote


Snip20160126_4.png

4.将经理最新的代码提交到新人服务器
xcode -> source control -> push


Snip20160126_5.png

5.经理分配新人服务器的地址给新人

c.分支 —bug 修复

1.开发

2.发布

 ```
 # 查看当前标签
 $ git tag
 在本地代码库给项目打上一个标签
 $ git tag -a v1.0 -m 'Version 1.0'
 将标签添推送到远程代码库中
 $ git push origin v1.0 
 ```  

3.保存稳定版本

4.继续开发

5.出现bug

6.分配员工到分支上修复bug

     ```
     >员工从服务器下载最新代码
     $git clone /Users/lnj/Desktop/。。。
     》员工利用git checkout v1.0指令快速切换到1.0版本
     》根据提示:开启一个新的分支开始修复代码
     $git checkout -b 1.0bug_fix
     》修复完成之后再打个标签
     $ git tag -a v1.1 -m 'Version 1.1'
     $ git push origin v1.0  将标签添推送到远程代码库中
     ```

7.合并修复后的代码到主线

 在修复bug 的代码中
   ![Snip20160126_6.png](http://upload-images.jianshu.io/upload_images/1482869-c551aa564d9a484e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

8.备份稳定版本
d.如何使用/学习第三方框架
优秀的第三方框架都在 github.com

1> 搜索
2> git clone 获得完整版本
$ git clone https://github.com/AFNetworking/AFNetworking.git
3> 获取最新版本 git pull

  • 进入clone的本地文件夹
    $ git pull

4> 看github上的文档,优秀的第三方框架都有好的文档
5> 编写测试程序,看运行结果
6> 针对感兴趣的部分,看源代码

7> 有问题去http://stackoverflow.com

e.通过Xcode将代码提交到github上

1.注册一个 github账号

2.新建远程仓库


Snip20160126_9.png

Snip20160126_12.png

3.复制远程仓库地址


Snip20160126_15.png

4.添加远程仓库

  - a-
 ![Snip20160126_14.png](http://upload-images.jianshu.io/upload_images/1482869-be0d032e0b29b0ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![Snip20160126_17.png](http://upload-images.jianshu.io/upload_images/1482869-6c6540bc4331f2ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  
 ![Snip20160126_18.png](http://upload-images.jianshu.io/upload_images/1482869-9f14a056141ef826.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)     
 ![Snip20160126_20.png](http://upload-images.jianshu.io/upload_images/1482869-1fcf716895f09d83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![Snip20160126_22.png](http://upload-images.jianshu.io/upload_images/1482869-20dffd907faae958.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  - b-
通过 git clone  远程仓库地址

5.在代码仓库创建工程,提交 SourceControl -> commit -> push
push 成功之后,github上 就有了代码仓库。

6.配置SSH Keys
- 点击昵称来到个人主页
- 点击主页中的设置(setting)
- 点击SSH Keys
- 点击 generating SSH keys

  - 1.检查本地的ssh keys
    在“用户目录”下 ls -al ~/.ssh
  - 2.如果文件夹不存在需要手动创建一个  mkdir .ssh(可不要)
  - 3.根据github的提示2生成ssh keys
   在.ssh目录下执行 
   `$ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`
   输入完成之后连续按下回车, 知道出现牛逼的图形位置
  - 4.生成完公钥和私钥之后输入
   ls -la查看是否生成成功   id_rsa(私钥) id_rsa.pub(公钥)
  - 5.根据提示3获得公钥
   pbcopy < ~/.ssh/id_rsa.pub
   打开id_rsa.pub文件拷贝里面的内容
  - 6.点击 setting —》 ssh key —>add ssh key
    将刚才获取到得公钥添加进去
    ![Snip20160126_24.png](http://upload-images.jianshu.io/upload_images/1482869-55a83561ebc199e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    ![Snip20160126_25.png](http://upload-images.jianshu.io/upload_images/1482869-57686487cdf35778.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  - 7.更具github第4步提示, 验证公钥
    验证成功网页上的灰色圆点会变成绿色
  - 8.拷贝到公钥之后打开github主页      
   》点击仓库(Repositories)
   》再点击new来到github创建仓库界面
   
  - 9.通过github提供的地址下载一个空得仓库到本地
  
   》创建一个新的项目到本地仓库文件夹中
   
   》利用Xcode提交代码到github
   
   》注意:要求输入用户名密码时候,输入的是github上显示的昵称而不是登录账号
 
  ```

6.删除代码仓库

Snip20160126_26.png
Snip20160126_27.png

7.怎么把别人的代码仓库弄到自己的代码仓库


Snip20160126_28.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容