上个月末在公司内部作了一次《Git基础》的主题分享。这里把分享内容公布出来,希望对一些朋友有用。如果之前没有接触过Git,wikipedia上面已经有非常好的介绍)。

演示文档下载

以下是一些presentation notes,前面的数字对应keynote文档中实际的slide页码。

1. 欢迎参加美团技术学院第三讲《Git基础》

2. linux开源社区以前使用bitkeeper来管理代码,05年bitkeeper公司和linux开源社区蜜月结束,终止了合作关系。linux之父Linus Torvalds完成了Git的最初设计和开发。Git是一套内容寻址文件系统,从内部来看,是一种简单的key-value数据存储。Git继承了unix的优良传统,通过很多小工具结合起来构造了强大稳健的系统。网上流传很多Linus语录,我印象最深的一句是:“talk is cheap, show me the code.”

3. 什么是核心竞争力

5. 最新的开源项目大部分都采用Git来管理,同时越来越多的项目开始迁移到Git,这种趋势已经不可逆转。 目前采用Git的项目有:linux, android, rails, jquery, debian, tornado, samba, redmine, node.js, redis, fedora, perl, gcc, mootools, symfony, cakephp, gnome, kde, compiz, prototype, yui, qt, phpmyadmin, drupal, wine, puppet, yum, vlc, x.org, postgresql, haskell, eclipse, ...

6. 以前的分支开发就像是一次分娩,异常痛苦。在享受过本地分支的快感之后,任何不支持本地分支的版本控制系统都是不人性的,都是反人类的。工程师都是有个性的人,管理程序员就像在放养一群猫。程序员如果觉得这个事情不酷,他就会心情不好,心情不好就不想编程,强迫自己编程就会写出丑陋的代码。使用Git本身就很酷,会让你的心情好起来。

9. Git更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的VCS。

10. tree就类似目录。commit包含tree、timestamp、log,有0个或者多个父对象。

13. 对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。

18. 对远程裸露仓库的第一次提交,需要指定主分支名master。

19. git status会告诉你当前在哪个分支,哪些文件被改动过,哪些修改已经放在暂存区,哪些文件没有被git跟踪。

21. git diff HEAD #和最后一次本地提交之间的差异 git diff origin #和本地仓库原始版本比较

26. 如果只有一个工程师并且代码还从来没有发布上线,那么在主干上开发是没有任何问题的。除此之外,要想快速开发,快速修复线上故障,以及同其他工程师协作,分支开发几乎是必须的。在Git下工作,开分支就像吃饭和呼吸空气一样,本来就是一件轻松自然、顺理成章的事情。

28. 在Git中切换分支可以说是真正的无痛切换

31. 在update hook中约定只有以自己名字开头的分支才能新增和删除

34. 这个工作流的特点是

  • 单主分支结构,即远程和本地都以master作为主分支,工程师在develop分支上开发
  • 本地master作为远程master和本地develop的桥梁,主要做pull和push的操作,保证和远程master同步
  • develop开发完成后,从develop创建mirror用于合并master上最新的改动,合并成功(可能要解决冲突)后,再在master上合并mirror分支并push到远程
  • 发布脚本更新发布机器上的master到最新版本,建立master的发布tag,然后开始发布
  • 线上代码稳定后,删除develop和mirror分支

注意:

  • develop和mirror分支的名字只要是非master的任意名字都可以
  • mirror分支的作用是,如果合并发生冲突,可以保留一份干净的副本,如果改动很小,这个分支也可以不要
  • 发布tag是代码库的快照,方便回滚,注意发布tag不会更新到远程仓库,只相当于一个缓存,命名规范为YmdHis-$commit_hash
  • 回滚操作sync.meituan rollback [$tagname/$commit_hash] 默认回滚最近一次发布,如果指定tagname或者commit_hash则发布对应的代码版本

35. 这个开发工作流非常简单,只需要记住一点:master是连接远程代码库和本地分支的桥梁,桥梁的功能只有一个就是连接。

39. 在开发某个项目的时候,目录会搞得很乱,这是又想切换到其他分支同时又不想提交现在的代码,这时候stash就很有用。

42. 如果觉得最后一次提交的信息不够诗意或者忘记提交了一些重要文件,这时候这个操作就很有用。

43. 衍合的风险 http://progit.org/book/zh/ch3-6.html

48. 最好的学习方法是多练,要把常用的Git操作变成手指的条件反射。