本文档针对 Git 初学者及需要巩固基础的开发者,梳理 Git 核心概念与高频操作,结合实际场景示例,帮助快速上手并解决日常使用中的常见问题。
在使用 Git 前,需明确三个核心区域与四种状态,这是理解所有操作的基础。
工作区(Working Directory):本地正在编辑的文件目录,即日常操作的文件所在位置。
暂存区(Stage/Index):用于临时存放待提交的文件修改,是工作区与版本库之间的“中转站”,可通过命令将工作区修改添加至此。
版本库(Repository):Git 管理的核心区域,存储所有提交的版本信息,位于工作区下的 .git 隐藏目录中,包含本地分支、提交记录等关键数据。
未跟踪(Untracked):新创建的文件,Git 未对其进行任何管理,需通过 git add 命令纳入跟踪。
已跟踪 - 未修改(Unmodified):文件已被 Git 跟踪,且当前内容与版本库中最新版本一致,若修改则变为“已修改”状态。
已跟踪 - 已修改(Modified):文件内容被修改,但未添加到暂存区,需通过 git add 提交到暂存区。
已跟踪 - 已暂存(Staged):文件修改已添加到暂存区,等待通过 git commit 命令提交到版本库。
包括 Git 安装与用户信息配置,仅需执行一次。
Windows:访问 Git 官网 下载安装包,按向导完成安装(建议默认选项,可勾选“Add Git Bash Here”方便右键调用)。
macOS:通过 App Store 安装 Xcode,或使用 Homebrew 命令 brew install git。
Linux:Debian/Ubuntu 系统使用 sudo apt-get install git;CentOS/RHEL 系统使用 sudo yum install git。
验证安装:打开终端(Windows 为 Git Bash 或命令提示符),输入 git --version,若显示版本号则安装成功。
Git 需通过用户信息关联提交记录,全局配置一次即可(若需为单个项目配置不同信息,可进入项目目录后去掉 --global 参数):
bash
# 配置用户名(建议与代码托管平台一致,如 GitHub/GitLab 用户名)
git config --global user.name "Your Name"
# 配置邮箱(建议与代码托管平台绑定邮箱一致)
git config --global user.email "your.email@example.com"
# 验证配置
git config --global --list
Git 核心工作流程:修改文件 → 暂存修改 → 提交到版本库 → 推送至远程仓库,以下按流程详解。
两种场景:新建本地项目后初始化 Git 仓库,或从远程平台(如 GitHub)克隆已有仓库。
bash
# 1. 进入本地项目目录(替换为你的项目路径)
cd /path/to/your/project
# 2. 初始化 Git 仓库,生成 .git 目录
git init
从远程仓库复制完整项目到本地,适用于参与已有项目开发:
bash
# 格式:git clone 远程仓库地址(HTTPS 或 SSH 地址)
# 示例:克隆 GitHub 上的 test 仓库
git clone https://github.com/your-username/test.git
# 克隆后自动生成与仓库同名的目录,进入目录即可操作
cd test
远程地址选择:HTTPS 地址无需配置密钥,每次推送需输入账号密码;SSH 地址需配置 SSH 密钥,配置后可免密操作,推荐开发环境使用 SSH 地址。
将工作区的修改添加到暂存区,是提交前的必要步骤。
bash
# 1. 暂存单个文件(替换为具体文件名)
git add filename.txt
# 2. 暂存多个指定文件(空格分隔)
git add file1.txt file2.jpg
# 3. 暂存当前目录下所有修改(包括新增、修改、删除)
git add .
# 4. 暂存指定目录下所有修改(替换为目录路径)
git add ./src
# 5. 取消暂存指定文件(已暂存后想撤回)
git reset HEAD filename.txt
将暂存区的修改提交到本地版本库,生成一条不可修改的提交记录,需填写提交说明(描述本次修改内容)。
bash
# 1. 基本提交(执行后会打开默认编辑器填写提交说明)
git commit
# 2. 快捷提交(直接在命令后填写提交说明,推荐简单修改使用)
git commit -m "feat: 新增用户登录功能"
git commit -m "fix: 修复移动端适配问题"
# 3. 提交所有已跟踪文件的修改(无需先执行 git add,新增文件不生效)
git commit -am "refactor: 优化数据处理逻辑"
# 4. 修改最近一次提交(未推送到远程时可用,避免生成多余记录)
git commit --amend -m "feat: 新增用户登录功能(补充:添加验证码校验)"
提交说明规范:建议遵循 Conventional Commits 规范,格式为“类型: 描述”,常见类型包括 feat(新功能)、fix(修复 bug)、docs(文档修改)、style(代码格式调整)、refactor(重构)、test(测试相关)、chore(构建/工具配置)。
日常开发中常用命令,用于查看文件状态和提交历史。
bash
# 1. 查看当前工作区与暂存区状态(核心命令,高频使用)
git status
# 2. 查看提交历史(按时间倒序显示,最新提交在最前)
git log
# 3. 简化显示提交历史(仅显示提交哈希前7位、作者、时间、说明)
git log --oneline
# 4. 显示分支合并历史(清晰看到分支创建与合并记录)
git log --graph --oneline --all
# 5. 查看指定文件的提交历史(跟踪文件修改记录)
git log filename.txt
# 6. 查看最近 n 次提交(n 为数字,如查看最近3次)
git log -3
远程仓库是团队协作的桥梁,常用平台包括 GitHub、GitLab、Gitee 等,核心操作包括关联远程、推送、拉取、拉取请求等。
本地仓库需关联远程仓库后,才能进行推送和拉取操作。
bash
# 1. 关联远程仓库(origin 是远程仓库的默认别名,可自定义)
git remote add origin 远程仓库地址
# 示例:git remote add origin git@github.com:your-username/test.git
# 2. 查看已关联的远程仓库
git remote -v
# 3. 修改远程仓库地址(如远程仓库地址变更)
git remote set-url origin 新的远程仓库地址
# 4. 删除关联的远程仓库
git remote rm origin
将本地版本库的提交推送到远程仓库,实现代码同步。
bash
# 1. 首次推送当前分支到远程(--set-upstream 关联本地与远程分支,后续可简化命令)
git push --set-upstream origin 本地分支名
# 示例:推送本地 main 分支到远程 main 分支
git push --set-upstream origin main
# 2. 后续推送(已关联分支后,直接执行)
git push
# 3. 强制推送(谨慎使用!覆盖远程分支内容,仅在本地提交修正远程错误时使用)
git push -f origin 分支名
# 更安全的强制推送(保留远程新增提交,推荐)
git push --force-with-lease origin 分支名
团队协作中,需定期拉取远程最新代码,避免冲突。
bash
# 1. 拉取远程指定分支并合并到本地当前分支(常用,等价于 git fetch + git merge)
git pull origin 远程分支名
# 示例:拉取远程 main 分支并合并到本地当前分支
git pull origin main
# 2. 已关联分支后,简化命令
git pull
# 3. 仅拉取远程代码到本地缓存,不合并(需手动合并,适合复杂场景)
git fetch origin 远程分支名
# 查看拉取的内容与本地差异
git diff 本地分支名 origin/远程分支名
# 手动合并到本地分支
git merge origin/远程分支名
当远程有新分支(如同事创建的开发分支),需拉取到本地进行开发。
bash
# 方法1:直接创建并切换到本地分支,关联远程分支
git checkout -b 本地分支名 origin/远程分支名
# 示例:拉取远程 dev 分支到本地 dev 分支
git checkout -b dev origin/dev
# 方法2:先拉取远程分支信息,再切换(适用于已知道远程分支存在)
git fetch origin
git checkout 远程分支名 # 本地分支名与远程一致时可省略本地分支名
分支可实现并行开发,如主分支保持稳定,开发分支用于功能开发,修复分支用于紧急 bug 修复,避免代码混乱。
主分支(main/master):默认主分支,存储正式发布的代码,禁止直接在主分支开发。
开发分支(dev):团队共用开发分支,所有功能开发完成后合并至此。
功能分支(feature/*):基于 dev 分支创建,用于单个功能开发(如 feature/login),开发完成后合并回 dev 分支。
修复分支(hotfix/*):基于 main 分支创建,用于修复线上紧急 bug(如 hotfix/payment-error),修复完成后同时合并到 main 和 dev 分支。
bash
# 1. 查看本地所有分支(当前分支前有 * 标记)
git branch
# 2. 查看本地与远程所有分支
git branch -a
# 3. 创建本地分支(基于当前分支创建)
git branch 分支名
# 示例:基于 dev 分支创建 feature/login 分支(需先切换到 dev 分支)
git checkout dev
git branch feature/login
# 4. 创建并切换到新分支(常用,等价于先创建再 checkout)
git checkout -b 分支名
# 示例:基于 dev 分支创建并切换到 feature/pay
git checkout -b feature/pay dev
# 5. 切换分支
git checkout 分支名
# 简化命令(Git 2.23+ 支持)
git switch 分支名
# 6. 合并分支(将目标分支合并到当前分支)
# 示例:当前在 dev 分支,合并 feature/login 分支
git checkout dev
git merge feature/login
# 7. 删除本地分支(分支已合并到主分支后使用)
git branch -d 分支名
# 强制删除未合并的分支(谨慎使用)
git branch -D 分支名
# 8. 删除远程分支
git push origin --delete 远程分支名
# 示例:删除远程 feature/login 分支
git push origin --delete feature/login
当两个分支修改了同一文件的同一部分内容时,合并会触发冲突,Git 无法自动判断保留哪部分内容,需手动解决。
冲突提示:执行 git merge 后,终端会提示 “Automatic merge failed; fix conflicts and then commit the result.”。
查看冲突文件:冲突文件中会出现特殊标记,标记冲突的两部分内容: `<<<<<< HEAD # 当前分支的内容 当前分支修改的内容 ======= 目标分支修改的内容
feature/login # 被合并分支的内容`
手动解决冲突:打开冲突文件,根据业务需求删除特殊标记和无用内容,保留正确代码。
完成合并:解决所有冲突后,执行以下命令提交合并结果:
git add 冲突文件名 # 暂存解决后的文件 git commit -m "merge: 合并 feature/login 分支,解决登录功能冲突"
bash
# 1. 撤销工作区未暂存的修改(单个文件)
git checkout -- filename.txt
# 2. 撤销工作区所有未暂存的修改(谨慎使用,会丢失未保存的修改)
git checkout .
# 3. 撤销暂存区的修改(已 git add 但未 commit,回到已修改状态)
git reset HEAD filename.txt
# 撤销所有暂存区修改
git reset HEAD .
# 4. 回退到指定版本(已 commit,未推送到远程)
# 先通过 git log --oneline 查看目标版本的哈希值(如 a1b2c3d)
git reset --hard 版本哈希值
# 回退到上一个版本(简化写法,^ 表示上一个,^^ 表示上两个)
git reset --hard HEAD^
# 5. 回退已推送到远程的版本(谨慎使用!会覆盖远程记录)
git reset --hard 版本哈希值
git push -f origin 分支名
用于指定 Git 无需跟踪的文件/目录,如编译产物、日志、IDE 配置文件等,避免提交到版本库。
在项目根目录创建 .gitignore 文件。
按规则编写需要忽略的内容,示例: `# 忽略所有 .txt 文件 *.txt
!README.txt
dist/
.idea/ .vscode/
*.log`
若文件已被 Git 跟踪(曾提交过),修改 .gitignore 后需先执行 git rm --cached 文件名 移除跟踪,再提交 .gitignore 文件。
当正在开发的功能未完成,需临时切换到其他分支(如修复紧急 bug)时,可使用 stash 暂存当前工作区的修改,切换分支后再恢复。
bash
# 1. 暂存当前工作区所有未提交的修改(包括已修改和已暂存)
git stash
# 2. 暂存时添加说明,便于后续识别
git stash save "feat: 未完成的用户注册功能"
# 3. 查看所有 stash 记录(列表形式,最新的在最前)
git stash list
# 4. 恢复最近一次 stash 的修改,并保留 stash 记录
git stash apply
# 5. 恢复指定 stash 记录(通过 stash@{n} 标识,n 为索引)
git stash apply stash@{1}
# 6. 恢复最近一次 stash 的修改,并删除该 stash 记录(常用)
git stash pop
# 7. 删除指定 stash 记录
git stash drop stash@{1}
# 8. 删除所有 stash 记录
git stash clear
原因:本地仓库与远程仓库无关联历史(如本地初始化仓库后,远程已存在提交)。
解决方案:首次拉取时允许合并无关历史:
bashgit pull origin 分支名 --allow-unrelated-histories
原因:未暂存/提交的修改会跟随分支切换,若新分支有同名文件且内容不同,可能被覆盖。
解决方案:使用 git stash 暂存修改后再切换分支,或先提交修改(可后续使用 git commit --amend 优化提交记录)。
原因:未配置 SSH 密钥,或密钥未添加到远程平台。
解决方案:
bash
# 1. 生成 SSH 密钥(一路回车,无需设置密码)
ssh-keygen -t ed25519 -C "your.email@example.com"
# 2. 查看公钥内容(Windows 路径:C:\Users\用户名\.ssh\id_ed25519.pub)
cat ~/.ssh/id_ed25519.pub
# 3. 复制公钥,添加到 GitHub/GitLab 等平台的 SSH 密钥配置中
# GitHub 路径:Settings → SSH and GPG keys → New SSH key
Git 核心在于“版本控制”与“分支协作”,日常开发需熟练掌握 add/commit/push/pull 基础流程,分支操作与冲突解决是团队协作的关键。
官方文档:Git Documentation
交互式学习:Learn Git Branching(可视化分支操作,强烈推荐)
书籍:《Pro Git》(第二版免费在线阅读:Git - 简明指南)
本文作者:夏至十二
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!