贡献者: addis
Git 是一个文件版本控制程序,常用于管理程序代码,也可以用来管理任何文件。下面简单介绍它的主要功能。
通俗来说,Git 的版本管理功能类似于一个备份软件,它可以保存一个指定的文件夹在许多不同时间点的快照,而且可以浏览、对比、恢复这些快照或者其中的指定文件。这样一个被 Git 管理的文件夹叫做 Git 仓库(repository),简称 repo,他的每个快照叫做一个提交(commit)。你可以给每次 commit 起一个标题,并添加一段描述。
Git 一旦 commit,它将可以保证仓库中每个文件的任何细微的改变(包括文件名、文件位置)都可以被检测到。你可以用 Git 实时查看相对于最近一次 commit 哪些文件发生了改变,以及改变了什么内容,并选择把哪些文件 comit,把哪些修改丢弃等。这样的好处是每次 commit 前你都有机会再次确认所有更改,避免发生误改误触等情况。这对程序代码来说尤为重要。
很多时候,一个项目往往需要多人合作。如果一个 Git 仓库需要多人分别在自己的电脑上修改,或者同一人在不同电脑上修改,那么就需要使用协作的相关功能。这时 Git 可以发挥类似于同步网盘的作用。例如你在电脑上创建了一个 Git 仓库并进行了若干次 commit,你可以让 Git 把该仓库和它的所有 commit 上传到一个配置好的 Git 服务器。然后其他电脑如有需要可以把该仓库从服务器上克隆(clone)到硬盘。从此以后,无论哪台电脑产生新的 commit,都可以将其推(push)到服务器,然后在其他电脑将其拉(pull)下来。这样就实现了内容同步。
通常来说,每次 push 和 pull 是手动的,这样的设计可以有效解决冲突问题:例如 A 电脑和 B 电脑在某次共同的 commit 后,分别 commit 了不同的内容,如果 A 电脑先把新 commit 推到服务器,当 B 电脑试图推送时,就会得到服务器返回的错误提示,这时通常的做法是先把本地的 commit 撤销并备份修改的文件,从服务器 pull 下最新 commit,在该基础上更新仓库,再次 commit 并 push 到服务器。这里最简单的情况是 A 和 B 的新 commit 分别修改的是不同的文件,那么当 B 得到服务器错误后,只需要 pull 一次,git 就会自动完成后面的过程,直接生成以后融合(merge)后的新 commit。
由于 Git 是一个开源免费的软件,并不存在一个 “官方” 的服务器。要实现联网,要么自己搭建服务器,要么使用第三方的代码托管平台。GitHub 是世界最大的代码托管平台,但因为某些原因它经常无法从中国大陆正常访问。而后者当前最大的托管平台是码云(Gitee),由于起步较晚,其规模和质量都和 GitHub 存在较大差距。
Git 还可以给仓库创造不同的分支(branch),例如你创建一个 Git 仓库管理自己的程序代码。每更新一点就做一次 commit,这些 commit 按时间顺序连成一串就是一个分支(图 1 )。通常第一个分支默认的名称是 master
。但一段时间后如果你需要把程序修改出稍有不同版本(例如儿童版、标准版、免费版等)。如果没有 Git,一般的做法是把文件或文件夹复制粘贴多个,然后逐一修改。但如果你每个版本都需要不断继续更新并保存历史快照,或者你需要给所有版本都做某种统一修改,将很容易产生混乱。如果你用 Git,那么你可以基于某次 commit 创建多个分支。每个分支从此以后都会拥有只属于自己的一串 commit。一个分支也可以把别的分支发生的部分改变直接融合(merge)到自己当前分支的 commit 而不需要手动再改一次。在你电脑上,具有多个分支的仓库仍然只是一个文件夹,但你可以随时把文件夹中的内容从一个分支切换到另一个分支。
由于 Git 的分支非常轻量级,这使得用户时常会创建一些临时分支作为草稿使用。例如一个程序仓库的 master 分支只用于储存比较重要的 commit,而日常修改程序时创建一个草稿分支,里面的每次 commit 可能都是一些微小的修改,等到这些修改告一段落,再把该分支最后一次 commit 并入到 master 的一次 commit 并分支删除。
当多人协同编辑时,为了避免冲突,不同的合作者也可以选择创建并修改不同的分支,再定期把这些分支的变化融合(merge)到主分支上。
既然 Git 这么强大,为什么没有被大众广泛使用呢?
为了快速入门我们以下介绍 GitHub Desktop,也就是 GitHub 官方的客户端的使用。虽然目前官方只发布 Windows 和 MacOS 的安装包,但 Linux 系统也可以下载第三方安装包。GitHub Desktop 是一个免费开源软件,源码见 GitHub。
在官网下载 GitHub Desktop 并安装打开,可以登录或注册 GitHub 账号(如果你只想把它用于本地的仓库,则不需要账号或登录)。注意 GitHub Enterprise 是企业账号,个人账号是免费注册的。
登录以后可以选择新建一个 repo 或者从 github 上 clone,我们这里选择新建(如图 4 )。根据提示输入 repo 的名称 test
,描述 learn to use Git
,文件夹储存目录(默认是 Documents/GitHub/
)。勾选 Initialize this repository with a README。然后就可以确定了。
创建完后界面如图 5 所示
单击 History 可以看到左下角已经有一个 Initial commit 了,这是因为刚才勾选了那个选项。所有的 commit 的历史可以在左上角的 History 找到。点击 History 可以看到 Initial commit 中添加了两个文件,README.md
和 .gitattributes
。其中 README.md
是一个文本文档,可以添加 repo 的描述,使用说明等。.gitattributes
文件用于对 Git 做一些设置,例如如何处理换行1。如果新建 repo 的时候没有勾选刚才的选项,就不会有 Initial commit。点击左上角的 Changes 返回刚才的界面。
注意左下角有一个 Undo 按钮。如果按下,Initial commit 将被撤销。再来看右上角的 Push 按钮,这个按钮用于把新增的 commit 上传(即 push)到 GitHub。由于我们从来没有 push 过,现在打开 GitHub 网站是看不到刚刚创建的项目的。按下 push,完成后再刷新浏览器就可以在 GitHub 看到了。
1. ^ Windows 系统的换行使用 CR 和 LF 两个字符,而 Linux 系统中只用一个 LF 字符。