Git 终端命令行管理和SourceTree

前言

iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn。当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦了,而且公司的网络下载一个项目的所有资源起来也有数百M,这还用工作么?

当年,第一次听说github的时候,就听说是使用git来管理的,可是那时的我感觉好复杂,不知道如何入手。如今,对git的使用可以说是很熟练了,不管是使用命令操作还是直接使用GUI界面工具操作。

就让我带着还不会使用git的同志,跨过那些我曾经走过的坑...

创建新仓库

如果我们在本机上想要创建一个新的git仓库,可以直接使用下面的命令:

git init

还有一种命令可以创建仓库:

git init --bare

我相信大家一定会疑问,这两者有什么区别呢?从字面上看,bare就是赤裸裸的意思,也就是说生成用于记录版本库历史记录的.git目录下面的文件而不会包含实际项目源文件的拷贝。进入版本目录,会发现只有.git目录下的文件。这个版本库里面的文件都是.git目录下面的文件,把原本在.git目录里面的文件放在版本库的根目录下面;换句话说,不使用--bare选项时,会生成.git目录以及其下的版本历史记录文件,这些版本历史记录文件就存放在.git目录下;而使用--bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面。

这么多说明是不是头晕了?我们来来测试一下:

cd Desktop/
mkdir testgit1
cd testgit1 
git init
ls
cd .git
ls

这里在桌面创建一个目录叫testgit1,进入到testgit1目录下,然后执行git init来初始化一个仓库。然后,就会生成一个.git目录,然后查看当前目录是否有文件?第一个ls命令是不是什么也没有?是的,默认.git目录是隐藏的。我们进入到.git目录下,查看:

HEAD        config      hooks       objects
branches    description info        refs

下面简单说明一下这几个东东分别干嘛用:

  • HEAD是个头指针,在处理版本切换时,就是这个指针前移、后移等,因此只会生成快照而已,不会重新下载完整的一份代码,所以切换只需要几秒钟就可以在不同的分支上开发了。是不是很方便?

  • config是配置文件,想要看看内部有什么东西,可以直接vi config查看。

  • hooks叫钩子,主要是用于控制commitpush等操作动作,若需要深入了解,可百度,这个东西也是有很深的学问的。

  • objects是存储所有的git对象,关于这个也可以百度阅读相关文章,内容也很多。

  • branches自然是分支的意思,用于管理分支,里面会有所有的分支。

  • description自然是描述信息

  • info这个目录就不清楚具体是干嘛用了

  • refs这个目录有headstags,前者不清楚其用意,后者就是标签,比如我们支持cocoapods的开源库中升级就需要设置tag,对应版本。

git init初始化的版本库,用户可在该目录下执行所有git操作,但别的用户在将push上来的时候容易出现冲突。因此,实际中会将远程服务器端创建一个仓库时,才会使用--bare,而我们个别用户在创建仓库时,不使用--bare

克隆版本

如果是本地的git仓库,就直接使用下面的命令,其中/path/to/repository是绝对路径:

git clone /path/to/repository

如果是在远程服务器这边的仓库,可以用这样的命令。其中username公司给你开的git用户,host是你们公司放置项目代码的服务器,/path/to/repository是远程git仓库的访问路径:

git clone username@host:/path/to/repository

工作流

首先,我们需要理解git版本控制的工作流:

本地仓库由工作目录,它持有实际文件;第二个是缓存区,它像个缓存区域,临时保存你的改动;最后是HEAD,指向你最近一次提交后的结果。

看看官方的图解:

[图片上传失败...(image-9435d9-1533807124122)]

其流程:当前working dir通过add命令添加到stage缓存区中,再通过commit命令提交,HEAD就指向了这次提交的结果。

add命令添加

使用下面的命令添加到缓存区,其中第一行代码是只提交一个文件到缓存区,而第二行代码是添加所有有改动的文件到缓存区:

git add <filename>
git add *

commit命令提交本地

然后我们就可以通过commit提交,其中-m选项是comment的意思,也就是注释,后面跟着一行注释说明:

git commit -m "代码提交信息"

执行完commit后,现在,所做的改动已经提交到了HEAD,但是还没到提交到远端仓库。

push命令推到远端

你的改动现在已经在本地仓库的HEAD中了,执行如下命令以将这些改动提交到远端仓库:

git push origin master

可以把master换成你想要推送的任何分支。 如果当前我们不是在主干上开发,我们提交的代码是要提交到当前正在开发的分支上。假设当前正在开发的分支名称叫:Double11Activity表示双11活动分支。那么我们所做的改动应该推送到Double11Activity分支上。

git push origin Double11Activity

remote add添加远端仓库

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin <server>

其中server就是我们远程git服务器的访问路径。比如:

git remote add origingit@182.92.160.41:/data/git/demo.git

查看仓库是否已经添加到远端git仓库,可使用下面的命令:

git remote -v

如果出现类似这样:

origin  git@server:/Data/git/ios/demo.git (fetch)
origin  git@server:/Data/git/ios/demo.git (push)

假设系统是CentOS系统,其中,git是用户,server是服务器地址,/Data/git/ios/demo.git是具体的项目仓库目录访问地址。

有了这些,我们就能够将本地改动推送到所添加的服务器上去了。

pull命令拉代码

想想多人同时开发时,除了你自己会发动代码之外,其他同事也会改动代码并提交到远端仓库,因此我们每次在提交之前,都应该先pull一下,将其他同事最新的代码拉下来。如果有冲突,则需要先解决冲突,然后合并,且在xcode编译运行通过,再将代码推送到远端仓库。

拉最新代码的命令就很容易了:

git pull

如果出现冲突,一定要解决,否则工程就打不开。如果解决不好,且在本机没有在xcode上跑通,那么一旦提交到远端,其他同事一拉代码,就会导致无法打开,或者编译不通过,会影响他人的工作。

分支branch

分支是用来将敏捷开发的根本。在你创建仓库的时候,master是“默认的”,通常用做主干。在其它分支上进行开发,完成后再将它们合并到主干上。

[图片上传失败...(image-91c91c-1533807124122)]

创建一个叫做feature_x的分支,并切换过去:

git checkout -b feature_x

如果只是创建一个分支而不自动切换到该分支上,可以这样:

git checkout feature_x

想要切换到master上,这样:

git checkout master

删除分支:

git branch -d <分支名>

通常在开发中,每一期的需求在开发之前,都需要建立一个新的分支,并在这个分支上开发。创建之后,我们还需要推送到远端,不然其他同事无法一起参与开发。

git branch -b <branchname>
git push origin <branchname>

合并分支:

git merge <branch>

合并方法:如果要将分支A合并到分支B,那么应该这样:先切换到B分支,然后执行命令:

git merge A

也就是说,A要合并B,就要先切换到A分支,再执行合并命令。如果是B要合并A,就需要先切换到B分支,然后再合并A分支。

对于多人同时开发,尤其多团队敏捷开发的大团队,代码合并是非常麻烦的事。今天下午将其他团队刚上线的版本合并到主干,再将主干合并到当前我们团队与其他团队抽人共同开发的分支上,解决冲突就花了4个小时。

好在没有没有动storybard/xib这些地方,合并也就几个小时就可以了。如果上一期开发做了很多的界面改动,而这个界面原来是由sb/xib开发的话,合并过来就困难了,那些是很难读懂的一串串的东西,不知如何调。因此,对于大团队开发,真的不建议使用xib/sb来开发。

合并之前,可以先查看当前分支与待合并过来的分支的有什么不同:

git diff <source_branch> <target_branch>

注意事项

通常上线的分支都是master,也就是主干,因此在实际开发中,必须保证主干永远是最干净的,只能将主干代码合并到其他分支,然后测试通过并上线后,再合并到主干上

推荐git界面软件:SourceTree

这个软件对于那些不懂命令,也不想用命令的开发者来说,这个软件就是一大福利。

[图片上传失败...(image-972e73-1533807124122)]

我们可以直接将本地的仓库直接添加进来,也可以克隆远端仓库到本地。点击新仓库就可以添加了,其中有四个选项,我们会选择第一个:从URL克隆,也就是git访问地址。

[图片上传失败...(image-43051b-1533807124122)]

这里面有很多个操作,每个就是对应于一个命令,如果不想使用命令操作,可以直接使用这个。

在实际开发中,解决冲突时,我还是要使用这个软件来解决的,因此冲突文件有时候会达到上百个类文件冲突,要花一天时间来解决冲突。

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

推荐阅读更多精彩内容

  • 三大区域: 工作区 → 缓存区 → 本地仓库 一 、 使用 git config 命令进行配置: git ...
    Manchangdx阅读 2,842评论 0 2
  • 1. Git 1.1. Git是何方神圣? Git是用C语言开发的分布版本控制系统。版本控制系统可以保留一个文件集...
    spectatorNan阅读 2,245评论 1 7
  • [TOC] 聊聊Git的使用 一、Git简介 Git是目前世界上最先进的分布式版本控制系统(没有之一)。这个人说的...
    辛小二阅读 700评论 1 0
  • 安装: windows安装git-- msysgit是windows版的git,下载单独的.exe按照默认选项安装...
    alceyp阅读 691评论 0 0
  • 我是一名接受传统教育的…人。 对词语的理解,放在试卷上,符合逻辑,语句通顺,没有错别字,没有歧义,成就了标准答案;...
    乔和阅读 283评论 0 0