精通Git(第2版)读书笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 第 1章 入门 1
    • 1.1 关于版本控制 1
      • 1.1.1 本地版本控制系统 1
  • 第 2章 Git基础 13
    • 2.1 获取Git仓库 13
      • 2.1.1 在现有中初始化Git仓库 13
      • 2.1.2 克隆现有仓库 14
    • 2.2 在Git仓库中记录变更 14
      • 2.2.1 查看当前文件状态 15
      • 2.2.2 跟踪新文件 16
      • 2.2.3 暂存已修改的文件 16
      • 2.2.4 显示更简洁的状态信息 18
      • 2.2.5 忽略文件 18
      • 2.2.6 查看已暂存和未暂存的变更 19
      • 2.2.7 提交变更 21
      • 2.2.8 跳过暂存区 22
      • 2.2.9 移除文件 23
      • 2.2.10 移动文件 24
    • 2.3 查看提交历史 25
    • 2.4 撤销操作 30
      • 2.4.1 撤销已暂存的文件 30
      • 2.4.2 撤销对文件的修改 31
    • 2.5 远程仓库的使用 32
      • 2.5.1 显示远程仓库 32
      • 2.5.2 添加远程仓库 33
      • 2.5.3 从远程仓库获取和拉取数据 34
      • 2.5.4 将数据推送到远程仓库 34
      • 2.5.5 检查远程仓库 35
      • 2.5.6 删除和重命名远程仓库 36
    • 2.6 标记 36
      • 2.6.1 列举标签 36
      • 2.6.2 创建标签 37
      • 2.6.3 注释标签 37
      • 2.6.4 轻量标签 38
      • 2.6.5 补加标签 38
      • 2.6.6 共享标签 39
      • 2.6.7 检出标签 39
    • 2.7 Git别名 40
    • 2.8 小结 41
  • 第3章 Git分支机制 42
    • 3.1 分支机制简述 42
      • 3.1.1 创建新分支 44
      • 3.1.2 切换分支 45
    • 3.2 基本的分支与合并操作 48
      • 3.2.1 基本的分支操作 48
      • 3.2.2 基本的合并操作 52
      • 3.2.3 基本的合并冲突处理 53
      • 3.3 分支管理 55
    • 3.4 与分支有关的工作流 56
      • 3.4.1 长期分支 57
      • 3.4.2 主题分支 58
    • 3.5 远程分支 59
      • 3.5.1 推送 63
      • 3.5.2 跟踪分支 64
      • 3.5.3 拉取 66
      • 3.5.4 删除远程分支 66
  • 总结


前言

这是对《精通Git(第2版)》的关键知识点抽取。


提示:以下是本篇文章正文内容,下面案例可供参考

第 1章 入门 1

1.1 关于版本控制 1

1.1.1 本地版本控制系统 1

1.1.2 集中式版本控制系统 2
1.1.3 分布式版本控制系统 3
1.2 Git简史 4
1.3 Git基础 4
1.3.1 快照,而非差异 4
1.3.2 几乎所有操作都在本地执行 5
1.3.3 Git的完整性 6
1.3.4 Git通常只增加数据 6
1.3.5 三种状态 7
1.4 命令行 8
1.5 安装Git 8
1.5.1 Linux上的安装方法 8
1.5.2 Mac上的安装方法 8
1.5.3 Windows上的安装方法 9
1.5.4 从源码安装 9
1.6 Git的首 次配置 10
1.6.1 用户身份 11
1.6.2 个人编辑器 11
1.6.3 检查个人设置 12
1.7 获取帮助 12
1.8 小结 12

第 2章 Git基础 13

主要内容:

  • 初始化
  • 开始或停止追踪文件、暂存或者提交更改
  • 忽略某些文件和文件模式
  • 撤销错误操作
  • 浏览项目版本历史、查看版本差异

2.1 获取Git仓库 13

2.1.1 在现有中初始化Git仓库 13

git init

2.1.2 克隆现有仓库 14

git clone xxx

创建abc目录,把xxx项目克隆到abc目录

git clone xxx abc

2.2 在Git仓库中记录变更 14

2.2.1 查看当前文件状态 15

git status

2.2.2 跟踪新文件 16

追踪一个新文件–xx

git add xx

2.2.3 暂存已修改的文件 16

暂存已修改的文件–xx

git add xx

面试问题:add的作用?add和commit的区别?
答:add是一个多功能,可以追踪新文件,也可以暂存已修改的文件。可以把git add看做“添加内容到下次提交”。

2.2.4 显示更简洁的状态信息 18

git status -s
git status --short

2.2.5 忽略文件 18

编写**.gitignore**

2.2.6 查看已暂存和未暂存的变更 19

查看当前修改和暂存区的差异

git diff

查看暂存区和上次提交的差异

git diff --staged

使用图形diff工具,书里没展开,需要自己研究,idea已经够用了

git difftool --tool-help

2.2.7 提交变更 21

git commit -m "feature/提交信息"

继续回答之前的问题(add和commit的区别?)。
提交记录(commit)记录的是暂存区中的快照。

2.2.8 跳过暂存区 22

自动把已追踪的文件添加到暂存区,然后再提交。

git commit -a -m "feature/跳过暂存区"

继续回答之前的问题(add和commit的区别?)。
commit可以跳过add。

问题:这一步是只保留修改还是把新文件也加入?
答:只有已有文件会被commit,新文件不可以,需要手动提交。

2.2.9 移除文件 23

注意:如果你真实删除了一个文件其实可以执行git add,但是如果你没有删除他,只是想从暂存区移除,那么你需要使用git rm 命令。

把文件移除状态记录到暂存区

git rm xx

把不想删除的文件从暂存区移除

git rm --cached xx

这里最有用的一个场景是忘记把.idea目录添加到.gitignore。

首先,您需要将.idea文件夹从Git版本控制中移除。为此,可以使用以下命令:

git rm -r --cached .idea

这将会从Git的暂存区(index)中删除.idea文件夹,但不会删除实际的文件。

接下来,您需要提交这个变更到本地仓库:

git commit -m "Remove .idea folder from version control"

现在,您可以将这个变更推送到远程仓库。使用以下命令:

git push origin <branch-name>

请将替换为您要推送到的分支名称,通常是主分支(例如,main或master)。

2.2.10 移动文件 24

git mv file_from file_to

相当于执行了三条命令

mv file_from file_to
git rm file_from
git add file_to

但是我目前感觉直接重命名,然后git add也是可以的,可能是版本问题吧。

2.3 查看提交历史 25

最强大的命令

git log

可以查看所有提交,包括hash、作者信息

git log -p -2

-p显示每次提交引入的差异
-2表示只输出最近两次提交

git log --stat

查看概要,包括改动文件列表、改动文件数量、每个文件有多少增删,以及总计。

git log --pretty=oneline

每次提交信息在一行显示

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

哈希 - 作者, 时间 : 提交主题

git log --since=2.weeks

2.4 撤销操作 30

git commit -m "info"
git add forgotten_file
git commit --amend

当遗漏了某个文件,已经提交了,可以使用–amend把遗漏的合并进之前的提交,最终只会保留一次提交。

2.4.1 撤销已暂存的文件 30

git add a
git add b
git reset HEAD a

把a、b两个文件已经放入暂存区了,又希望把a恢复到已修改但未暂存的状态。

2.4.2 撤销对文件的修改 31

一个特别危险的指令

git checkout -- file

如果确定file的修改内容不需要了,name可以用老版本把当前修改覆盖掉,不可以恢复的。
如果只是需要暂时隐藏,那么使用stash。

2.5 远程仓库的使用 32

2.5.1 显示远程仓库 32

$ git remote
origin
git remote -v
origin  git@ip:pro.git (fetch)
origin  git@ip:pro.git (push)

2.5.2 添加远程仓库 33

git remote add tm [email protected]
git fetch tm
git merge tm/release/2.3 --allow-unrelated-histories

已有仓库,添加一个远程仓库,取了一个tm的简短的名字方便引用,git fetch tm获取tm的全部数据,后续可以访问tm的分支了,也可以和自己的分支合并。

2.5.3 从远程仓库获取和拉取数据 34

git fetch tm

获取tm的全部数据

2.5.4 将数据推送到远程仓库 34

git push origin HEAD

这是我常用的指令,推送到(push) 远端的(origin) 同名分支(HEAD)上

2.5.5 检查远程仓库 35

git remote show origin

查看远端信息,包括追踪信息,推送分支,你刚在本地创建了分支,还没有推送过,那么是没有可以推送的分支的信息的。

2.5.6 删除和重命名远程仓库 36

一般人没有这个权限的吧

在这里插入代码片

2.6 标记 36

2.6.1 列举标签 36

列举所有tag

git tag

列举特定系列tag

git tag -l "v1.2.3*"

2.6.2 创建标签 37

标签包括 注释标签 和 轻量标签

2.6.3 注释标签 37

打标签

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

查看某个标签的信息

git show v1.4

2.6.4 轻量标签 38

不需要-a、-m等选项

git tag v1.4-lw

轻量标签的标签信息也少一些

git show v1.4-lw

2.6.5 补加标签 38

git tag -a v1.2 hash值

2.6.6 共享标签 39

推送标签,和远端git仓库同步标签,类似于推送分支
推送单个

git push origin [tagname]

一次全部推送

git push origin --tags

2.6.7 检出标签 39

不能检出标签,只能在标签上创建一个分支

git checkout -b version2 v2.0.0

2.7 Git别名 40

给git命令起别名,建议还是别学了

2.8 小结 41

第3章 Git分支机制 42

3.1 分支机制简述 42

git存储的是指向快照的指针

3.1.1 创建新分支 44

基于当前工作区创建新分支

git branch newbranch

3.1.2 切换分支 45

git checkout newbranch

切换分支就是将HEAD分支指向newbranch

3.2 基本的分支与合并操作 48

3.2.1 基本的分支操作 48

一个典型场景:
master分支上有个iss53问题需要修复,正在修复,发现一个紧急线上问题需要修复。

git checkout -b iss53 # 根据当前工作区切出iss53分支
vi file1
# 紧急修复
git commit -a -m "fix/修复一部分iss 53"
git checkout master
git checkout -b hotfix # 根据当前工作区切出iss53分支
vi file2
git commit -a -m "fix/hotfix"
git checkout master
git merge hotfix # hotfix是基于master的,所以master只是把指针快进了一下
git branch -d hotfix # 删除hotfix分支
git checkout iss53 # 切回iss53分支
vi file1
git commit -a -m "fix/修复完iss 53"


3.2.2 基本的合并操作 52

git checkout master
git merge iss53 # 与 hotfix 分支的合并不同,此时master不是iss53的祖先了

此时会发生合并提交,git会自动找出公共祖先做合并

3.2.3 基本的合并冲突处理 53

如果出现冲突,git会暂停合并。并标记冲突。上边是当前分支的内容,下边是合入分支的内容。
注意,我们切换到了master然后把iss53合入。

<<<<<<< HEAD: file
当前分支的内容
======
合入分支的内容
>>>>>>> iss53: file

解决冲突之后,

git add file
git commit -m "解决冲突"

3.3 分支管理 55

git branch # 查看本地所有分支
git branch -v # 查看本地所有分支 包括 哈希 状态 最后提交
git branch --merged # 查看本地当前分支包含了哪些分支。例如我从master切出然后修改,那么master是被包含的。反之,例子中master包含了iss53分支

3.4 与分支有关的工作流 56

3.4.1 长期分支 57

3.4.2 主题分支 58

3.5 远程分支 59

git fetch origin # 获取远程服务器数据,更新本地数据,其实没啥用,更新了origin的指针,不影响本地的同名分支

3.5.1 推送 63

git push origin HEAD # HEAD是同名分支的代称,也可以写成
git push origin iss53 # 这是下面的写法的简写
git push origin iss53:iss53 # 这是下面写法的简写
git push origin refs/heads/iss53:refs/heads/iss53

git push origin iss53:newName # 如果希望远程换个名字

3.5.2 跟踪分支 64

如果本地分支还没有创建,那么创建一个和远程同名分支会自动跟踪

git checkout oldbran

也可以创建同时指定追踪的远程分支

git checkout -b newbran origin/master

也可以对一个分支指定追踪的远程分支

git branch -u origin/master

3.5.3 拉取 66

git fetch # 拉取
git merge # 合并

等于

git pull

3.5.4 删除远程分支 66

git push origin --delete <branch_name>

3.6 变基 66
3.6.1 基本的变基操作 66
3.6.2 更有趣的变基操作 69
3.6.3 变基操作的潜在危害 71
3.6.4 只在需要的时候执行变基操作 74
3.6.5 变基操作与合并操作的对比 75
3.7 小结 75
第4章 Git服务器 76
4.1 协议 76
4.1.1 本地协议 76
4.1.2 HTTP协议 78
4.1.3 SSH协议 79
4.1.4 Git协议 80
4.2 在服务器上搭建Git 80
4.2.1 将裸仓库放置在服务器上 81
4.2.2 小型团队配置 82
4.3 生成个人的SSH公钥 83
4.4 设置服务器 84
4.5 Git守护进程 85
4.6 智能HTTP 87
4.7 GitWeb 88
4.8 GitLab 90
4.8.1 安装 90
4.8.2 管理 91
4.8.3 基本用法 93
4.8.4 协作 93
4.9 第三方托管选择 94
4.10 小结 94
第5章 分布式Git 95
5.1 分布式工作流 95
5.1.1 集中式工作流 95
5.1.2 集成管理者工作流 96
5.1.3 司令官与副官工作流 97
5.1.4 工作流小结 97
5.2 为项目做贡献 98
5.2.1 提交准则 98
5.2.2 私有小型团队 100
5.2.3 私有管理团队 105
5.2.4 派生的公开项目 110
5.2.5 通过电子邮件接受补丁的公开项目 113
5.2.6 小结 115
5.3 维护项目 115
5.3.1 使用主题分支 115
5.3.2 应用来自电子邮件的补丁 116
5.3.3 检出远程分支 118
5.3.4 确定引入内容 119
5.3.5 整合所贡献的工作结果 120
5.3.6 为发布版打标签 125
5.3.7 生成构建编号 126
5.3.8 准备发布 126
5.3.9 简报 127
5.4 小结 127
第6章 GitHub 128
6.1 账号设置与配置 128
6.1.1 SSH访问 129
6.1.2 头像 130
6.1.3 电子邮件地址 131
6.1.4 双因素身份验证 132
6.2 为项目做贡献 132
6.2.1 派生项目 132
6.2.2 GitHub流程 133
6.2.3 拉取请求的高 级用法 140
6.2.4 Markdown 144
6.3 项目维护 148
6.3.1 创建新仓库 148
6.3.2 添加协作人员 150
6.3.3 管理拉取请求 150
6.3.4 提醒和通知 155
6.3.5 特殊文件 158
6.3.6 项目管理 159
6.4 组织管理 160
6.4.1 组织的基本操作 160
6.4.2 团队 160
6.4.3 审计日志 162
6.5 GitHub脚本化 162
6.5.1 钩子系统 162
6.5.2 GitHub API 166
6.6 小结 170
第7章 Git工具 171
7.1 选择修订版本 171
7.1.1 单个修订版本 171
7.1.2 提交范围 175
7.2 交互式暂存 177
7.2.1 暂存和取消暂存文件 178
7.2.2 暂存补丁 180
7.3 储藏与清理 181
7.3.1 储藏工作成果 181
7.3.2 灵活运用储藏 183
7.3.3 从储藏中创建分支 184
7.3.4 清理工作 184
7.4 签署工作 186
7.4.1 GPG简介 186
7.4.2 签署标签 186
7.4.3 验证标签 187
7.4.4 签署提交 187
7.4.5 所有人都得签署 189
7.5 搜索 189
7.5.1 git grep 189
7.5.2 Git日志搜索 190
7.6 重写历史 192
7.6.1 修改**近一次提交 192
7.6.2 修改多个提交消息 192
7.6.3 重排提交 194
7.6.4 压缩提交 195
7.6.5 拆分提交 195
7.6.6 超强命令:filter-branch 196
7.7 重置揭秘 197
7.7.1 三棵树 198
7.7.2 工作流 199
7.7.3 重置的作用 203
7.7.4 利用路径进行重置 205
7.7.5 压缩 207
7.7.6 检出 209
7.7.7 小结 210
7.8 合并的高 级用法 211
7.8.1 合并冲突 211
7.8.2 撤销合并 220
7.8.3 其他类型的合并 222
7.9 rerere 225
7.10 使用Git调试 230
7.10.1 文件标注 230
7.10.2 二分查找 232
7.11 子模块 233
7.11.1 开始使用子模块 233
7.11.2 克隆含有子模块的项目 235
7.11.3 开发含有子模块的项目 236
7.11.4 子模块技巧 245
7.11.5 子模块的问题 246
7.12 打包 248
7.13 替换 251
7.14 凭据存储 257
7.14.1 底层实现 258
7.14.2 自定义凭据缓存 259
7.15 小结 261
第8章 自定义Git 262
8.1 配置Git 262
8.1.1 客户端基本配置 262
8.1.2 Git中的配色 265
8.1.3 外部的合并与diff工具 265
8.1.4 格式化与空白字符 268
8.1.5 服务器配置 270
8.2 Git属性 270
8.2.1 二进制文件 271
8.2.2 关键字扩展 273
8.2.3 导出仓库 276
8.2.4 合并策略 277
8.3 Git钩子 277
8.3.1 安装钩子 277
8.3.2 客户端钩子 278
8.3.3 服务器端钩子 279
8.4 Git强制策略示例 280
8.4.1 服务器端钩子 280
8.4.2 客户端钩子 285
8.5 小结 288
第9章 Git与其他系统 289
9.1 作为客户端的Git 289
9.1.1 Git与Subversion 289
9.1.2 Git与Mercurial 298
9.1.3 Git与Perforce 305
9.1.4 Git与TFS 317
9.2 迁移到Git 325
9.2.1 Subversion 325
9.2.2 Mercurial 327
9.2.3 Perforce 329
9.2.4 TFS 330
9.2.5 自定义导入工具 331
9.3 小结 337
第 10章 Git内幕 338
10.1 底层命令和高层命令 338
10.2 Git对象 339
10.2.1 树对象 341
10.2.2 提交对象 343
10.2.3 对象存储 345
10.3 Git引用 346
10.3.1 HEAD 348
10.3.2 标签对象 348
10.3.3 远程引用 349
10.4 包文件 350
10.5 引用规格 352
10.5.1 推送引用规格 354
10.5.2 删除引用 354
10.6 传输协议 354
10.6.1 哑协议 355
10.6.2 智能协议 356
10.6.3 协议小结 359
10.7 维护与数据恢复 359
10.7.1 维护 359
10.7.2 数据恢复 360
10.7.3 移除对象 362
10.8 环境变量 365
10.8.1 全局行为 365
10.8.2 仓库位置 365
10.8.3 路径规格 366
10.8.4 提交 366
10.8.5 网络 366
10.8.6 差异与合并 367
10.8.7 调试 367
10.8.8 杂项 369
10.9 小结 369
附录A 其他环境中的Git 370
附录B 在应用程序中嵌入Git 381
附录C Git命令 390


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(git)