Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions book/01-introduction/sections/about-version-control.asc
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
image::images/local.png[本地版本控制图解]

其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。
https://www.gnu.org/software/rcs/[RCS]
的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
https://www.gnu.org/software/rcs/[RCS^] 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。

==== 集中化的版本控制系统

Expand All @@ -51,8 +50,7 @@ image::images/centralized.png[集中化的版本控制图解]

(((version control,distributed)))
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。
在这类系统中,像 Git、Mercurial 以及 Darcs 等,客户端并不只提取最新版本的文件快照,
而是把代码仓库完整地镜像下来,包括完整的历史记录。
在这类系统中,像 Git、Mercurial 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录。
这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

Expand Down
27 changes: 18 additions & 9 deletions book/01-introduction/sections/first-time-setup.asc
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ Git 自带一个 `git config` 的工具来帮助设置控制 Git 外观和行为

在 Windows 系统中,Git 会查找 `$HOME` 目录下(一般情况下是 `C:\Users\$USER` )的 `.gitconfig` 文件。
Git 同样也会寻找 `/etc/gitconfig` 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。
如果你在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在
`C:\Documents and Settings\All Users\Application Data\Git\config` ,Windows Vista 及其以后的版本在
`C:\ProgramData\Git\config` 。此文件只能以管理员权限通过 `git config -f <file>` 来修改。
如果你在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在 `C:\Documents and Settings\All Users\Application Data\Git\config` ,Windows Vista 及其以后的版本在 `C:\ProgramData\Git\config` 。
此文件只能以管理员权限通过 `git config -f <file>` 来修改。

你可以通过以下命令查看所有的配置以及它们所在的文件:

Expand Down Expand Up @@ -64,8 +63,7 @@ $ git config --global core.editor emacs
在 Windows 系统上,如果你想要使用别的文本编辑器,那么必须指定可执行文件的完整路径。
它可能随你的编辑器的打包方式而不同。

对于 Notepad++,一个流行的代码编辑器来说,你可能想要使用 32 位的版本,
因为在本书编写时 64 位的版本尚不支持所有的插件。
对于 Notepad++,一个流行的代码编辑器来说,你可能想要使用 32 位的版本,因为在本书编写时 64 位的版本尚不支持所有的插件。
如果你在使用 32 位的 Windows 系统,或在 64 位系统上使用 64 位的编辑器,那么你需要输入如下命令:

[source,console]
Expand All @@ -75,10 +73,8 @@ $ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -m

[NOTE]
====
Vim、Emacs 和 Notepad++ 都是流行的文本编辑器,通常程序员们会在 Linux 和 macOS
这类基于 Unix 的系统或 Windows 系统上使用它们。
如果你在使用其他的或 32 位版本的编辑器,请在 <<C-git-commands#ch_core_editor>>
中查看设置为该编辑器的具体步骤。
Vim、Emacs 和 Notepad++ 都是流行的文本编辑器,通常程序员们会在 Linux 和 macOS 这类基于 Unix 的系统或 Windows 系统上使用它们。
如果你在使用其他的或 32 位版本的编辑器,请在 <<C-git-commands#ch_core_editor>> 中查看设置为该编辑器的具体步骤。
====

[WARNING]
Expand All @@ -87,6 +83,19 @@ Vim、Emacs 和 Notepad++ 都是流行的文本编辑器,通常程序员们会
例如,在 Windows 上 Git 在开始编辑时可能会过早地结束。
====

[[_new_default_branch]]
==== 默认分支

默认情况下,当你使用 `git init` 创建新仓库时,Git 会创建一个名为 _master_ 的分支。
从 Git 2.28 版本开始,你可以为初始分支设置不同的名称。

要将 _main_ 设置为默认分支名称,请执行:

[source,console]
----
$ git config --global init.defaultBranch main
----

==== 检查配置信息

如果想要检查你的配置,可以使用 `git config --list` 命令来列出所有 Git 当时能找到的配置:
Expand Down
32 changes: 17 additions & 15 deletions book/01-introduction/sections/help.asc
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ $ git help config
----

这些命令很棒,因为你随时随地可以使用而无需联网。
如果你觉得手册或者本书的内容还不够用,你可以尝试在 Freenode IRC 服务器 https://freenode.net[] 上的 `#git` 或 `#github` 频道寻求帮助。
如果你觉得手册或者本书的内容还不够用,你可以尝试在 Libera Chat IRC 服务器 https://libera.chat/[^] 上的 `#git`、`#github` 或 `#gitlab` 频道寻求帮助。
这些频道经常有上百人在线,他们都精通 Git 并且乐于助人。(((IRC)))

此外,如果你不需要全面的手册,只需要可用选项的快速参考,那么可以用 `-h` 选项获得更简明的 ``help'' 输出:
Expand All @@ -31,18 +31,20 @@ usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose

-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
--renormalize renormalize EOL of tracked files (implies -u)
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
--chmod (+|-)x override the executable bit of the listed files
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
--renormalize renormalize EOL of tracked files (implies -u)
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
--sparse allow updating entries outside of the sparse-checkout cone
--chmod (+|-)x override the executable bit of the listed files
--pathspec-from-file <file> read pathspec from file
--pathspec-file-nul with --pathspec-from-file, pathspec elements are separated with NUL character
----

36 changes: 10 additions & 26 deletions book/01-introduction/sections/installing.asc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ $ sudo dnf install git-all
$ sudo apt install git-all
----

要了解更多选择,Git 官方网站上有在各种 Unix 发行版的系统上安装步骤,网址为 https://git-scm.com/download/linux[]。
要了解更多选择,Git 官方网站上有在各种 Unix 发行版的系统上安装步骤,网址为 https://git-scm.com/download/linux[^]。

==== 在 macOS 上安装

Expand All @@ -46,40 +46,28 @@ $ git --version
如果没有安装过命令行开发者工具,将会提示你安装。

如果你想安装更新的版本,可以使用二进制安装程序。
官方维护的 macOS Git 安装程序可以在 Git 官方网站下载,网址为 https://git-scm.com/download/mac[]。
官方维护的 macOS Git 安装程序可以在 Git 官方网站下载,网址为 https://git-scm.com/download/mac[^]。

.Git macOS Installer.
image::images/git-osx-installer.png[Git macOS 安装程序。]

你也可以将它作为 GitHub for macOS 的一部分来安装。
它们的图形化 Git 工具有一个安装命令行工具的选项。
你可以从 GitHub for macOS 网站下载该工具,网址为 https://mac.github.com[]。

==== 在 Windows 上安装

在 Windows 上安装 Git 也有几种安装方法。(((Windows, installing)))
官方版本可以在 Git 官方网站下载。
打开 https://git-scm.com/download/win[],下载会自动开始。
要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/[]。
打开 https://git-scm.com/download/win[^],下载会自动开始。
要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 https://gitforwindows.org[^]。

要进行自动安装,你可以使用 https://chocolatey.org/packages/git[Git Chocolatey 包]。
要进行自动安装,你可以使用 https://community.chocolatey.org/packages/git[Git Chocolatey 包^]。
注意 Chocolatey 包是由社区维护的。

另一个简单的方法是安装 GitHub Desktop。
该安装程序包含图形化和命令行版本的 Git。
它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。(((Powershell)))(((CRLF)))(((credential caching)))
稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。
你可以在 GitHub for Windows 网站下载,网址为 https://desktop.github.com[GitHub Desktop 网站]。


==== 从源代码安装

有人觉得从源码安装 Git 更实用,因为你能得到最新的版本。
二进制安装程序倾向于有一些滞后,当然近几年 Git 已经成熟,这个差异不再显著。

如果你想从源码安装 Git,需要安装 Git 依赖的库:autotools、curl、zlib、openssl、expat 和 libiconv。
如果你的系统上有 `dnf` (如 Fedora)或者 `apt`(如基于 Debian 的系统),
可以使用对应的命令来安装最少的依赖以便编译并安装 Git 的二进制版:
如果你的系统上有 `dnf` (如 Fedora)或者 `apt`(如基于 Debian 的系统),可以使用对应的命令来安装最少的依赖以便编译并安装 Git 的二进制版:

[source,console]
----
Expand All @@ -99,9 +87,7 @@ $ sudo apt-get install asciidoc xmlto docbook2x

[NOTE]
====
使用 RHEL 和 RHEL 衍生版,如 CentOS 和 Scientific Linux 的用户需要
https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F[开启 EPEL 库]
以便下载 `docbook2X` 包。
使用 RHEL 和 RHEL 衍生版,如 CentOS 和 Scientific Linux 的用户需要 https://docs.fedoraproject.org/en-US/epel/#how_can_i_use_these_extra_packages[开启 EPEL 库^] 以便下载 `docbook2X` 包。
====

如果你使用基于 Debian 的发行版(Debian/Ubuntu/Ubuntu-derivatives),你也需要 `install-info` 包:
Expand All @@ -111,8 +97,7 @@ https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F[开启
$ sudo apt-get install install-info
----

如果你使用基于 RPM 的发行版(Fedora/RHEL/RHEL衍生版),你还需要 `getopt` 包
(它已经在基于 Debian 的发行版中预装了):
如果你使用基于 RPM 的发行版(Fedora/RHEL/RHEL衍生版),你还需要 `getopt` 包(它已经在基于 Debian 的发行版中预装了):

[source,console]
----
Expand All @@ -129,8 +114,7 @@ $ sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
以此来解决二进制文件名的不同。

当你安装好所有的必要依赖,你可以继续从几个地方来取得最新发布版本的 tar 包。
你可以从 Kernel.org 网站获取,网址为 https://www.kernel.org/pub/software/scm/git[],
或从 GitHub 网站上的镜像来获得,网址为 https://github.com/git/git/releases[]。
你可以从 Kernel.org 网站获取,网址为 https://www.kernel.org/pub/software/scm/git[^],或从 GitHub 网站上的镜像来获得,网址为 https://github.com/git/git/tags[^]。
通常在 GitHub 上的是最新版本,但 kernel.org 上包含有文件下载签名,如果你想验证下载正确性的话会用到。

接着,编译并安装:
Expand All @@ -149,5 +133,5 @@ $ sudo make install install-doc install-html install-info

[source,console]
----
$ git clone git://git.kernel.org/pub/scm/git/git.git
$ git clone https://git.kernel.org/pub/scm/git/git.git
----
20 changes: 9 additions & 11 deletions book/01-introduction/sections/what-is-git.asc
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[[what_is_git_section]]
=== Git 是什么?

那么,简单地说,Git 究竟是怎样的一个系统呢?
请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。
在学习 Git 时,请尽量理清你对其它版本管理系统已有的认识,如 CVS、Subversion 或 Perforce,
这样能帮助你使用工具时避免发生混淆。尽管 Git 用起来与其它的版本控制系统非常相似,
但它在对信息的存储和认知方式上却有很大差异,理解这些差异将有助于避免使用中的困惑。(((Subversion)))(((Perforce)))
在学习 Git 时,请尽量理清你对其它版本管理系统已有的认识,如 CVS、Subversion 或 Perforce,这样能帮助你使用工具时避免发生混淆。
尽管 Git 用起来与其它的版本控制系统非常相似,但它在对信息的存储和认知方式上却有很大差异,理解这些差异将有助于避免使用中的困惑。(((Subversion)))(((Perforce)))

==== 直接记录快照,而非差异比较

Expand Down Expand Up @@ -36,15 +36,14 @@ Git 更像是一个小型的文件系统,提供了许多以此为基础构建
因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。

举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。
你能立即看到项目历史。如果你想查看当前版本与一个月前的版本之间引入的修改,
Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。
你能立即看到项目历史。
如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。

这也意味着你在离线或者没有 VPN 时,几乎可以进行任何操作。
如你在飞机或火车上想做些工作,就能愉快地提交(到你的 *本地* 副本,还记得吗?),
直到有网络连接时再上传。如你回家后 VPN 客户端不正常,那么也仍能工作。
如你在飞机或火车上想做些工作,就能愉快地提交(到你的 *本地* 副本,还记得吗?),直到有网络连接时再上传。
如你回家后 VPN 客户端不正常,那么也仍能工作。
使用其它系统的话,做到这些是不可能或很费力的。
比如,用 Perforce 的话,没有连接服务器时几乎不能做什么事;而用 Subversion 和 CVS 的话,
你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。
比如,用 Perforce 的话,没有连接服务器时几乎不能做什么事;而用 Subversion 和 CVS 的话,你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。
这样似乎问题不大,但是你可能会惊喜地发现它带来的巨大的不同。

==== Git 保证完整性
Expand All @@ -70,8 +69,7 @@ Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值

你执行的 Git 操作,几乎只往 Git 数据库中 *添加* 数据。
你很难使用 Git 从数据库中删除数据,也就是说 Git 几乎不会执行任何可能导致文件不可恢复的操作。
同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容。但是一旦你提交快照到 Git 中,
就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容。但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。

这使得我们使用 Git 成为一个安心愉悦的过程,因为我们深知可以尽情做各种尝试,而没有把事情弄糟的危险。
更深度探讨 Git 如何保存数据及恢复丢失数据的话题,请参考<<ch02-git-basics-chapter#_undoing>>。
Expand Down
6 changes: 2 additions & 4 deletions book/02-git-basics/sections/getting-a-repository.asc
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ $ git commit -m 'initial project version'
如果你对其它的 VCS 系统(比如说 Subversion)很熟悉,请留心一下你所使用的命令是"clone"而不是"checkout"。
这是 Git 区别于其它版本控制系统的一个重要特性,Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。
当你执行 `git clone` 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库
(虽然可能会丢失某些服务器端的钩子(hook)设置,但是所有版本的数据仍在,详见 <<ch04-git-on-the-server#_getting_git_on_a_server>> )。
事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库(虽然可能会丢失某些服务器端的钩子(hook)设置,但是所有版本的数据仍在,详见 <<ch04-git-on-the-server#_getting_git_on_a_server>> )。

克隆仓库的命令是 `git clone <url>` 。(((git commands, clone)))
比如,要克隆 Git 的链接库 `libgit2`,可以用下面的命令:
Expand All @@ -71,8 +70,7 @@ $ git commit -m 'initial project version'
$ git clone https://github.com/libgit2/libgit2
----

这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 `.git` 文件夹,
从远程仓库拉取下所有数据放入 `.git` 文件夹,然后从中读取最新版本的文件的拷贝。
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 `.git` 文件夹,从远程仓库拉取下所有数据放入 `.git` 文件夹,然后从中读取最新版本的文件的拷贝。
如果你进入到这个新建的 `libgit2` 文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。

如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:
Expand Down
Loading
Loading