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
基础配置
# 设置用户信息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常用配置
# 设置换行符转换(Windows 推荐)git config --global core.autocrlf true # 提交时 LF,检出时 CRLFgit 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 statusgit config --global alias.co checkoutgit config --global alias.br branchgit config --global alias.ci commitgit config --global alias.lg "log --oneline --graph --all"git config --global alias.last "log -1 HEAD"git config --global alias.unstage "reset HEAD --"三、Git 基本操作
创建仓库
# 初始化新仓库git init
# 克隆远程仓库git clone https://github.com/user/repo.gitgit clone https://github.com/user/repo.git my-folder # 指定本地目录名
# 克隆特定分支git clone -b develop https://github.com/user/repo.git查看状态
# 查看工作区状态git statusgit status -s # 简洁模式
# 状态标识说明:# M 修改(已暂存)# M 修改(未暂存,两个 M 表示暂存后又修改)# A 新增文件(已暂存)# D 删除# ?? 未跟踪的新文件添加到暂存区
# 添加单个文件git add file.txt
# 添加所有变化git add .
# 添加指定类型git add *.js
# 交互式添加(选择性暂存)git add -p # 逐块选择要暂存的内容提交
# 提交暂存区内容git commit -m "feat: add login feature"
# 跳过暂存区,直接提交已跟踪文件的修改git commit -am "fix: bug in login"
# 修改上一次提交(未推送到远程时)git commit --amendgit 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 | 构建/工具/依赖更新 |
示例:
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"查看历史
# 基本查看git loggit 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"比较差异
# 工作区 vs 暂存区git diff
# 暂存区 vs 最新提交git diff --stagedgit diff --cached # 同义
# 工作区 vs 最新提交git diff HEAD
# 两个提交之间git diff commit1 commit2
# 两个分支之间git diff main..feature
# 只看文件名git diff --name-onlygit diff --name-status撤销操作
# 丢弃工作区修改(未暂存)git checkout -- file.txtgit restore file.txt # Git 2.23+ 推荐
# 取消暂存(保留工作区修改)git reset HEAD file.txtgit 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 # 撤销上一次提交删除与重命名
# 删除文件(从 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 分支管理
分支基础
# 查看分支git branch # 本地分支git branch -a # 所有分支(本地+远程)git branch -v # 带最后提交信息
# 创建分支git branch feature-login
# 切换分支git checkout feature-logingit switch feature-login # Git 2.23+ 推荐
# 创建并切换git checkout -b feature-logingit switch -c feature-login # Git 2.23+ 推荐
# 重命名分支git branch -m old-name new-namegit branch -m new-name # 重命名当前分支
# 删除分支git branch -d feature-login # 已合并的分支git branch -D feature-login # 强制删除(未合并也删除)合并分支
# 合并分支到当前分支git checkout maingit 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>合并冲突处理
# 冲突文件中的标记<<<<<<< HEAD当前分支的内容=======被合并分支的内容>>>>>>> feature-login
# 解决步骤:# 1. 编辑冲突文件,选择/合并内容# 2. 删除冲突标记# 3. git add <resolved-file># 4. git commit
# 使用工具解决冲突git mergetool变基(Rebase)
# 将当前分支变基到目标分支git checkout featuregit rebase main
# 变基 vs 合并:# - merge:保留完整历史,创建合并提交# - rebase:线性历史,更干净但改写历史
# 交互式变基(修改提交历史)git rebase -i HEAD~3 # 修改最近 3 次提交
# 交互式变基操作:# pick 保留提交# reword 修改提交信息# edit 修改提交内容# squash 合并到上一个提交# drop 删除提交
# 变基冲突解决后继续git rebase --continue
# 放弃变基git rebase --abort暂存工作区
# 暂存当前工作git stashgit 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 远程操作
远程仓库管理
# 查看远程仓库git remotegit remote -v # 带 URL
# 添加远程仓库git remote add origin https://github.com/user/repo.git
# 修改远程 URLgit remote set-url origin https://github.com/user/new-repo.git
# 删除远程仓库git remote remove origin
# 重命名git remote rename origin upstream推送与拉取
# 推送到远程git push origin maingit push origin feature:feature # 推送本地分支到远程同名分支
# 设置上游分支(首次推送后设置)git push -u origin main# 之后直接 git push 即可
# 拉取远程更新git pull origin main # fetch + mergegit pull --rebase origin main # fetch + rebase(推荐,避免不必要的合并提交)
# 获取远程更新(不合并)git fetch origingit fetch --all # 获取所有远程仓库
# 删除远程分支git push origin --delete feature-login
# 推送标签git push origin v1.0.0git push origin --tags # 推送所有标签标签管理
# 查看标签git taggit 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)进阶
# 包含未跟踪文件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}重写历史
# 修改最近 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)
# 添加子模块git submodule add https://github.com/user/lib.git libs/lib
# 克隆含子模块的仓库git clone --recursive https://github.com/user/repo.git# 或克隆后初始化git submodule initgit submodule update
# 更新子模块git submodule update --remote
# 删除子模块git rm libs/librm -rf .git/modules/libs/lib钩子(Hooks)
钩子脚本位于 .git/hooks/ 目录,Git 会在特定事件触发时执行。
常用钩子:
| 钩子 | 触发时机 | 用途 |
|---|---|---|
pre-commit | 提交前 | 代码检查、格式化 |
commit-msg | 提交信息写入后 | 检查提交信息格式 |
pre-push | 推送前 | 运行测试 |
post-merge | 合并后 | 更新依赖 |
pre-rebase | 变基前 | 检查是否允许变基 |
示例:使用 pre-commit 运行 ESLint
#!/bin/bashnpm run lintif [ $? -ne 0 ]; then echo "Lint failed. Commit aborted." exit 1fi调试工具
# 查找引入 bug 的提交git bisect startgit bisect bad # 标记当前版本有 buggit bisect good v1.0.0 # 标记某个版本无 bug# Git 会自动检出中间版本供你测试# 测试后标记 good/bad,直到找到问题提交git bisect reset # 结束调试
# 查看文件的每一行最后修改人git blame file.txtgit 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)
# 添加工作树(同时在多个分支工作)git worktree add ../hotfix-branch hotfix
# 查看工作树git worktree list
# 删除工作树git worktree remove ../hotfix-branch七、Git 工作流程
集中式工作流
所有人直接在 main 分支上工作,适合小团队。
git pull origin main# 编辑文件git add .git commit -m "update"git push origin main功能分支工作流(Feature Branch)
每个新功能在独立分支开发,通过 PR/MR 合并。
# 创建功能分支git checkout -b feature/login
# 开发、提交git add .git commit -m "feat: implement login"
# 推送并创建 PRgit push origin feature/login# 在 GitHub/GitLab 上创建 Pull Request# 代码审查后合并到 main
# 合并后删除分支git checkout maingit pull origin maingit branch -d feature/loginGit Flow
经典的分支模型,适合有明确发布周期的项目:
main(生产分支) │ ├── develop(开发分支) │ ├── feature/*(功能分支) │ └── release/*(发布分支) │ └── hotfix/*(热修复分支)| 分支 | 用途 | 生命周期 |
|---|---|---|
main | 生产环境代码 | 永久 |
develop | 最新开发代码 | 永久 |
feature/* | 新功能开发 | 临时 |
release/* | 发布准备 | 临时 |
hotfix/* | 生产紧急修复 | 临时 |
GitHub Flow
简化版工作流,适合持续部署:
# 1. 从 main 创建分支git checkout -b feature-x
# 2. 开发并提交git add .git commit -m "feat: implement feature-x"
# 3. 推送并创建 PRgit push origin feature-x
# 4. 代码审查、CI 通过后合并到 main
# 5. 部署 main 分支Trunk-Based Development
所有人在主干(main/trunk)上工作,通过特性标志(Feature Flags)控制功能发布。
# 短命分支(1-2 天)git checkout -b short-lived-feature# 快速开发git commit -m "feat: partial implementation"git push origin short-lived-feature# 立即合并回 main八、常见问题与解决方案
1. 不小心提交了敏感信息
# 方法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.gitgit reflog expire --expire=now --all && git gc --prune=now --aggressive
# 方法3:如果是最新提交git reset --soft HEAD~1git rm --cached path/to/filegit commit -m "remove sensitive file"# 然后轮换密钥/密码2. 撤销已推送的提交
# 安全方式:创建反向提交git revert <commit-hash>git push origin main
# 危险方式:强制推送(改写历史)git reset --hard HEAD~1git push --force origin main # 慎用!可能影响他人3. 合并冲突太多怎么办
# 使用他们的版本git merge --theirs feature-branch
# 使用我们的版本git merge --ours feature-branch
# 使用特定版本的文件git checkout --theirs path/to/filegit checkout --ours path/to/file
# 放弃合并git merge --abort4. 恢复删除的分支
# 查看分支引用日志git reflog
# 找到分支最后的提交git reflog | grep "branch-name"
# 恢复分支git checkout -b recovered-branch <commit-hash>5. 大文件导致仓库过大
# 使用 Git LFS 管理大文件git lfs installgit lfs track "*.psd"git lfs track "*.zip"git add .gitattributes
# 迁移已有大文件到 LFSgit lfs migrate import --include="*.psd" --everything
# 查看仓库大小git count-objects -vH6. 代码审查(Pull Request)
# 检出 PR 分支进行本地测试git fetch origin pull/123/head:pr-123git checkout pr-123
# 查看 PR 差异git diff main..pr-123
# 合并 PRgit checkout maingit merge pr-123 --no-ff -m "Merge PR #123"7. 查找性能问题
# 查看哪些文件最大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_StoreThumbs.db
# 日志*.loglogs/
# 临时文件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 的很多功能只有在实际场景中才能真正掌握。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
AI大模型开发入门 Python 重点笔记
学习笔记Python 与 AI 大模型开发重点笔记:基础语法、逻辑判断、循环、函数、数据容器,以及用 Python 调用 Ollama 进行模型对话与聊天界面实战
2
Docker 入门与实战
DevOpsDocker 容器技术系统入门,涵盖核心概念、常用命令、Dockerfile 编写、数据卷与网络、多阶段构建与镜像瘦身实践
3
(三)【数据中心篇】
学习笔记2026-08-26
4
(二)【云计算技术篇】
学习笔记2026-08-26
5
PMP 项目管理知识体系与面试指南
学习笔记PMP 项目管理核心知识体系整理,涵盖五大过程组、十大知识领域、关键工具与技术,以及项目管理岗位面试高频问题与答题思路
随机文章随机推荐













