余白

Git 与 GitHub 使用教程

概念速览

概念说明
Git本地版本控制系统,记录文件变更历史
GitHub在线代码托管平台,基于 Git 实现协作与备份
仓库(Repository)项目的版本库,一个项目对应一个仓库
提交(Commit)保存一次变更快照,相当于游戏存档
分支(Branch)从主线分离出独立开发线,互不影响
远程(Remote)云端仓库的别名,最常见的是 origin

安装与初始配置

安装

# Ubuntu/Debian
sudo apt update
sudo apt install git

# macOS(已预装)
# Windows:官网下载 https://git-scm.com

初始配置(全局,只需一次)

git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
git config --global init.defaultBranch main    # 默认分支名设为 main
git config --global --add --bool push.autoSetupRemote true  # push 时自动关联远程

查看配置

git config --list
git config user.name

基础操作

创建仓库

# 在现有项目目录初始化
cd ~/path/to/project
git init

# 克隆远程仓库(首次获取)
git clone https://github.com/username/repo.git
git clone git@github.com:username/repo.git   # SSH 方式(推荐)

查看状态

git status        # 查看当前工作区状态
git status -s     # 简洁输出

添加与提交

# 添加文件到暂存区(staging area)
git add file.txt           # 添加单个文件
git add .                  # 添加所有变更
git add -A                 # 添加所有(包括删除)

# 提交到本地仓库
git commit -m "提交说明"

# 快捷方式:跳过 add 直接提交已跟踪文件
git commit -am "提交说明"

查看历史

git log                        # 详细日志
git log --oneline              # 每条一行,简短显示
git log -5                     # 最近5条
git log --graph --oneline     # 带分支图

撤销操作

# 撤销工作区修改(未 add)
git checkout -- file.txt
git restore file.txt           # 新版写法

# 取消暂存(已 add,未 commit)
git reset HEAD file.txt
git restore --staged file.txt  # 新版写法

# 回退到某个提交(危险操作)
git reset --hard <commit-hash>

分支操作

基本命令

git branch                 # 查看本地分支
git branch -a              # 查看所有分支(含远程)
git branch new-feature     # 创建新分支
git checkout new-feature    # 切换到新分支
git switch new-feature      # 新版写法
git switch -c new-feature   # 创建并切换

# 合并分支
git checkout main           # 切回主分支
git merge new-feature       # 将 new-feature 合并进来

# 删除分支
git branch -d new-feature   # 删除已合并的分支
git branch -D new-feature   # 强制删除未合并的分支

分支命名建议

# 常见命名规范
feature/xxx        # 新功能
fix/xxx           # 修复
docs/xxx         # 文档

远程仓库操作

添加远程仓库

git remote add origin https://github.com/username/repo.git
# 或 SSH 方式(推荐,无需每次输入密码)
git remote add origin git@github.com:username/repo.git

常用远程命令

git remote -v                   # 查看远程仓库地址
git remote set-url origin <url>  # 修改远程地址

git push                        # 推送到远程(首次推送后 push.autoSetupRemote 会自动关联)
git push -u origin main          # 首次推送并追踪分支
git push origin main             # 推送到 main 分支
git push -f                      # 强制推送(慎用,会覆盖远程历史)

git pull                        # 拉取并合并远程变更
git fetch                       # 仅拉取,不合并

GitHub SSH 配置(推荐)

每次 push 不用输入用户名密码,配置一次永久有效。

1. 生成 SSH 密钥

ssh-keygen -t ed25519 -C "你的邮箱"
# 一路回车,使用默认路径 ~/.ssh/id_ed25519

2. 查看公钥

cat ~/.ssh/id_ed25519.pub
# 或
cat ~/.ssh/id_rsa.pub

复制输出的内容。

3. 添加到 GitHub

  1. 登录 GitHub → 右上角头像 → Settings
  2. 左侧 SSH and GPG keys → New SSH key
  3. Title 随便填,Key 粘贴刚才复制的内容
  4. 点击 Add SSH key

4. 验证

ssh -T git@github.com
# 出现 "Hi username! You've successfully authenticated" 即成功

5. 之后克隆/添加远程用 SSH 地址

git clone git@github.com:username/repo.git
git remote add origin git@github.com:username/repo.git

实用工作流

日常开发流程

# 1. 开始新任务前,先拉最新代码
git switch main
git pull

# 2. 创建新分支
git switch -c feature/xxx

# 3. 开发、修改、提交
git add .
git commit -m "完成功能 xxx"

# 4. 推送到远程
git push -u origin feature/xxx

# 5. 在 GitHub 上发起 Pull Request(合并请求)
# 6. 合并后切回主分支
git switch main
git pull

快速同步 Obsidian 笔记到 GitHub

# 进入笔记目录
cd ~/study/lc

# 添加所有变更
git add .

# 提交(仅当有变更时)
if git diff --staged --quiet; then
    echo "没有变更"
else
    git commit -m "同步:$(date '+%Y-%m-%d %H:%M')"
    git push
fi

设置定时自动同步

# crontab -e 添加
*/30 * * * * cd ~/study/lc && git add . && git diff --staged --quiet || git commit -m "auto-sync $(date '+\%Y-\%m-\%d \%H:\%M')" && git push

.gitignore 文件

指定 Git 忽略的文件,不纳入版本控制。

# 在仓库根目录创建 .gitignore
touch .gitignore

# 示例内容
.obsidian/           # Obsidian 配置(个人偏好不同)
.trash/              # 回收站
*.log                # 日志文件
.DS_Store            # macOS 系统文件
node_modules/         # npm 包
__pycache__/         # Python 缓存
*.tmp                # 临时文件
.vscode/             # VSCode 配置(可选)

# 如果已经提交过的文件需要忽略
git rm --cached filename    # 先从仓库移除
# 再加入 .gitignore

常见问题

1. 合并冲突(Conflict)

多人同时修改同一文件时会出现冲突。

# 拉取远程时发现冲突
git pull

# 手动解决冲突后
git add resolved-file.txt
git commit -m "解决冲突"
git push

2. 撤销上一次 commit

git reset --soft HEAD~1     # 保留修改,仅撤销 commit
git reset --hard HEAD~1     # 撤销 commit 并删除修改(危险)

3. 查看远程仓库地址

git remote -v

4. 标签(Tag)

标记重要版本(发布点):

git tag v1.0.0              # 创建轻量标签
git tag -a v1.0.0 -m "版本1.0"   # 创建附注标签
git push origin v1.0.0       # 推送标签到远程

5. 查看谁改了某行代码

git blame file.txt