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
- 登录 GitHub → 右上角头像 → Settings
- 左侧 SSH and GPG keys → New SSH key
- Title 随便填,Key 粘贴刚才复制的内容
- 点击 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