# Pro Git 阅读笔记

第 1 章:起步

1.1 初次运行 Git 前的配置

  • /etc/gitconfig 文件:

    系统中对所有用户都普遍适用的配置。使用 --system 选项读写。

  • ~/.gitconfig 文件:

    用户目录下的配置文件只适用于该用户。使用 --global 选项读写。

    在 Windows 下路径为:C:\Documents and Settings\$USER\.gitconfig。

  • .git/config 文件:

    这里的配置仅仅针对当前项目有效。

配置用户信息

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

配置文本编辑器

$ git config --global core.editor code

配置差异分析工具

$ git config --global merge.tool code

查看配置信息

$ git config --list

1.2 获取帮助

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

第2章 Git 基础

2.1 获取项目的 Git 仓库

在工作目录初始化新仓库

$ git init

从现有仓库克隆

$ git clone https://github.com/schacon/grit.git

2.2 记录每次更新到仓库

文件状态的变化周期

image

检查当前文件状态

$ git status

跟踪新文件或暂存已修改文件

$ git add [file or folder path]

忽略某些文件

.gitignore 文件的格式规范:

  • 空行和注释(#)被 Git 忽略
  • 可以使用标准的 glob 模式匹配
  • 匹配模式最后跟 / 说明要忽略的是目录
  • 要忽略指定模式模式意外的文件或目录,可以在模式前加上 !取反。

.gitignore 文件例子:

# 忽略以 .a 结尾的文件
*.a 
# 但 lib.a 除外
!lib.a
# 仅仅忽略根目录下的 TODO 文件,但不包括子目录下的 TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt

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

$ git diff

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:

$ git diff --cached
$ git diff --staged  # 效果一样,但更好记。

提交更新

$ git commit -m "Fix benchmarks for speed"

跳过使用暂存区域

在提交的时候,添加 -a 选项,则可以跳过使用暂存区,直接提交。

$ git commit -a -m "Fix benchmarks for speed"
# 相当于(只对修改过的文件有效)。
$ git add .; git commit -m "Fix benchmarks for speed"

删除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(从暂存区域移除),然后提交。

$ git rm hello.txt

移动文件

$ git mv old-filepath new-filepath

2.3 查看提交历史

$ git log

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。

git log 的一些选项:

  • -p

    展示每次提交内容的差异

  • -2

    仅显示最近两次的提交

  • --stat

    显示监要的增改函数的统计

  • --pretty=oneline

    将每个提交放在一行显示(完整哈希)

  • --pretty=format:"%h - %an, %ar : %s"

    以格式化的方式显示提交信息

  • --graph

    以图的方式显示

  • --oneline

    将每个提交放在一行显示(简短哈希)

限制记录范围

使用一下一些选项,可以限制记录的范围:

  • --since, --after

    仅显示指定时间之后的提交

  • --until, --before

    仅显示指定时间之前的提交

  • --author

    仅显示指定作者的提交

  • --committer

    仅显示指定提交者的提交

  • --grep

    仅显示包含选项关键字的提交

$ git log --since=2.weeks
$ git log --pretty="%h - %s" --author=gister --since="2008-01-15" --before="2008-11-01"

2.4 撤销操作

修改最后一次提交

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:

$ git commit -amend -m "message"

取消已经暂存的文件

$ git reset HEAD <file>...

取消对文件的修改

$ git checkout <file>...

2.5 远程仓库的使用

查看当前的远程库

$ git remote -v
$ git remote --verbose

添加远程仓库

$ git remote add [remote-name] [remote-repo-url]

从远程仓库抓取数据

$ git fetch [remote-name]

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。

$ git fetch origin

推送数据到远程仓库

$ git push [remote-name] [branch-name]
$ git push origin master # 默认就是 origin 和 master

查看远程仓库信息

$ git remote show [remote-name]

远程仓库的删除和重命名

$ git remote remove <remote-name>
$ git remote rename <remote-old-name> <remote-new-name>

2.6 打标签

列显已有的标签

$ git tag

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。

轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。

含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。

含附注的标签(使用 -a)

$ git tag -a v1.4 -m "version 1.4"

轻量级标签

$ git tag v1.4-lightweight  # 不用 -a 即创建轻量级的标签

后期加注标签(从以前的提交创建标签)

git tag -a v1.2 9fceb02 

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

$ git show v1.4

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。

$ git push origin v1.4    # 将 v1.4 推送到远程
$ git push origin --tags  # 将所有的新增的标签推送到远程

第 3 章 Git 分支

3.1 何谓分支

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。

Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针,它是一个指向你正在工作中的本地分支的指针。

image

3.2 分支的新建与合并

新建分支

# 新建分支
$ git branch <branch>
# 切换到分支
$ git checkout <branch>

# 新建并切换到分支
$ git checkout -b <branch>

删除分支

$ git branch -d <branch>

合并分支

$ git merge <branch>

3.3 分支的管理

显示前所有分支的清单

$ git branch

$ git branch -v  # 查看最后一个提交对象的信息

显示已合并或未合并的分支

$ git branch --merged
$ git branch --no-merged

3.5 远程分支

拉取远程数据

$ git fetch [remote-name]

推送本地分支

$ git push [remote-name] [branch-name]

跟踪远程分支

跟踪分支是一种和某个远程分支有直接联系的本地分支。

# 创建跟踪分支
$ git checkout -b [branch-name] [remote-name]/[branch-name]
$ git checkout --track [remote-name]/[branch-name]

删除远程分支

推送时分支名前面加冒号,可以删除远程分支。

$ git push [remote-name]:[branch-name]

3.6 rebase

rebase 命令,可以把在一个分支里提交的改变移到另一个分支里重放一遍。

$ git rebase <branch-name>
image

rebase 的风险

一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容