Git
安装并配置 Git
以下操作请在 WSL 或 Linux / macOS 下进行,不要在 Windows 下进行。
正常情况下(如果完全遵循环境配置文档),你的环境里应该已经有 git 了。在 shell 中执行 git --version
可以确认是否已经安装。若未安装,则可以执行下面的命令来安装:
sudo apt update sudo apt install git
Git commit 会记录作者是谁;因此,在第一次使用 git 的时候,你需要向 git 声明你的身份。注意,这个身份会被网络上的所有人看到,故不建议使用真实姓名等容易与真实身份产生关联的信息。
请把下面的 Yun Tianming 和 yuntianming@three-body.com 替换为你的名字(昵称)和电子邮箱地址。推荐使用这个电子邮箱地址来注册 GitHub 等平台,这样平台可以自动把 commit 和你的帐号关联起来。
# 请务必替换下面的内容,否则你的 commit 身份会是云天明 git config --global user.name 'Yun Tianming' git config --global user.email 'yuntianming@three-body.com'
配置 Git Hosting
我们建议使用 ssh 协议来进行远端仓库的操作(即使用类似于 git@github.com:user/repo
而不是 https://github.com/user/repo
的链接),而 ssh 协议中充当密码作用的是 ssh 密钥(ssh key)。首先通过以下命令来生成一个 ssh key:
ssh-keygen -b 4096
在它问你密钥应该存储在什么地方的时候,请直接按回车存储在默认位置,否则可能会带来不必要的麻烦。ssh key 的密码可以设置,也可以直接留空。这个密码是可以修改的。
在你注册 GitHub 等 git hosting 服务的账号之后,你需要到个人设置中添加刚生成的 ssh key。首先通过以下命令来查看 ssh key 公钥:
cat ~/.ssh/id_rsa.pub
注意最后的 .pub
;没有 .pub
的 ~/.ssh/id_rsa
是你的私钥,在任何情况下都不应该发送给任何人,包括 GitHub 或者你的助教。
将输出的公钥内容复制到添加密钥的界面中。例如,点击链接打开 GitHub 添加密钥的界面。
如果你换了电脑、重装了系统、重装了 WSL,或不慎删除了你的密钥文件,你需要重复这个生成和添加密钥的过程。密钥是不可以找回的。
最后,你可以通过以下命令确认你是否成功连接到了 GitHub:
ssh git@github.com
注意,在 ssh 要求你确认 GitHub 密钥的时候,需要手动输入 yes
并回车。
Git 中的常见概念
名称 | 定义 |
---|---|
commit | 一个 git 记录的代码版本 |
stage/cache/index | commit 之前的文件暂存(这三个词都代表暂存) |
ref | 一个指向 commit 的指针 |
branch | ref 的一种,用来记录代码的不同分支 |
HEAD | ref 的一种,表示当前代码状态 |
remote | 一个远端 git 仓库 |
remote-tracking branch | 一个远端 git 仓库上 branch 的本地记录 |
常用工具一览
- 常用命令(更多常见用法请见 Git 常见用法子页面)
命令 | 用途 | 备注 |
---|---|---|
git status
|
查看当前 git 仓库的状态 | 推荐在执行 commit 等指令之前先看一下状态 |
git log
|
查看 commit 历史 | 有很多参数,可以自行探索 |
git init
|
在当前目录中创建一个新的 git 仓库 | 当前目录不能已经是一个 git 仓库 |
git clone <url>
|
下载 <url> 这个仓库
|
目标目录不能已经存在 |
git add <path>
|
将 <path> 放入缓冲区
|
commit 只会记录缓冲区中的内容 |
git reset (不带参数)
|
将缓冲区清空 | 文件不会还原 |
git reset <ref>
|
将 HEAD 和当前分支切换到 <ref> 对应的 commit 上
|
有 --soft --hard --mixed 三种模式,默认为 mixed,意为清空缓冲区而不还原文件
|
git commit
|
将缓冲区中的变更记录为一个 commit | 若 commit message 较短,可使用 -m 参数指定 message(特别提醒,commit 之后绝大多数情况都能找回文件,但是如果没有 commit,那么文件一旦丢失,很可能永远丢失,所以请经常 commit)
|
git blame <file>
|
查看指定文件的历史 | 包含每一行是什么时候被谁修改的 |
git remote add origin <url>
|
若仓库不是 clone 下来的,可以使用此命令将仓库关联到远端 | 第一次 push 的时候需要按照提示使用 git push --set-upstream origin master
|
git push
|
将本地内容推送到远端 | 若远端与本地出现分叉则不能推送,使用 -f 选项可以强行推送(这样会把本地的内容覆盖到远端)
|
git fetch
|
同步远端的数据 | 不会改变本地分支的内容 |
git pull
|
将远端内容拉取到本地 | 若远端与本地出现分叉则会失败,此时需手动 merge 或 rebase |
git merge <branch>
|
将 <branch> 的内容合并到当前分支上
|
不会改变 <branch> 的内容
|
git switch <branch>
|
切换到 <branch> 上
|
文件会一起改变 |
git switch -c <branch>
|
创建一个分支并切换过去 | <branch> 不能已经存在
|
git reflog
|
查看 commit switch merge pull checkout 等会改变仓库状态的命令的历史 | 不小心打错了什么的时候可以用来救急 |
.gitignore
:一个文件,用来让 git 忽略某些文件- 可以在 https://github.com/github/gitignore/ 找到一些常用的 gitignore 模板(这里的 gitignore 文件分为语言相关和工具相关,语言相关一般在项目根目录,工具相关的包括 IDE、操作系统等,可能在根目录,也可能在 Global/ 或 community/ 下)
- 即便使用了
.gitignore
,提交前仍然建议git status
检查一下被加进来的文件。
常见用法
见 Git 常见用法子页面。
一些推荐的资源
- Conventional Commits:一个比较常用的 commit message 规范,可以让你的 commit log 看上去更好读;
- 你可以用 GPG key 对你的代码和 commit 进行数字签名;
- git-scm.com,git 的不太官方的官方网站(真正的 git 官网是 kernel.org 上的这个仓库,但是没有什么人会看);
- Learn Git The Super Hard Way,一个 git 内部逻辑的讲解,推荐给想比较深入地探索 git 的同学。