git装逼指南

git是什么,有什么特点,相比svn神马的有什么优势,这些已经有太多文章可以搜索到了,没什么好介绍的,本文主要深入讲解和分析一下git在技术团队的工作流程中实用的姿势和技巧,一些冷门的操作在这篇文章里不会涉及,我只教你如何以git初学者的身份装逼成老司机。

姿势点0:git的发音

千万别小看技术词汇的发音,发音的不标准一个是会在和老司机们沟通时产生障碍,再一个如果你正处于技术撕逼状态的时候,很可能被老司机纠住发音不放,从而降低你的技术权威性,让你的撕逼处于弱势。

那么git这个词到底怎么发音呢?这个要从git的起源说起,git的作者是大名鼎鼎的Linus Torvalds,没错,就是IT届最大嘴炮——Linux之父。Linux开源之初,代码托管在一个叫BitKeeper的收费分布式版本管理软件上,然而由于猪队友Andrew Tridgell不爽收费逆向了BitKeeper,BitKeeper一怒之下收回了授权,逼得Linus只能自己开发一套了。那么这个新的分布式版本管理系统叫什么名字呢?git的官方wiki给出了关于这个名字的解释:

2F7058EF-97C5-4F77-A56E-8D0AFADD0D42

大意是Linus觉得自己是个混蛋蠢货,他用自己的名字命名了Linux,那就用自己的另一个名字命名git,git在俚语里是混蛋蠢货的意思。

知道了git的含义,那么git的发音就呼之欲出了,音标/gɪt/,标准英语和美式英语在这个词的发音上略有不同,英式发“给特”音,美式发“get”音,所以,以后千万不要想当然的发出“鸡特”这样的音。

姿势点1:什么是分布式版本管理

任何讲git的文章都绕不开这个姿势点,所有关于git的操作技巧都是基于这个姿势点的理解,也是一切装逼的基础。

分布式版本管理一句话解释就是每个人的机器上都有一个独立的版本仓库,远程服务器上有个大的版本仓库,可以把大家的版本仓库联系起来。

好处有两个:

我们可以自己跟自己玩,本地弄得一塌糊涂都没有关系,只要你不push到远程仓库。

可以做到代码的灾备,如果是svn,仓库服务器毁了要恢复非常困难,因为你要判断谁是那个代码最全的人,而git不用,重新建个远程仓库,大家修改下git远程仓库地址,然后该怎样还怎样。

上一git的物理架构图,大家感受下,先看看结构,其他的东西等看完这篇文章再回过头来感受,有助于你更好的装逼:

git架构

 

姿势点2:常规操作

学习任何技术,都不能只停留在理论淡逼的层面,一定要亲自去实践,不然老司机几句话就能揭开你装逼的真相。下面了解下在代码工作中常见的操作命令,并亲自去实践感受一下(代码仓库推荐先使用全球最大同性交友网站github.com提供的托管仓库,后面可以尝试自己搭建)

0df9740f9b41522ab12c14dbbf6bbad4_r

这是一张常用命令流程图,简单讲讲操作流程

首先在远程服务器建好项目仓库(repo),使用git clone命令同步到本地。【注:此处也可以使用git init命令在本地建好仓库,再git add、git commit文件改动,然后git remote add origin设置远程仓库url,最后git push】

然后你就可以写代码了,写完了想提交代码?记住一套组合拳:git add–》git commit–》git pull–》(如果有冲突或合并)git commit–》本地测试–》git push。按照这个顺序去操作,很少会遇到奇葩问题,除非碰到猪队友。这个时候用过svn的朋友就要叫了,提交个代码这么复杂,真的好吗?那么我们来结合下面一个姿势点来解释svn控的疑问。

姿势点3:本地三区

你的本地结构由 git 维护的三个区域组成。第一个是你的工作区即 工作目录,它持有实际文件;第二个是 暂存区(Index/stage),它像个缓存区域,临时保存你的改动;最后是 仓库区,它存储了你从远程同步的所有分支还有你自己本地提交的内容,它的HEAD指针指向你最后一次commit的结果。

这就是git一次提交要很多命令的原因,它最大限度的考虑到了代码工作的流程以及可反悔可恢复的程度。

比如说,你正在你的文件a上开发一个新功能,这时候,有个关于a上bug反馈过来,你需要紧急提交,没有这个暂存区你就傻逼了,有了暂存区,你可以很方便的先暂存你的修改,然后切换线上分支回源到修改前的a,再把a的bug改完,提交,再切回来继续你的苦逼工作。

当让这个暂存区还有管理提交的作用,在提交之前多了一层回溯和保护,这三区包括远程仓库的版本回退,我们将在后面的姿势点中涉及。

 

姿势点4:分支与tag

说到分支和tag,svn基于文件夹的分支与tag管理简直弱爆了!这也是git如此迷人的原因。

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。一个标准的技术团队工作在其他分支上进行各个特性的开发,完成后再将它们合并到主分支上。具体分支的分布方式各个团队需要按照自己团队的流程来制定。

创建一个叫做“feature_x”的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的
git push origin <branch>

为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:
git log
你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。

姿势点5:更新与合并

要更新你的本地仓库至最新改动,执行:
git pull
以在你的工作目录中 获取(fetch)合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>

姿势点6:版本回退

我们已经知道,git的控制区域一共有四个,本地三区加上一个远程仓库。那么具体到反悔操作,就一共有四种。

第一种:工作区的修改反悔(还未add)

git checkout — <file>

第二种:add之后反悔

git reset HEAD <file>

第三种:commit之后反悔

git reset –hard <commit_id >

第四种:push之后反悔(远程版本回退)

git revert <commit_id >

git push

切忌push的时候使用–force

姿势点7:冲突

修改冲突可以使用一些图形化的工具,不过我习惯用vim了,这里就不再多介绍。

姿势点8:一些小的高级tips

git和jenkins可以组合成非常方便的开发–》测试–》预发–》发布工作流程

git+docker+jenkins可以构建非常牛逼devOps环境

操作git尽量使用命令行,简洁、直观。

经常使用git status来查看文件状态,防止误操作

遇到版本控制的问题时不要慌,沉住气,尤其是上线之前,不要问我怎么知道的!

声明:如未作说明,则本文为 渣滓洞【解旻的博客】 原创。转载务必注明出处
注意:转载须保留全文,如需修改请联系作者

本文永久地址:http://xieminis.me/?p=394