前言
Git 是目前世界上最流行的分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年创建。无论是个人开发者还是大型团队协作,Git 都已经成为软件开发中不可或缺的工具。2026 年的今天,Git 的功能和生态更加完善,但核心概念和基本操作依然不变。本文将从零开始,带您全面掌握 Git 的日常使用。
一、什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。想象一下,没有版本控制时你可能会这样保存文件:论文终稿.doc、论文终稿修改版.doc、论文真的终稿了.doc……这种混乱的管理方式在多人协作时更是灾难。
Git 采用分布式架构,每个开发者本地都有一份完整的代码仓库历史,即使没有网络也能正常提交、查看历史、创建分支。与其他集中式版本控制系统(如 SVN)相比,Git 的速度更快、分支管理更灵活、数据安全性更高。
二、Git 的安装
2.1 Linux 系统安装
在大多数 Linux 发行版中,可以使用包管理器快速安装 Git:
# Debian / Ubuntu / Deepin
sudo apt update
sudo apt install git -y
# CentOS / RHEL / Rocky Linux
sudo yum install git -y
# 或使用 dnf(CentOS 8+)
sudo dnf install git -y
# Arch Linux
sudo pacman -S git
# openSUSE
sudo zypper install git
安装完成后,验证版本:
git --version
# 输出示例:git version 2.43.0
2.2 Windows 系统安装
Windows 用户推荐以下两种方式安装 Git:
方式一:官方安装包
- 访问 Git 官方网站:https://git-scm.com/download/win
- 下载最新版本的安装程序(.exe 文件)
- 双击运行安装程序,绝大多数选项保持默认即可
- 关键选项说明:
- 选择默认编辑器(推荐 VS Code 或 Vim)
- 调整 PATH 环境变量:选择 “Git from the command line and also from 3rd-party software”
- 选择 HTTPS 传输后端:推荐 “Use the OpenSSL library”
- 配置行尾转换:Windows 用户推荐 “Checkout Windows-style, commit Unix-style line endings”
- 选择终端模拟器:推荐 “Use MinTTY”
- 安装完成后,在开始菜单中找到 “Git Bash” 或 “Git GUI”
方式二:通过包管理器 winget(Windows 10/11)
winget install --id Git.Git -e --source winget
安装完成后,打开命令提示符或 PowerShell,输入 git --version 确认安装成功。
2.3 macOS 系统安装
# 使用 Homebrew(推荐)
brew install git
# 或使用 Xcode Command Line Tools
xcode-select --install
2.4 初始配置
安装完成后,第一件事是设置用户名和邮箱,这些信息会记录在每一次提交中:
# 全局配置(对当前用户的所有仓库生效)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
# 查看某个配置项
git config user.name
其他常用配置:
# 设置默认分支名为 main(2020 年后 GitHub 默认)
git config --global init.defaultBranch main
# 设置别名,简化输入
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 color.ui auto
三、创建仓库:init 与 clone
3.1 git init — 从零开始
如果你想将一个已有的项目目录交给 Git 管理:
cd /path/to/your/project
git init
执行后,当前目录下会生成一个 .git 隐藏文件夹,里面包含了仓库的所有元数据和对象数据。此时仓库是空的,还没有任何文件被跟踪。
3.2 git clone — 从远程复制
如果项目已经存在于远程仓库(如 GitHub、GitLab),可以克隆到本地:
# 通过 HTTPS 克隆
git clone https://github.com/username/repository.git
# 通过 SSH 克隆(需要先配置 SSH Key)
git clone git@github.com:username/repository.git
# 克隆到指定目录
git clone https://github.com/username/repository.git my-project
Git 支持多种协议:HTTPS、SSH、Git 协议、本地文件协议。对于初学者,HTTPS 最方便;对于日常开发,SSH 更安全且无需重复输入密码。
四、核心操作:add、commit、push、pull
4.1 文件状态与工作流程
Git 中文件有四种状态:
- Untracked(未跟踪):文件在仓库中但未被 Git 管理
- Staged(已暂存):文件已被标记,准备提交
- Committed(已提交):文件已被安全地保存在本地仓库
- Modified(已修改):已跟踪的文件被修改了
基本工作流程:工作区 → 暂存区 → 本地仓库 → 远程仓库
4.2 git add — 添加文件到暂存区
# 添加单个文件
git add index.html
# 添加多个文件
git add index.html style.css app.js
# 添加所有变更(包括新增、修改、删除)
git add .
git add -A # 等价于 git add --all
# 添加当前目录所有变更(不包括上级目录)
git add *
小心使用 git add .:它会把当前目录下所有未跟踪和已修改的文件都加入暂存区。建议养成先 git status 查看状态的好习惯。
4.3 git status — 查看状态
# 查看仓库当前状态
git status
# 简洁模式
git status -s
# 输出示例:
# M README.md (已修改但未暂存)
# A index.html (已暂存)
# ?? newfile.txt (未跟踪)
4.4 git commit — 提交到本地仓库
# 基本提交
git commit -m "feat: 添加用户登录功能"
# 跳过暂存区,直接提交已跟踪文件的修改(未跟踪文件仍需 add)
git commit -a -m "fix: 修复登录页样式"
# 编写详细提交信息(会打开编辑器)
git commit
# 提交信息规范建议:
# 第一行:简短描述(50 字以内)
# 空一行
# 详细描述(可选)
提交信息的最佳实践:
- 使用祈使句:”Add” 而不是 “Added” 或 “Adds”
- 第一行不超过 50 个字符
- 使用前缀标识类型:feat(新功能)、fix(修复)、docs(文档)、style(样式)、refactor(重构)、test(测试)、chore(杂项)
4.5 git push — 推送到远程仓库
# 推送到默认远程(origin)的默认分支(main/master)
git push
# 完整写法
git push origin main
# 推送当前分支到远程同名分支
git push origin HEAD
# 推送并设置上游关联(首次推送常用)
git push -u origin main
# -u 会将本地分支与远程分支关联,之后可以直接使用 git push
# 强制推送(谨慎使用!会覆盖远程历史)
git push --force
# 或使用更安全的 --force-with-lease(如果远程有新的提交,强制推送会被拒绝)
git push --force-with-lease
4.6 git pull — 拉取远程更新
# 拉取远程更新并合并到当前分支
git pull
# 完整写法(等价于 git fetch + git merge)
git pull origin main
# 拉取但使用 rebase 方式合并(保持历史线性)
git pull --rebase
git pull 实际上是 git fetch(下载远程数据)和 git merge(合并到本地分支)的组合。建议习惯使用 git fetch 先查看远程变更,再决定如何合并:
git fetch origin
git log origin/main..HEAD # 查看本地比远程多出的提交
git merge origin/main # 手动合并
五、远程仓库与 GitHub
5.1 关联远程仓库
# 添加远程仓库
git remote add origin https://github.com/username/repo.git
# 查看远程仓库
git remote -v
# 修改远程仓库地址
git remote set-url origin https://github.com/username/new-repo.git
# 删除远程仓库
git remote remove origin
5.2 配置 SSH 免密登录
使用 SSH 协议可以避免每次推送都输入密码:
# 1. 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"
# 一直按 Enter 即可,如需设置密码短语可以输入
# 2. 查看公钥
cat ~/.ssh/id_ed25519.pub
# 3. 复制公钥内容
# 4. 登录 GitHub → Settings → SSH and GPG keys → New SSH key
# 5. 粘贴公钥并保存
# 6. 测试连接
ssh -T git@github.com
# 成功会显示:Hi username! You"ve successfully authenticated...
5.3 GitHub 创建仓库并推送
- 登录 GitHub,点击右上角 + 号 → New repository
- 填写仓库名称和描述,选择公开(Public)或私有(Private)
- 不要勾选 “Initialize this repository with a README”(如果是已有项目)
- 创建后,按页面提示推送到远程:
# 已有本地仓库
cd /your/project
git remote add origin https://github.com/username/repo-name.git
git branch -M main
git push -u origin main
六、分支管理:branch、checkout、merge
6.1 分支的概念
分支是 Git 最强大的功能之一。可以把分支想象成平行宇宙——每个分支上的开发互不影响,最后可以合并到一起。默认分支在 Git 中叫 master,GitHub 上默认叫 main。
6.2 分支操作
# 列出分支(* 表示当前所在分支)
git branch
# 列出所有分支(包括远程分支)
git branch -a
# 创建新分支
git branch feature-login
# 切换分支
git checkout feature-login
# 或使用 switch(Git 2.23+)
git switch feature-login
# 创建并切换分支
git checkout -b feature-login
git switch -c feature-login # Git 2.23+
# 重命名分支
git branch -m old-name new-name
# 删除分支(已合并的)
git branch -d feature-login
# 强制删除分支(未合并的)
git branch -D feature-login
6.3 合并分支
# 首先切换到目标分支(比如要合并到 main)
git checkout main
# 合并其他分支
git merge feature-login
# 合并时生成一个合并提交(即使可以快进合并)
git merge --no-ff feature-login -m "merge: 合并登录功能"
# 查看分支合并图
git log --oneline --graph --all
6.4 合并模式说明
- Fast-forward(快进):当被合并的分支直接基于目标分支的最新提交,Git 只需移动指针,不会产生新的合并提交
- Three-way merge(三方合并):当两个分支都有各自的新提交时,Git 会创建一个新的合并提交(merge commit)
- Recursive(递归合并):默认的合并策略,用于处理两个分支的合并
七、冲突解决
7.1 冲突的产生
当两个分支修改了同一个文件的同一部分,且这些修改不兼容时,Git 无法自动合并,就会产生冲突。例如:
- 分支 A 在第 5 行将
color: red改为color: blue - 分支 B 在第 5 行将
color: red改为color: green
7.2 解决冲突的步骤
# 1. 尝试合并,遇到冲突
$ git merge feature-login
Auto-merging style.css
CONFLICT (content): Merge conflict in style.css
Automatic merge failed; fix conflicts and then commit the result.
# 2. 查看冲突文件
git status
# 会列出有冲突的文件,状态为 "both modified"
# 3. 打开冲突文件,Git 会添加冲突标记:
# <<<<<<< HEAD
# color: blue;
# =======
# color: green;
# >>>>>>> feature-login
# 4. 手动编辑文件,保留需要的代码,删除冲突标记
# 修改后:
color: green;
# 5. 标记为已解决
git add style.css
# 6. 完成合并提交
git commit -m "fix: 解决 style.css 冲突"
7.3 冲突解决工具
可以使用图形化工具辅助解决冲突:
# 使用内置的 mergetool
git mergetool
# 配置使用 VSCode 作为合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd "code --wait "
流行的合并工具包括:VSCode、Beyond Compare、Meld、KDiff3 等。
7.4 冲突预防技巧
- 经常拉取:
git pull保持代码最新 - 小步提交:每次修改少量内容,减少冲突范围
- 沟通协作:在多人协作时,主动告知正在修改的文件
- 使用 feature 分支:不要直接在 main 分支上开发
- 冲突时不要慌:
git merge --abort可以撤销合并回到之前状态
八、.gitignore — 忽略不需要的文件
8.1 什么是 .gitignore
.gitignore 文件告诉 Git 哪些文件不应该被纳入版本控制。常见的需要忽略的文件包括:
- 编译产物:
.o、.exe、.class、dist/、build/ - 依赖包:
node_modules/、vendor/、.venv/ - 系统文件:
.DS_Store、Thumbs.db - 配置文件(含敏感信息):
.env、config.local.php - IDE/编辑器配置:
.vscode/、.idea/、*.swp - 日志文件:
*.log
8.2 .gitignore 示例
# Node.js 项目
node_modules/
dist/
.env
*.log
# Python 项目
__pycache__/
*.pyc
*.pyo
.env
venv/
.venv/
*.egg-info/
# Java 项目
target/
*.class
*.jar
*.war
*.ear
# IDE
.idea/
.vscode/
*.swp
*.swo
*~
# 系统文件
.DS_Store
Thumbs.db
8.3 .gitignore 使用要点
# 创建 .gitignore
touch .gitignore
# 将规则写入文件后,git add .gitignore && git commit -m "chore: 添加 .gitignore"
# 如果文件已经被 Git 跟踪,.gitignore 不会生效
# 需要先移除跟踪:
git rm --cached node_modules/
# 然后再添加 .gitignore 规则
# 强制添加被忽略的文件
git add -f secret.config.json
# 查看哪些文件会被忽略
git check-ignore -v filename
# 全局 .gitignore(对当前用户的所有仓库生效)
git config --global core.excludesfile ~/.gitignore_global
九、查看历史与回退
9.1 git log — 查看提交历史
# 查看提交历史
git log
# 简洁格式
git log --oneline
# 图形化显示分支
git log --oneline --graph --all
# 指定条数
git log -5
# 查看某个文件的修改历史
git log --oneline -- index.html
# 查看某个作者的提交
git log --author="author name"
# 按日期过滤
git log --since="2026-01-01" --until="2026-03-01"
# 查看提交的详细修改内容
git log -p
9.2 git diff — 查看差异
# 工作区 vs 暂存区
git diff
# 暂存区 vs 最后一次提交
git diff --staged
git diff --cached # 同上
# 两个分支之间的差异
git diff main feature-login
# 两次提交之间的差异
git diff abc123 def456
# 只查看哪些文件有变化
git diff --stat
9.3 git reset — 撤销操作
# 从暂存区移出文件(保留工作区修改)
git reset HEAD index.html
git restore --staged index.html # Git 2.23+ 推荐方式
# 撤销最近一次提交(保留修改到工作区)
git reset --soft HEAD~1
# 撤销最近一次提交(保留修改到暂存区)
git reset --mixed HEAD~1 # 默认模式
# 完全撤销最近一次提交(丢弃修改,危险!)
git reset --hard HEAD~1
# 回退到指定提交
git reset --hard abc123
9.4 git revert — 安全的撤销
与 reset 不同,revert 不会删除历史,而是创建一个新的提交来反向应用之前的更改。适合已经推送到远程的分支:
# 撤销某次提交(创建一个反向提交)
git revert abc123
# 撤销最近一次提交
git revert HEAD
# 连续撤销多个提交(会依次创建多个 revert 提交)
git revert HEAD~3..HEAD
十、日常工作流程
10.1 个人开发流程
# 1. 克隆或初始化仓库
# 2. 创建功能分支
git checkout -b feature/my-new-feature
# 3. 开发 & 提交(循环)
git add .
git commit -m "feat: 完成功能模块A"
# 4. 拉取主分支最新代码
git checkout main
git pull
# 5. 合并功能分支
git merge feature/my-new-feature
# 6. 推送到远程
git push
# 7. 删除本地功能分支
git branch -d feature/my-new-feature
10.2 团队协作流程(Git Flow 简化版)
# 主分支
main # 生产环境代码,稳定版本
# 开发分支
develop # 日常开发集成分支
# 功能分支
feature/* # 从 develop 创建,完成后合并回 develop
# 修复分支
hotfix/* # 从 main 创建,紧急修复生产问题
# 发布分支
release/* # 从 develop 创建,准备发布
10.3 常见场景速查
场景一:改错了文件,想放弃修改
# 未暂存:恢复到上次提交的状态
git checkout -- filename
git restore filename # Git 2.23+ 推荐
场景二:想修改最近一次提交的信息
git commit --amend -m "新的提交信息"
场景三:想把多个提交合并成一个
git rebase -i HEAD~3
# 在交互界面中将 pick 改为 squash 或 fixup
场景四:误操作后想恢复
# 查看所有操作记录(包括已删除的提交)
git reflog
# 找到对应的提交哈希,然后用 reset 恢复
场景五:保存当前工作到暂存区
# 保存当前未提交的修改
git stash save "working on feature X"
# 查看存储列表
git stash list
# 恢复最近的存储
git stash pop
# 恢复但不删除存储
git stash apply
# 删除存储
git stash drop stash@{0}
十一、Git 常见问题与技巧
11.1 推荐图形化工具
- GitHub Desktop:官方出品,适合初学者
- Sourcetree:功能强大的免费 GUI 客户端
- GitKraken:界面美观,跨平台
- VS Code:内置 Git 支持,插件丰富
- Oh My Zsh(终端):Git 插件提供分支显示和快捷键
11.2 踩坑提醒
- 不要在 .git 目录下手动修改文件——这会导致仓库损坏
- 不要在 main 分支上直接开发——始终使用功能分支
- 推送前先 pull——避免推送被拒绝
- 不要在 git push –force 后后悔——可能会丢失其他人的提交
- 密码和密钥不要提交到仓库——使用 .gitignore 和 .env
- 大文件不要直接提交——使用 Git LFS 管理
11.3 学习资源推荐
- 官方文档:https://git-scm.com/doc
- Learn Git Branching(交互式学习):https://learngitbranching.js.org/
- Pro Git 中文版(免费电子书):https://git-scm.com/book/zh/v2
结语
Git 的学习曲线虽然有些陡峭,但掌握核心概念和日常操作后,它会成为你开发工作中最得力的助手。记住一个原则:分支大胆创建,提交小而精炼,合并前先拉取,冲突冷静解决。多用、多练、多查文档,Git 的种种技巧终将内化于心。
本文从 Git 的安装到分支管理,从冲突解决到团队协作流程,涵盖了 2026 年日常开发中最常用的 Git 操作。如果你有任何疑问,欢迎在评论区留言讨论!