Created by Leozhang2018 / @leozhang2018
问好,之前有看到各位在通过某些途径浏览 Git 的相关知识。相信在座各位至少已经看过了基本的操作,所以今天我就不会填鸭式赘述基本的操作命令(初始化,到add以及commit balabala...),浪费大伙时间的同时,效率也非常之低下。 我相信凭借大家的能力,通过互联网上的众多资源,也应该很快能掌握并适应基本的操作。所以接下来的三次分享里,我会着重分享一些我自己使用 Git 的相关经验技巧和 Git 中难以理解的知识点,以及在实际开发工作流程中使用 Git 可能会遇见的坑,如何去解决和驾驭它们。 OK,here we go.版本控制
例子:网页设计师或者经常从事制图的同学,可能会需要保存某一幅图片或页面布局文件的所有修订版本(渴望工具之一) CVS 可将某个文件回溯到之前的状态,将整个项目都回退到过去某个时间点的状态。比较文件的变化细节,查出修改者以及相关说明。Local Version Control System
采用某种简单的数据库来记录文件的历次更新差异Centralized Version Control System
让在不同系统上的开发者协同工作,比如(SVN), 单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 缺点:中央服务器的单点故障(宕机,停电) 无法提交更新,协同工作。中央服务器的磁盘发生故障,备份(无,不及时)导致丢失数据Distributed Version Control System
完整镜像版本库中代码 协同工作服务器宕机可以方便恢复 同一个项目与不同工作小组的人协作,设定不同的协作流程前世今生
The origin of distributed version control
Linux 内核开发团队使用 Bitkeeper
2002~2005
早期 Linux 团队使用 BitKeeper 维护相关代码,分布式版本控制系统的始祖(收费)。出于 Linux 是公共开源的项目考虑,开发 BitKeeper 的公司也就没有收费,作为工具提供给 Linux 社区使用。 但是好景不长,Linux 团队仅仅使用了 BitKeeper 三年时间。Samba 软件作者
Rsync 算法发明者
Andrew Tridgell,昵称垂居(Tridge),澳洲籍的计算机程序设计师,澳洲国立大学计算机科学博士。以创造 Samba 档案服务器以及 rsync (siNGk)算法著称。 Samba:让 UNIX 系统与 Windows 系统 SMB/CIFS 网络协议做链接的一种自由软件,在 Windows 与 UNIX 系列 OS 之间搭起一座桥梁,让两者的资源共享。rsync: Unix 下同步更新两处计算机的文件与目录并适当利用差分编码以减少数据传输的软件 BitMover 公司宣称 Tridgell 尝试通过逆向工程的方法破解 BitKeeper 的内部协议,决定收回 BitKeeper 的使用权。本地化的版本管理 (完全分布式)
不污染子目录的 track 方式 (SVN每个子目录都要扔.svn)
强大的分支管理功能 (允许上千个并行开发的分支)
轻量简洁,唯 快 不破 (简单的设计)
由GitHub公司(曾称 Logical Awesome)的开发者使用 Ruby on Rails 所开发
用来存放使用 Git 版本控制的软件代码和内容项目
提供代码社交化功能的代码托管网站
全世界最大的 同性交友 网站
2008-02 Github Inc 的服务正式上线
2007 年 10 月 1 日开始开发 ,吉祥物-章鱼猫(Octocat=Octopus(章鱼)+ Cat(猫), Simon Oxley 设计)Bitbucket
Google Code (2016-1-25)
Gitcafe
Coding.net
Git@OSC
Etc ...
5 mins
从安装和配置说起
以 Debian 系的 Ubuntu 为例
$ Sudo apt-get update $ Sudo apt-get install git
(注:非源码安装方式)
源码安装好处:安装最新的版本 缺点:需要编译不适合新手 强烈推荐在 Linux 以及类 Unix 平台使用 Git (在 Unix 风格的 shell 中,可以使用本书中提及的复杂多行的命令) Windows:可以使用安装包 OS X:图形化的包管理工具 Macports 或者 homebrew关键配置文件:
~/.gitconfig
.git/config
/etc/gitconfig
/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。 ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。用户信息
$ git config --global user.name "Leozhang2018" $ git config --global user.email leozhang2018@gmail.com
(--global 参数读写 ~/.gitconfig 配置文件)
说明是谁提交了更新,更新内容一起被永久纳入历史记录指定文本编辑器 (Emacs or Vim)
差异分析工具
外部的合并与比较工具
格式化与空白
一个有趣而强大的命令行视频下载工具
History of Git
Installation and configuration
Github tutorial
分支管理的注意事项
实际工作中利用分支进行开发的流程
Git 在其它环境中之 Git in Zsh
变基(Rebase)
初探 Gitlab
注意事项,工作流程,以及变基
分支管理的注意事项
实际工作中利用分支进行开发的流程
Git 在其它环境中之 Git in Zsh
变基(Rebase)
初探 Gitlab
保险的做法
Classic Work Silos
只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。 这样,在确保这些已完成的特性分支(短期分支,比如之前的 iss53 分支)能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。分支的衍合
Which do you prefer?
只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。 这样,在确保这些已完成的特性分支(短期分支,比如之前的 iss53 分支)能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。Github 上存在主分支, 本地需要修改多个功能和 bug , 于是在多个分支开发不同的功能, 然后合并提交.. 合并和提交的顺序不是确定的, 因此不能简单直接用 merge 每次一个个叠加. 有时我用 rebase, 但有发现 commit 顺序不是时间顺序, 到线上被 merge 以后也不是非常清晰 面对这样的场景, 用怎样的方式管理会更合适呢?
$ git checkout work (去自己的工作分支工作)
$ git commit -a (提交工作修改)
$ git checkout master (切换到主分支)
$ git pull (获取远程最新修改,此时不会产生冲突)
$ $ git checkout work (回到工作分支)
$ git rebase master (用rebase合并主干的修改,如果有冲突在此时解决)
$ git checkout master (切换到主分支)
$ git merge work (合并工作分支的修改,此时不会产生冲突)
$ git push提交到远程版本库