Git 学习笔记:从入门到实践

3973 字
20 分钟
Git 学习笔记:从入门到实践

Git 是目前世界上最先进的分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年开发。无论是个人项目还是团队协作,Git 都是现代软件开发的基础设施。本文系统整理 Git 的核心知识,从基础概念到高级技巧,帮助你建立完整的 Git 知识体系。

一、Git 基础概念#

什么是版本控制?#

版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。

Git 的三个工作区域#

工作区(Working Directory)
↓ git add
暂存区(Staging Area / Index)
↓ git commit
本地仓库(Local Repository)
↓ git push
远程仓库(Remote Repository)

Git 文件的四种状态#

状态说明所在区域
Untracked未跟踪,新文件未被 Git 管理工作区
Modified已修改,内容有变化工作区
Staged已暂存,准备提交暂存区
Committed已提交,保存在本地仓库本地仓库

.git 目录结构#

.git/
├── HEAD # 指向当前分支
├── config # 仓库级配置
├── description # 仓库描述(GitWeb 用)
├── hooks/ # 钩子脚本
├── index # 暂存区
├── objects/ # 所有数据对象(blob/tree/commit)
├── refs/ # 分支和标签引用
└── logs/ # 引用日志

二、Git 配置#

三级配置#

级别文件路径命令参数
系统级/etc/gitconfig--system
用户级~/.gitconfig--global
仓库级.git/config--local

优先级:--local > --global > --system

基础配置#

Terminal window
# 设置用户信息
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
# 设置默认编辑器
git config --global core.editor vim
# 设置默认分支名
git config --global init.defaultBranch main
# 查看所有配置
git config --list
# 查看某项配置
git config user.name

常用配置#

Terminal window
# 设置换行符转换(Windows 推荐)
git config --global core.autocrlf true # 提交时 LF,检出时 CRLF
git config --global core.autocrlf input # 提交时 LF,检出时不转换(Mac/Linux)
# 设置颜色输出
git config --global color.ui auto
# 设置 diff 工具
git config --global diff.tool vimdiff
# 设置 merge 工具
git config --global merge.tool vimdiff
# 设置别名(大幅提升效率)
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.last "log -1 HEAD"
git config --global alias.unstage "reset HEAD --"

三、Git 基本操作#

创建仓库#

Terminal window
# 初始化新仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git my-folder # 指定本地目录名
# 克隆特定分支
git clone -b develop https://github.com/user/repo.git

查看状态#

Terminal window
# 查看工作区状态
git status
git status -s # 简洁模式
# 状态标识说明:
# M 修改(已暂存)
# M 修改(未暂存,两个 M 表示暂存后又修改)
# A 新增文件(已暂存)
# D 删除
# ?? 未跟踪的新文件

添加到暂存区#

Terminal window
# 添加单个文件
git add file.txt
# 添加所有变化
git add .
# 添加指定类型
git add *.js
# 交互式添加(选择性暂存)
git add -p # 逐块选择要暂存的内容

提交#

Terminal window
# 提交暂存区内容
git commit -m "feat: add login feature"
# 跳过暂存区,直接提交已跟踪文件的修改
git commit -am "fix: bug in login"
# 修改上一次提交(未推送到远程时)
git commit --amend
git commit --amend -m "新的提交信息"
# 带签名提交
git commit -S -m "signed commit"

提交信息规范(Conventional Commits)#

<type>(<scope>): <subject>
<body>
<footer>

常用 type:

type说明
feat新功能
fix修复 bug
docs文档更新
style代码格式(不影响逻辑)
refactor重构(既非新功能也非修复)
perf性能优化
test测试相关
chore构建/工具/依赖更新

示例:

Terminal window
git commit -m "feat(auth): add OAuth2 login support"
git commit -m "fix(api): handle null response in user endpoint"
git commit -m "docs: update README with installation steps"

查看历史#

Terminal window
# 基本查看
git log
git log --oneline # 单行模式
git log --oneline -10 # 最近 10 条
# 图形化
git log --oneline --graph --all
# 带文件变化
git log --stat
# 按作者
git log --author="name"
# 按时间
git log --since="2024-01-01"
git log --until="2024-12-31"
git log --after="1 week ago"
# 搜索提交信息
git log --grep="fix"
# 搜索代码变化
git log -S "function_name" # 搜索引入/删除某段代码的提交
# 显示每次提交的详细变化
git log -p
# 自定义格式
git log --pretty=format:"%h %an %ar %s"

比较差异#

Terminal window
# 工作区 vs 暂存区
git diff
# 暂存区 vs 最新提交
git diff --staged
git diff --cached # 同义
# 工作区 vs 最新提交
git diff HEAD
# 两个提交之间
git diff commit1 commit2
# 两个分支之间
git diff main..feature
# 只看文件名
git diff --name-only
git diff --name-status

撤销操作#

Terminal window
# 丢弃工作区修改(未暂存)
git checkout -- file.txt
git restore file.txt # Git 2.23+ 推荐
# 取消暂存(保留工作区修改)
git reset HEAD file.txt
git restore --staged file.txt # Git 2.23+ 推荐
# 撤销上一次提交(保留修改在工作区)
git reset --soft HEAD~1
# 撤销上一次提交(保留修改在暂存区)
git reset --mixed HEAD~1
# 彻底撤销上一次提交(丢弃修改!慎用)
git reset --hard HEAD~1
# 回退到指定提交(慎用)
git reset --hard <commit-hash>
# 安全撤销(创建新提交来反向操作)
git revert <commit-hash>
git revert HEAD # 撤销上一次提交

删除与重命名#

Terminal window
# 删除文件(从 Git 和工作区)
git rm file.txt
# 只从 Git 删除(保留本地文件)
git rm --cached file.txt
# 重命名
git mv old-name.txt new-name.txt
# 批量重命名
git mv docs/*.md documentation/

四、Git 分支管理#

分支基础#

Terminal window
# 查看分支
git branch # 本地分支
git branch -a # 所有分支(本地+远程)
git branch -v # 带最后提交信息
# 创建分支
git branch feature-login
# 切换分支
git checkout feature-login
git switch feature-login # Git 2.23+ 推荐
# 创建并切换
git checkout -b feature-login
git switch -c feature-login # Git 2.23+ 推荐
# 重命名分支
git branch -m old-name new-name
git branch -m new-name # 重命名当前分支
# 删除分支
git branch -d feature-login # 已合并的分支
git branch -D feature-login # 强制删除(未合并也删除)

合并分支#

Terminal window
# 合并分支到当前分支
git checkout main
git merge feature-login
# 合并类型:
# 1. Fast-forward(快进):main 没有新提交,直接移动指针
# 2. Three-way merge(三方合并):创建新的合并提交
# 禁止快进合并(保留分支历史)
git merge --no-ff feature-login -m "Merge feature-login into main"
# 合并指定分支的某个提交
git cherry-pick <commit-hash>

合并冲突处理#

Terminal window
# 冲突文件中的标记
<<<<<<< HEAD
当前分支的内容
=======
被合并分支的内容
>>>>>>> feature-login
# 解决步骤:
# 1. 编辑冲突文件,选择/合并内容
# 2. 删除冲突标记
# 3. git add <resolved-file>
# 4. git commit
# 使用工具解决冲突
git mergetool

变基(Rebase)#

Terminal window
# 将当前分支变基到目标分支
git checkout feature
git rebase main
# 变基 vs 合并:
# - merge:保留完整历史,创建合并提交
# - rebase:线性历史,更干净但改写历史
# 交互式变基(修改提交历史)
git rebase -i HEAD~3 # 修改最近 3 次提交
# 交互式变基操作:
# pick 保留提交
# reword 修改提交信息
# edit 修改提交内容
# squash 合并到上一个提交
# drop 删除提交
# 变基冲突解决后继续
git rebase --continue
# 放弃变基
git rebase --abort

暂存工作区#

Terminal window
# 暂存当前工作
git stash
git stash save "描述信息"
# 查看暂存列表
git stash list
# 恢复最近的暂存
git stash pop # 恢复并删除暂存记录
git stash apply # 恢复但保留暂存记录
# 恢复指定暂存
git stash apply stash@{1}
# 删除暂存
git stash drop stash@{0}
git stash clear # 清空所有暂存

五、Git 远程操作#

远程仓库管理#

Terminal window
# 查看远程仓库
git remote
git remote -v # 带 URL
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 修改远程 URL
git remote set-url origin https://github.com/user/new-repo.git
# 删除远程仓库
git remote remove origin
# 重命名
git remote rename origin upstream

推送与拉取#

Terminal window
# 推送到远程
git push origin main
git push origin feature:feature # 推送本地分支到远程同名分支
# 设置上游分支(首次推送后设置)
git push -u origin main
# 之后直接 git push 即可
# 拉取远程更新
git pull origin main # fetch + merge
git pull --rebase origin main # fetch + rebase(推荐,避免不必要的合并提交)
# 获取远程更新(不合并)
git fetch origin
git fetch --all # 获取所有远程仓库
# 删除远程分支
git push origin --delete feature-login
# 推送标签
git push origin v1.0.0
git push origin --tags # 推送所有标签

标签管理#

Terminal window
# 查看标签
git tag
git tag -l "v1.*"
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "Release version 1.0.0"
# 给历史提交打标签
git tag -a v1.0.0 <commit-hash> -m "Release version 1.0.0"
# 删除标签
git tag -d v1.0.0
# 查看标签信息
git show v1.0.0

六、Git 高级技巧#

储藏(Stash)进阶#

Terminal window
# 包含未跟踪文件
git stash -u
# 只储藏指定文件
git stash push -m "message" -- file1.txt file2.txt
# 从储藏创建新分支
git stash branch new-feature stash@{0}
# 查看储藏差异
git stash show -p stash@{0}

重写历史#

Terminal window
# 修改最近 N 次提交信息
git rebase -i HEAD~N
# 将要修改的提交标记为 reword
# 合并多个提交
git rebase -i HEAD~N
# 将要合并的提交标记为 squash
# 删除某次提交
git rebase -i HEAD~N
# 将要删除的提交标记为 drop
# 拆分提交
git rebase -i HEAD~N
# 将要拆分的提交标记为 edit
# 然后分多次提交,最后 git rebase --continue

子模块(Submodule)#

Terminal window
# 添加子模块
git submodule add https://github.com/user/lib.git libs/lib
# 克隆含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 或克隆后初始化
git submodule init
git submodule update
# 更新子模块
git submodule update --remote
# 删除子模块
git rm libs/lib
rm -rf .git/modules/libs/lib

钩子(Hooks)#

钩子脚本位于 .git/hooks/ 目录,Git 会在特定事件触发时执行。

常用钩子:

钩子触发时机用途
pre-commit提交前代码检查、格式化
commit-msg提交信息写入后检查提交信息格式
pre-push推送前运行测试
post-merge合并后更新依赖
pre-rebase变基前检查是否允许变基

示例:使用 pre-commit 运行 ESLint

.git/hooks/pre-commit
#!/bin/bash
npm run lint
if [ $? -ne 0 ]; then
echo "Lint failed. Commit aborted."
exit 1
fi

调试工具#

Terminal window
# 查找引入 bug 的提交
git bisect start
git bisect bad # 标记当前版本有 bug
git bisect good v1.0.0 # 标记某个版本无 bug
# Git 会自动检出中间版本供你测试
# 测试后标记 good/bad,直到找到问题提交
git bisect reset # 结束调试
# 查看文件的每一行最后修改人
git blame file.txt
git blame -L 10,20 file.txt # 只看第 10-20 行
# 查找删除了某段代码的提交
git log -S "deleted_function"
git log -p -S "deleted_function" # 带差异
# 清理未跟踪的文件
git clean -n # 预览将删除的文件
git clean -f # 删除未跟踪文件
git clean -fd # 删除未跟踪文件和目录

Git 工作树(Worktree)#

Terminal window
# 添加工作树(同时在多个分支工作)
git worktree add ../hotfix-branch hotfix
# 查看工作树
git worktree list
# 删除工作树
git worktree remove ../hotfix-branch

七、Git 工作流程#

集中式工作流#

所有人直接在 main 分支上工作,适合小团队。

Terminal window
git pull origin main
# 编辑文件
git add .
git commit -m "update"
git push origin main

功能分支工作流(Feature Branch)#

每个新功能在独立分支开发,通过 PR/MR 合并。

Terminal window
# 创建功能分支
git checkout -b feature/login
# 开发、提交
git add .
git commit -m "feat: implement login"
# 推送并创建 PR
git push origin feature/login
# 在 GitHub/GitLab 上创建 Pull Request
# 代码审查后合并到 main
# 合并后删除分支
git checkout main
git pull origin main
git branch -d feature/login

Git Flow#

经典的分支模型,适合有明确发布周期的项目:

main(生产分支)
├── develop(开发分支)
│ ├── feature/*(功能分支)
│ └── release/*(发布分支)
└── hotfix/*(热修复分支)
分支用途生命周期
main生产环境代码永久
develop最新开发代码永久
feature/*新功能开发临时
release/*发布准备临时
hotfix/*生产紧急修复临时

GitHub Flow#

简化版工作流,适合持续部署:

Terminal window
# 1. 从 main 创建分支
git checkout -b feature-x
# 2. 开发并提交
git add .
git commit -m "feat: implement feature-x"
# 3. 推送并创建 PR
git push origin feature-x
# 4. 代码审查、CI 通过后合并到 main
# 5. 部署 main 分支

Trunk-Based Development#

所有人在主干(main/trunk)上工作,通过特性标志(Feature Flags)控制功能发布。

Terminal window
# 短命分支(1-2 天)
git checkout -b short-lived-feature
# 快速开发
git commit -m "feat: partial implementation"
git push origin short-lived-feature
# 立即合并回 main

八、常见问题与解决方案#

1. 不小心提交了敏感信息#

Terminal window
# 方法1:从历史中彻底删除
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch path/to/file" \
--prune-empty -- --all
# 方法2:使用 BFG 工具(推荐)
# 安装 BFG:https://rtyley.github.io/bfg-repo-cleaner/
bfg --delete-files file-with-secrets.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
# 方法3:如果是最新提交
git reset --soft HEAD~1
git rm --cached path/to/file
git commit -m "remove sensitive file"
# 然后轮换密钥/密码

2. 撤销已推送的提交#

Terminal window
# 安全方式:创建反向提交
git revert <commit-hash>
git push origin main
# 危险方式:强制推送(改写历史)
git reset --hard HEAD~1
git push --force origin main # 慎用!可能影响他人

3. 合并冲突太多怎么办#

Terminal window
# 使用他们的版本
git merge --theirs feature-branch
# 使用我们的版本
git merge --ours feature-branch
# 使用特定版本的文件
git checkout --theirs path/to/file
git checkout --ours path/to/file
# 放弃合并
git merge --abort

4. 恢复删除的分支#

Terminal window
# 查看分支引用日志
git reflog
# 找到分支最后的提交
git reflog | grep "branch-name"
# 恢复分支
git checkout -b recovered-branch <commit-hash>

5. 大文件导致仓库过大#

Terminal window
# 使用 Git LFS 管理大文件
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes
# 迁移已有大文件到 LFS
git lfs migrate import --include="*.psd" --everything
# 查看仓库大小
git count-objects -vH

6. 代码审查(Pull Request)#

Terminal window
# 检出 PR 分支进行本地测试
git fetch origin pull/123/head:pr-123
git checkout pr-123
# 查看 PR 差异
git diff main..pr-123
# 合并 PR
git checkout main
git merge pr-123 --no-ff -m "Merge PR #123"

7. 查找性能问题#

Terminal window
# 查看哪些文件最大
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
sed -n 's/^blob //p' | \
sort -rnk2 | head -10
# 使用 git-sizer 分析仓库
git-sizer --verbose

九、Git 配置文件模板#

全局 .gitconfig 推荐配置#

[user]
name = Your Name
email = your@email.com
[core]
autocrlf = input # Mac/Linux
# autocrlf = true # Windows
editor = vim
pager = less -FRX
[alias]
st = status -sb
co = checkout
br = branch
ci = commit
lg = log --oneline --graph --all --decorate
last = log -1 HEAD --stat
unstage = reset HEAD --
amend = commit --amend --no-edit
wip = !git add -A && git commit -m "WIP"
undo = reset --soft HEAD~1
sync = !git fetch --all --prune && git rebase origin/main
[pull]
rebase = true
[push]
default = current
[merge]
tool = vimdiff
conflictstyle = diff3
[diff]
tool = vimdiff
algorithm = histogram
[init]
defaultBranch = main
[rerere]
enabled = true # 记住冲突解决方案

.gitignore 模板#

# 依赖
node_modules/
vendor/
__pycache__/
*.pyc
# 构建产物
dist/
build/
*.o
*.exe
# 环境配置
.env
.env.local
.env.production
# IDE
.vscode/
.idea/
*.swp
*.swo
# 系统文件
.DS_Store
Thumbs.db
# 日志
*.log
logs/
# 临时文件
tmp/
temp/
*.tmp

十、常用命令速查表#

场景命令
初始化仓库git init
克隆仓库git clone <url>
查看状态git status
添加到暂存git add .
提交git commit -m "msg"
查看历史git log --oneline --graph
创建分支git switch -c <branch>
切换分支git switch <branch>
合并分支git merge <branch>
推送git push origin <branch>
拉取更新git pull --rebase origin main
暂存工作git stash
恢复暂存git stash pop
撤销修改git restore <file>
取消暂存git restore --staged <file>
撤销提交git reset --soft HEAD~1
安全撤销git revert <commit>
查看差异git diff
查看分支git branch -a
删除分支git branch -d <branch>
打标签git tag -a v1.0 -m "msg"
查找问题提交git bisect start
清理仓库git clean -fd

以上内容覆盖了 Git 的核心知识点,从基础操作到高级技巧,以及团队协作的工作流程。建议在实际项目中多练习,Git 的很多功能只有在实际场景中才能真正掌握。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Git 学习笔记:从入门到实践
https://sakura-hu.top/posts/开发工具/git学习笔记/
作者
Sakura
发布于
2026-09-10
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Sakura
Hello, I'm Sakura.
公告
欢迎来到我的博客! 我是Sakura,祝你拥有美好的一天~
分类
标签
最新动态
站点统计
文章
21
分类
7
标签
35
总字数
85,101
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录