跳转到内容

Git

来自ACM Class Wiki


安装并配置 Git

以下操作请在 WSL 或 Linux / macOS 下进行,不要在 Windows 下进行。

正常情况下(如果完全遵循环境配置文档),你的环境里应该已经有 git 了。在 shell 中执行 git --version 可以确认是否已经安装。若未安装,则可以执行下面的命令来安装:

sudo apt update
sudo apt install git

Git commit 会记录作者是谁;因此,在第一次使用 git 的时候,你需要向 git 声明你的身份。注意,这个身份会被网络上的所有人看到,故不建议使用真实姓名等容易与真实身份产生关联的信息。

请把下面的 Yun Tianmingyuntianming@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 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 常见用法子页面。

一些推荐的资源