你的第一个仓库


一般来说,走到这一步通常有两种情况。一种是你已经有一个项目文件夹了,比如一直在本地写的 weather-app,现在想让 Git 开始记录它的历史。另一种是别人已经把项目建好了,放在 GitHub 上,你想在自己的电脑上弄一份能干活的副本。这两种情况都是从三个简单的命令开始的,读完这一章你就会把这三个命令都实际用一遍。不过在那之前,先花十秒钟做个检查:确认你的电脑上装了 Git。
你安装了 Git 吗?
这本手册里的所有内容都是在终端里进行的,所以第一步是先把终端打开。**终端**是一个你输入文字命令、程序用文字回复你的应用。你的电脑上其实已经装好了:
- macOS:这个应用叫做终端(Terminal)。按 Cmd+Space,输入"terminal",回车。
- Windows:先打开PowerShell(在开始菜单里搜索"powershell")。下面安装 Git 的时候还会顺带装上Git Bash,一个专门为此打造的终端,两者运行的都是同样的 Git 命令。
- **Linux:**找一个叫 Terminal 或 Console 的应用;很多发行版里按 Ctrl+Alt+T 就能打开。
Git 本身是一个命令行程序:它没有自己的窗口,你要输入以 git 开头的命令,然后看它打印出来的结果。这本手册里所有代码块也都是这么读的:以 $ 开头的那一行是你要输入的命令(不包括 $ 本身),下面几行是 Git 的回复。
好了,来做个检查。在终端里输入下面这行,然后回车:
$ git --version
git version 2.45.1只要显示出版本号,就说明 Git 已经装好了,可以开始用了。你看到的版本号很可能跟这里不一样,没关系。如果你看到的是"command not found"或者"git is not recognized",说明你的电脑上还没装 Git,装一次就够了:
- macOS:运行
git --version通常会弹出一个对话框,提示安装苹果的命令行工具(Command Line Tools)。同意就行,macOS 会帮你把 Git 装上。 - Windows:从 git-scm.com/downloads 下载Git for Windows并运行安装程序。默认选项基本都没问题,安装过程中会顺带装上 Git Bash。
- **Linux:**用你所在发行版的包管理器安装
git包,比如在 Ubuntu 和 Debian 上运行sudo apt install git。
安装完成后,关掉终端,重新打开一个,再运行一次 git --version。看到版本号就说明这一步的安装工作永久完成了,这本手册后面的内容不需要再装任何东西。
git --version 能告诉你它是否已经在你的电脑上了:显示版本号说明已经装好了,显示"command not found"就说明得去 git-scm.com 或用你系统自带的安装程序装一下。这一步你只需要做一次。安装配置是任何一本手册里最没意思的部分,能顺利过完这一关,真不错! 把一个文件夹变成仓库
打开终端,用 cd("change directory" 的缩写)进入你的项目文件夹,然后运行一个命令,git init:
$ cd weather-app
$ git init
Initialized empty Git repository in /Users/mara/projects/weather-app/.git/这个文件夹现在就是一个**仓库**了:一个 Git 会持续关注的项目,随时准备在你工作的过程中记录下它的快照。git init 每次做的事情都一样。它会去找一个隐藏的 .git 文件夹,如果没有就创建一个,从这一刻起,这个文件夹就在 Git 的关注之下了。
新建仓库的默认分支名叫 main。如果你碰到的是一个年代久一点的教程、旧仓库,或者几年前录的课程,你会看到同样的东西用的是 master 这个名字:其实是同一个初始分支,只是叫法比较老。这本手册统一用 main。
什么是分支?
分支是你的提交落脚的一条独立历史线,main 就是每个新仓库自带的那一条。分支这一章会讲怎么创建分支、怎么在分支之间切换。
git init 能把任何文件夹变成一个 Git 仓库,让 Git 开始追踪它。在项目文件夹里跑一次就行,之后再跑一次也没关系。新建仓库默认的分支名叫 main,不过你在外面碰到的老仓库很多时候管同一个东西叫 master。 告诉 Git 你是谁
在你第一次提交之前,Git 想知道是谁在做这次提交。设置两个值一次就够,Git 会记住它们,用在你在这台机器上做的每一次提交上:
$ git config --global user.name "陈玛拉"
$ git config --global user.email "[email protected]"你创建的每一次提交都会带上这个名字和邮箱。跳过这一步,Git 会用从你电脑的用户名和主机名猜出来的东西顶替,这样你的提交就带着一个你从未选过的身份。
在第一次提交之前设置好你的姓名和邮箱。如果先提交、后设置,这个错误就会被固化进那次提交的历史里。更麻烦的是,有些托管平台(包括 GitHub)会通过邮箱把提交和你的账号对上号,所以用错误地址或者被猜出来的地址做的提交,看起来就像是某个匿名陌生人的工作成果,而不是你的。
git config --global user.name 和 git config --global user.email 设置的是 Git 会盖在你每次提交上的姓名和邮箱。在第一次提交前就把它们设好,因为在设置邮箱之前做的提交会被归到一个被猜出来的身份上,像 GitHub 这样的托管平台甚至可能完全对不上你的账号。设一次,你机器上的每个仓库都会记住它。 用 git clone 拷贝一个已有的项目
有时候项目已经存在于别的地方了,你只是想在自己电脑上弄一份能干活的副本。git clone 一个命令就能搞定:
$ git clone https://github.com/octocat/Hello-World.git
Cloning into 'Hello-World'...
remote: Enumerating objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Receiving objects: 100% (13/13), done.Git 会创建一个名为 Hello-World 的新文件夹,把项目的全部历史下载进去,并把文件放进这个文件夹里,你马上就能开始读或者编辑了。不需要另外再跑一次 git init。克隆的过程里已经把仓库设置好了,是下载的一部分。
git clone <url> 会把别人的仓库,连同整个历史,下载到一个以项目名命名的新文件夹里。当项目已经存在于某处时用它;当你要从零开始一个项目时用 git init。克隆一结束,你手上就是一份完整的工作副本,随时可以查看或添加内容。 隐藏的 .git 文件夹里都有什么
无论你是用 git init 还是 git clone 建立的,每个仓库根目录下都有一个隐藏的 .git 文件夹。它默认是隐藏的,用 ls -a(ls 列出文件夹的内容,-a 会把隐藏项也列出来)让终端显示完整列表,就能看到它和你的普通项目文件排在一起:
$ ls -a
. .. .git README.md src那个文件夹才是真正的仓库。它保存着你做过的每一次提交、你的分支,以及上一节讲到的配置设置。删掉 .git 文件夹,项目就丢掉了它的全部历史,重新变回一个 Git 不再追踪的普通文件夹。项目里其他的一切,都只是 .git 里保存内容的一份工作副本。
.git 文件夹,它才是真正的仓库:你的整个历史和相关设置都存在那里。在项目里运行 ls -a 就能看到它,因为它默认是隐藏的。除非你真的想抹掉项目的全部历史,否则千万别删它,因为删掉它会让这个文件夹变回一个 Git 不再追踪的普通文件夹。 如果仓库和提交这些概念对你来说还有点模糊,什么是 Git 讲的是这些命令背后建立在的那套心智模型,术语表 对这一章出现的每个词都有简短的解释。等你的身份信息设置好、也有了一个仓库可以练手之后,提交循环 会讲编辑、暂存、提交这套你以后会一直用到的日常流程。

