12bet,的读书笔记

Git基础

取得项目的Git仓库

12bet,从当前目录初始化

12bet,要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:

$ git init

从现有仓库克隆

如果12bet,想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来,这就需要用到git clone命令

如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令最后指定:

$ git clone git://github.com/lingyucoder/test.git dest

记录每次更新到仓库

工作目录下面的所有文件只有两种状态:已跟踪未跟踪。已跟踪的文件被纳入版本控制管理中

  • 未跟踪->未修改:添加文件
  • 未修改->未跟踪:移除文件
  • 未修改->已修改:修改文件
  • 已修改->已保存:暂存文件
  • 已保存->未修改:提交

检查当前文件状态

要确定哪些文件当前处于什么状态,可以用 git status 命令

跟踪新文件

使用命令 git add 开始跟踪一个新文件

暂存已修改文件

已跟踪文件的内容发生了变化,但还没有放到暂存区。12博体育,要暂存这次更新,需要运行 git add 命令

git add是个多功能命令,根据目标文件的状态不同,12博体育,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等

忽略某些文件

创建一个名为 .gitignore 的文件,列出要忽略的文件模式,文件 .gitignore 的格式规范如下:

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

查看已暂存和未暂存的更新

如果要查看具体修改了什么地方,可以用 git diff 命令。若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached 命令。

提交更新

一定要确认还有什么修改过的或新建的文件还没有 git add过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用 git status看下,是不是都已暂存起来了,然后再运行提交命令 git commit

跳过使用暂存区域

Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:

$ git rm --cached readme.txt

移动文件

要在 Git 中对文件改名,可以这么做:

$ git mv file_from file_to

运行 git mv 就相当于运行了下面三条命令:

$ mv README.txt README
$ git rm README.txt
$ git add README

查看提交历史

在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令。

-p 选项展开显示每次提交的内容差异

-n 则仅显示最近的n次更新。

--stat,仅显示简要的增改行数统计:

--pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用 oneline将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 shortfullfuller 可以用

$ git log --pretty=oneline

--pretty=format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析

$ git log --pretty=format:"%h - %an, %ar : %s"

所有占位符写法及其意义:

  • %H:提交对象(commit)的完整哈希字串
  • %h:提交对象的简短哈希字串
  • %T:树对象(tree)的完整哈希字串
  • %t:树对象的简短哈希字串
  • %P:父对象(parent)的完整哈希字串
  • %p:父对象的简短哈希字串
  • %an:作者(author)的名字
  • %ae:作者的电子邮件地址
  • %ad:作者修订日期(可以用 -date= 选项定制格式)
  • %ar:作者修订日期,按多久以前的方式显示
  • %cn:提交者(committer)的名字
  • %ce:提交者的电子邮件地址
  • %cd:提交日期
  • %cr:提交日期,按多久以前的方式显示
  • %s:提交说明

onelineformat 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况

其他选项

git log命令的其他选项:

  • -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(后跟指定格式)。

限制输出长度

-<n> 选项的写法,其中的 n 可以是任何自然数,表示仅显示最近的若干条提交。

另外还有按照时间作限制的选项,比如 --since--until

--author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字

如果要得到同时满足这两个选项搜索条件的提交,就必须用 --all-match 选项

如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。

  • -<n> 仅显示最近的 n 条提交
  • --since, --after 仅显示指定时间之后的提交。
  • --until, –before 仅显示指定时间之前的提交。
  • --author 仅显示指定作者相关的提交。
  • --committer 仅显示指定提交者相关的提交。

撤销操作

修改最后一次提交

想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:

$ git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,而所提交的文件快照和之前的一样。

取消已经暂存的文件

可以使用 git reset HEAD <file>... 的方式取消暂存某些文件

取消对文件的修改

$ git checkout -- someFile.js

这样someFile.js文件就恢复到修改前的版本了。

远程仓库的使用

查看当前的远程库

git remote 命令,它会列出每个远程库的简短名字。也可以加上 -v 选项(译注:此为 --verbose 的简写,取首字母),显示对应的克隆地址

添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]

从远程仓库抓取数据

可以用下面的命令从远程仓库抓取数据到本地:

$ git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。git fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支。如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。

推送数据到远程仓库

将本地仓库中的数据推送到远程仓库需要使用命令: git push [remote-name] [branch-name]

如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,并到自己的项目中,然后才可以再次推送

查看远程仓库信息

可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息

远程仓库的删除和重命名

可以用 git remote rename 命令修改某个远程仓库的简短名称

需要移除对应的远端仓库,可以运行 git remote rm 命令

打标签

列出已有的标签

列出现有标签的命令非常简单,直接运行 git tag

新建标签

Git 使用的标签有两种类型:

  1. 轻量级的(lightweight):轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
  2. 含附注的(annotated):实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证

一般我们都建议使用含附注型的标签,以便保留相关信息

含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

$ git tag -a v1.4 -m 'my version 1.4'

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取Signed 的首字母

轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a-s-m 选项都不用,直接给出标签名字即可

验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

如果要一次推送所有(本地新增的)标签上去,可以使用 --tags 选项

技巧和窍门

Git 命令别名

可以用 git config 为命令设置别名。来看看下面的例子:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status