《Pro Git》

1 起步

Git 配置

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

2 Git 基础

2.2 记录每次更新到仓库

忽略某些文件

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

2.3 查看提交历史

选项 说明
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

例如:

  • git log
  • git log -p -2
  • git log --stat
  • git log --pretty=oneline
  • git log --pretty=format:"%h - %an, %ar : %s"
  • git log --pretty=format:"%h %s" --graph

2.4 撤消操作

修改最后一次提交

git commit --amend

2.7 技巧和窍门

自动补全

如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:

$ source ~/.git-completion.bash

Git 命令别名

$ git config --global alias.last 'log -1 HEAD'

3 Git 分支

Git 中是 branch 指向 commit 的指针,HEAD 是指向 branch 的指针!

3.5 远程分支

我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支。比如我们想看看上次同 origin 仓库通讯时 master 分支的样子,就应该查看origin/master 分支。

3.6 分支的衍合

一般我们使用衍合的目的,是想要得到一个能在远程分支上干净应用的补丁 — 比如某些项目你不是维护者,但想帮点忙的话,最好用衍合:先在自己的一个分支里进行开发,当准备向主项目提交补丁的时候,根据最新的 origin/master进行一次衍合操作然后再提交,这样维护者就不需要做任何整合工作

4 服务器上的 Git

远程仓库通常只是一个裸仓库(bare repository) — 即一个没有当前工作目录的仓库。因为该仓库只是一个合作媒介,所以不需要从硬盘上取出最新版本的快照;仓库里存放的仅仅是 Git 的数据。简单地说,裸仓库就是你工作目录中 .git 子目录内的内容。

5 分布式 Git

5.2 为项目作贡献

建议:

  • 首先,请不要在更新中提交多余的白字符(whitespace)。Git 有种检查此类问题的方法,在提交之前,先运行 git diff --check,会把可能的多余白字符修正列出来。
  • 接下来,请将每次提交限定于完成一次逻辑功能。并且可能的话,适当地分解为多次小更新,以便每次小型提交都更易于理解。(如果针对两个问题改动的是同一个文件,可以试试看git add --patch的方式将部分内容置入暂存区域)

涉及到的 Git 命令:

  • 查看服务器新增提交:先git fetch origin,然后git log origin/master ^master
  • 不产生提交的合并:git merge --no-commit --squash featureB

5.3 项目的管理

检出远程分支

长期的合作,建立远程分支,例如:

$ git remote add jessica git://github.com/jessica/myproject.git
$ git fetch jessica
$ git checkout -b rubyclient jessica/ruby-client

临时合作,只需用 git pull 命令抓取远程仓库上的数据,例如:

$ git pull git://github.com/onetimeguy/project.git
  From git://github.com/onetimeguy/project
  * branch HEAD -> FETCH_HEAD
  Merge made by recursive.

决断代码取舍

查看分支上都有哪些新增的提交

比如在 contrib 特性分支上打了两个补丁,仅查看这两个补丁的提交信息,可以用 --not 选项指定要屏蔽的分支 master,这样就会剔除重复的提交历史:

$ git log contrib --not master

查看分支和其他分支间的差异

$ git diff master...contrib

这条命令相当于先用git merge-base contrib master找到公共组件的 SHA-1,然后用git diff 公共组件的 SHA-1

代码集成

一旦特性分支准备停当,接下来的问题就是如何集成到更靠近主线的分支中。此外还要考虑维护项目的总体步骤是什么。

合并流程

一般最简单的情形,是在 master 分支中维护稳定代码,然后在特性分支上开发新功能,或是审核测试别人贡献的代码,接着将它并入主干,最后删除这个特性分支,如此反复。

衍合与挑拣(cherry-pick)的流程

挑拣类似于针对某次特定提交的衍合。它首先提取某次提交的补丁,然后试着应用在当前分支上。如果某个特性分支上有多个提交,但你只想引入其中之一就可以使用这种方法。也可能仅仅是因为你喜欢用挑拣,讨厌衍合。例如git cherry-pick 挑拣的 SHA-1

给发行版签名

加 tag

生成内部版本号

$ git describe master

准备发布

现在可以发布一个新的版本了。首先要将代码的压缩包归档,方便那些可怜的还没有使用 Git 的人们。可以使用git archive

$ git archive master --prefix='project/' | gzip > `git describe master`.tar.gz

这个压缩包解压出来的是一个文件夹,里面是你项目的最新代码快照。你也可以用类似的方法建立一个 zip 压缩包,在git archive加上--format=zip选项:

$ git archive master --prefix='project/' --format=zip > `git describe master`.zip

现在你有了一个 tar.gz 压缩包和一个 zip 压缩包,可以把他们上传到你网站上或者用 e-mail 发给别人。

制作简报

使用git shortlog命令可以方便快捷的制作一份修改日志(changelog),告诉大家上次发布之后又增加了哪些特性和修复了哪些 bug。实际上这个命令能够统计给定范围内的所有提交; 假如你上一次发布的版本是 v1.0.1,下面的命令将给出自从上次发布之后的所有提交的简介:

$ git shortlog --no-merges master --not v1.0.1

原文地址:https://www.cnblogs.com/jffun-blog/p/11108407.html

时间: 2024-08-25 09:15:39

《Pro Git》的相关文章

《Pro Git》笔记3:分支基本操作

<Pro Git>笔记3:Git分支基本操作 分支使多线开发和合并非常容易.Git的分支就是一个指向提交对象的可变指针,极其轻量.Git的默认分支为master. 1.Git数据存储结构和分支 git提交时会将暂存文件的内容,暂存的目录结构,提交对象,含附注标签对象都以包含信息头的二进制文件形式存储到版本库中(.git/objects目录),存储的对象以其自身SHA1值作为唯一标识,SHA1前两位为存储对象所在目录名,SHA1后38位为存储对象的文件名.存储的数据对象类型有: blob(文件内

《Pro Git》阅读随想

之前做版本管理,我使用最多的是SVN,而且也只是在用一些最常用的操作.最近公司里很多项目都开始上Git,借这个机会,我计划好好学习一下Git的操作和原理,以及蕴含在其中的设计思想.同事推荐了一本<Pro Git>,读起来感觉很好,在这里分享下阅读时的思考.此书的在线阅读地址:http://iissnan.com/progit/ 第一章 起步 这一章介绍了Git的相关历史和基本特点,以及安装配置方法.这里提到的Git的特点包括“直接记录快照,而非差异比较”.“近乎所有操作都是本地执行”.“时刻保

Git学习圣经《Pro Git》第二版

Git已经成为最流行的分布式版本控制系统,GitHub.CSDN CODE等提供的代码托管服务都是基于Git的.<Pro Git>由GitHub员工Scott Chacon和另一位爱好者Ben Straub共同编写,主要介绍了Git使用基础和原理,适合Git爱好者和初学者参考. 官网:http://git-scm.com/book/en/v2中文翻译:http://git-scm.com/book/zh/v1(第一版) 各种格式下载: PDF格式 Epub格式 Mobi格式 HTML在线阅读

《Pro Git》学习笔记

1.Git远程模型示意图 Remote:远程仓库 Repository:本地仓库 Index:暂存区 workspace:当前工作区 2.取得Git仓库 2.1 初始化新仓库     git init 2.2 从现有仓库克隆     git clone git://github.com/xxx/xxx.git [dirName] 3.记录每次更新到仓库 3.1 文件状态变化周期 3.2 检查当前文件的状态     git status 3.3 跟踪新文件     git add <fileNam

《Pro AngularJS》学习小结-01

<Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的server开发环境是Deployed,从来没听说过,而且作者也说该server没什么人用,我干脆弃用之.其他的环境包括 NodeJS--这个必须装 karma--测试环境,前期还没有用到,以后认真研究,毕竟AngularJS一大特点是Unit Test bootstrap--这个现在应该普遍使用了,O(∩_∩)O webstorm--现在唯一支持AngularJS插件的IDE 我基本

Pro Git CN Plus

Git — The stupid content tracker, 傻瓜内容跟踪器.Linus 是这样给我们介绍 Git 的. Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便. Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要. Git 最为出色的是它的合并跟踪(merge tracing)能力. 实际上内核开发团队

《Pro Android Graphics》读书笔记之第六节

Android UI Layouts: Graphics Design Using the ViewGroup Class Android ViewGroup Superclass: A Foundation for Layouts The ViewGroup LayoutParams Class: Layout Parameters Deprecated Layouts: AbsoluteLayout and SlidingDrawer absoluteLayout 3 version 1.5

《Pro Android Graphics》读书笔记之第二节

Android Digital Video: Formats, Concepts and Optimization Android Digital Video Formats: MPEG4 H.264 and WebM VP8 H.263 支持老显示器 MPEG4 SP   supported for commercial video(支持商业视频) 3GP Google在2.3.3中加入对WebM的支持 video Stream 4.0以后版本 recommend using MPEG-4 H

《Pro Android Graphics》读书笔记之第五节

Android DIP: Device-independent Pixel Graphics Design How Android Supports Device Displays: UI Design and UX Device Display Concepts: Size, Density, Orientation, DIP size Type small,normal,large,extra large,extra extra large screen density the number