<u> 作者:jason-wrj </u>
<u> 分类:软件开发/Git </u>
<u> 标签:Software Develop, Git </u>
<u> 更多: </u>
<u> 更多: </u>
Git 是一款分布式版本控制系统,主要用于跟踪文件的修改历史、协调多人协作开发,是软件开发中不可或缺的工具。
1.1 Git 优势
- 
本地版本控制 vs 集中式版本控制(SVN) vs 分布式版本控制(Git)。
 - 
Git 的核心优势:分布式、高效、支持非线性开发。
 
1.2 Git 核心概念
学习 Git 最难的不是命令,而是理解它的核心思想。Git 三区模型:工作区 → 暂存区 → 仓库。
- 
工作区(Working Directory):电脑上能看到的项目目录,在这里编辑文件。
 - 
暂存区(Staging Area / Index):一个“预存区域”,用于标记要提交的内容,准备要提交的文件会先放在这里,但不实际保存。通过
git add命令将文件添加到暂存区。 - 
本地版本仓库(Local Repository):项目文件夹,用于存储代码的地方,创建时会生成一个隐藏的
.git文件夹(Git 的“数据库”),里面存储了项目历史版本控制信息与元数据,Git 会记录这个文件夹里所有文件的历史变化。- 
提交(Commit):一次快照,正式保存暂存区的内容,代码的变更记录到提交历史。包含文件快照、作者信息、时间戳的唯一标识(SHA-1哈希值)。使用
git commit -m "提交信息"命令进行提交。 - 
分支(Branch):开发的独立线,如
main、dev,默认的主分支叫main(旧版也叫master)。是独立的提交历史线,允许开发者分叉开发。可以创建新的分支来开发新功能,而不会影响主分支的稳定代码。使用git branch创建分支,git checkout切换分支。 - 
合并(Merge):将不同分支的更改整合。
 
 - 
 - 
远程版本仓库(Remote Repository):放在互联网或其他网络上的版本库,比如 GitHub, GitLab, Gitee。用于团队协作和备份。
 
核心工作流程可以概括为:
工作区 -> (git add -> 暂存区) -> (git commit -> 本地版本仓库) -> (git push -> 远程版本仓库)
工作区 <- (git checkout -- <file> <- 暂存区) <- (git reset HEAD <- 本地版本仓库) 
删除 <- (git rm --cached <file> <- 暂存区)
2 Git 核心概念
2.1 本地三大区域
- 
工作区(Working Directory):
本地当前编辑文件的目录(能看到的文件夹)。
 - 
暂存区(Index / Staging Area):
文件暂存的位置,临时存储待提交的修改(类似 “缓存区”)。
通过
git add将工作区的修改放入暂存区。 - 
本地仓库(Local Repository):
永久存储所有版本历史记录的数据库(隐藏目录
.git)。通过
git commit将暂存区的内容提交到本地仓库。 
2.2 远程第四区域
- 
远程仓库(Remote Repository) 托管在网络上的仓库(如 GitHub、GitLab),用于多人共享代码。
通过
git push/git pull与本地仓库同步。 
2.3 分布式架构
- 
每个开发者拥有完整仓库副本(含完整历史),不依赖中央服务器。
 
2.4 数据存储原理
- 
以文件快照(非差异)存储数据,通过SHA-1哈希保证数据完整性。
 
3 Git 安装与初始配置
3.1 安装 Git
- 
Windows:在 Git 官网下载 ,按向导安装(建议勾选 “Add Git to PATH”),安装后会有 Git Bash 这个命令行工具。
 - 
macOS:使用 Homebrew(
brew install git)安装,或通过 Xcode 命令行工具(xcode-select --install),或从官网下载安装。 - 
Linux:通过包管理器安装,如 Debian/Ubuntu 用(
sudo apt install git),如 CentOS 用(sudo yum install git)。 
3.2 初始配置(必做)
全局配置:安装后需配置用户信息,打开终端(或 Git Bash),设置用户名和邮箱(每次提交会关联此“签名“信息):
git config --global user.name "Your Name" # 配置用户
git config --global user.email "Your eMail@example.com"
查看配置:
git config --list  # 列出所有配置
3.3 可选配置
git config --global alias.st status  # 设置别名
git config --global pull.rebase true  # 自动变基
4 常用命令
4.1 仓库初始化与克隆
- 
创建新仓库:在项目目录中初始化本地仓库
 
git init  # 初始化本地仓库,生成 .git 目录(隐藏)
- 
克隆远程仓库:将远程仓库下载到本地
 
git clone <远程仓库地址URL>  # 例如:git clone https://github.com/username/repo.git
4.2 添加文件与跟踪提交
- 
查看工作区状态:
 
git status  # 显示哪些文件被修改、未跟踪等
- 
将文件添加到暂存区:
 
git add <文件名>  # 添加单个文件
git add .        # 添加所有修改的文件(不包括被忽略的)
- 
提交到本地仓库:
 
git commit -m "提交说明"  # 提交暂存区内容,说明需简洁明了(如"修复登录bug")
- 
跳过暂存区直接提交(仅修改已跟踪的文件):
 
git commit -am "提交说明"
4.3 查看历史与版本回退
- 
查看提交历史:
 
git log                # 详细历史(按 q 退出)
git log --oneline      # 简洁历史(一行一个提交)
git log --pretty=oneline # 查看提交历史
git log --graph        # 图形化展示分支合并历史,可视化分支关系
git log -- <file>      # 查看某个文件的历史修改
- 
回退到指定版本(谨慎使用!):
 
git reset --soft HEAD~1  # 回退提交,撤销上一次的提交,并保留修改到工作区
git reset --soft HEAD^   # 撤销提交但保留修改
git reset --mixed HEAD~1 # 保留修改,回退暂存区(默认)
git reset --hard HEAD~1 # 彻底撤销上一次的提交,回退到上一个版本,慎用!(~1 表示上1个,~2 表示上2个)
git reset --hard <提交ID>  # 彻底回退到指定版本(提交ID可从 git log 获取前几位)
git reset --hard HEAD^ # 回退到上一版本,(可用`git reflog`恢复找回)
- 
撤销工作区修改(未 add 的文件):
 
git restore <文件名>    # 恢复文件,恢复到最近一次提交的状态
# 下面这两个操作很危险!会丢失修改,会清除工作区中未添加到暂存区中的改动,不可恢复。
git checkout .         # 撤销工作区修改,会用暂存区(全部)的文件替换工作区的文件
git checkout -- <file> # 撤销工作区修改,会用暂存区(指定)的文件替换工作区的文件
- 
撤销暂存区修改(已 add 但未 commit):
 
git reset HEAD <file>         # 撤销暂存区修改
git restore --staged <文件名>  # 将文件从暂存区的修改退回工作区(取消 add)
- 
撤销(工作区+暂存区)修改(已 add ,已 commit):
 
# 撤销(工作区+暂存区)修改
# 下面这两个操作很危险,会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
git checkout HEAD .       # 会用 HEAD 指向的分支中的(全部文件)替换暂存区和以及工作区中的文件
git checkout HEAD <file>  # 会用 HEAD 指向的分支中的(指定文件)替换暂存区和以及工作区中的文件
- 
创建反向提交
 
git revert <commit>       # 创建反向提交(不修改历史)
4.4 分支操作(核心)
Git 的核心在于分支和提交的历史管理,其余命令都是对这些基本概念的扩展和操作。
 分支本质是提交的指针,默认主分支为 main 或 master。
分支用于隔离开发任务(如功能开发、bug 修复),避免影响主代码。
- 
Fork-Pull 请求(GitHub 流程)
- 
Fork 项目 → Clone 到本地 → 创建新分支 → 提交更改 → 提交 Pull Request。
 - 
Pull Request流程:
- 
基于
develop创建功能分支。 - 
提交代码后发起 PR。
 - 
团队审查通过后合并。
 
 - 
 
 - 
 - 
Git Flow 工作流,标准化分支模型,适合中大型项目
- 
主分支
main(稳定版本) - 
开发分支
develop - 
功能分支
feature/xxx - 
发布分支
release/xxx - 
热修复分支
hotfix/xxx 
 - 
 - 
隔离案例:修复线上bug时,从
main创建hotfix/login分支,修复后合并到main和develop - 
查看分支:
 
git branch          # 列出本地分支,查看所有分支(* 表示当前分支)
git branch -r       # 列出远程分支
- 
创建分支:
 
git branch <分支名>  # 创建新分支(基于当前分支)
git branch feature-xxx # 创建一个新分支,名为 feature-xxx
- 
切换分支:
 
git switch <分支名> # 切换到指定分支(Git 2.23+ 推荐)
git checkout <分支名>  # 切换到指定分支
git checkout feature-xxx # 切换到 feature-xxx 分支
- 
创建并切换分支:
 
git switch -c <分支名>
git switch -c feature-xxx
git checkout -b <分支名>  # 等价于 git branch + git checkout
git checkout -b feature-xxx # 创建并切换到 feature-xxx 分支
- 
合并分支:
- 
快进合并 (Fast-Forward):目标分支无新提交时自动合并。
 - 
三方合并 (3-way Merge):解决分支冲突后提交。
 
 - 
 
git merge <分支名A>  # 合并指定分支到当前分支。例如:在 main 分支执行 git merge feature,合并feature 到 main 分支
git merge feature-xxx # 将 feature-xxx 分支的修改合并到当前分支 (main)
git merge <name> --no-ff  # 合并分支(保留记录)
git mergetool # 使用工具解决冲突
- 
删除分支(需先切换到其他分支):
 
git branch -d <分支名>  # 删除已合并的本地分支
git branch -d feature-xxx # 删除已合并的分支 feature-xxx
git branch -D <分支名>  # 强制删除未合并的本地分支(谨慎使用)
git push origin -d <分支名>  # 删除远程分支
- 
解决分支合并冲突
多人修改同一文件,当合并分支时出现冲突,需手动编辑冲突文件(标记为
<<<<<<<,=======,>>>>>>>),保存后执行: 
git add <冲突文件>
git commit
- 
变基 (Rebase)(谨慎操作):
风险注意:不要对已推送的分支执行变基(会重写提交历史,破坏协作,谨慎操作)。
 
git rebase main   # 将当前分支修改“移植”到main分支最新提交后 <x-preset class="no-tts reference-tag disable-to-doc" data-index="1">1</x-preset><x-preset class="no-tts reference-tag disable-to-doc" data-index="3">3</x-preset>
git rebase # 会重写提交历史,破坏协作,谨慎操作
git rebase -i HEAD~3  # 交互式 rebase,合并修改最近3次提交
4.5 远程仓库交互
- 
关联远程仓库(本地仓库首次关联远程时):
 
# 需要在 GitHub 上创建一个新的空仓库,再将本地仓库与一个远程仓库关联起来
git remote add origin <远程仓库地址URL>  # 连接远程仓库,origin 是远程仓库的默认别名
# git remote add origin https://github.com/你的用户名/你的仓库名.git
- 
查看已关联的远程仓库
 
git remote -v # 查看已关联的远程仓库
- 
推送本地分支到远程:
 
git push -u origin <分支名>  # 首次推送,-u 参数表示建立追踪关联远程分支,后续直接用 git push
# 将本地 main 分支的提交推送到远程仓库的 main 分支
git push -u origin main
- 
拉取远程最新代码(同步远程修改到本地):
 
# 从远程仓库拉取最新的更新到本地(非常常用!)
git pull origin <分支名>  # 等价于( git fetch + git merge )
git pull --rebase origin master  # 拉取并合并
- 
获取远程最新信息(不合并):
 
git fetch origin  # 拉取远程分支信息,但不合并到本地
- 
克隆一个已有的远程仓库到本地
 
# 克隆一个已有的远程仓库到本地(是参与别人的项目)
git clone https://github.com/别人的用户名/项目名.git
5 高频工作流
5.1 本地操作(个人)
| 操作 | 命令示例 | 说明 | 
|---|---|---|
| 初始化仓库 | git init | 
当前目录创建新仓库 | 
| 添加缓存 | git add . / git add <file> | 
添加文件到暂存区 | 
| 提交修改 | git commit -m "描述msg" | 
提交到本地仓库 | 
| 查看状态/历史 | git status / git log --oneline | 
检查修改或查看提交记录 | 
| 撤销修改 | git checkout -- <file> | 
丢弃工作区未暂存的修改 | 
- 
代码提交规范:
使用语义化提交消息(如
feat:、fix:、docs:),参考 Conventional Commits。 
5.2 基本流程(多人协作)
- 
进入工作项目文件夹目录内部,创建并初始化新仓库:
git init - 
关联远程仓库,管理远程仓库:
git remote add origin <远程仓库 URL> - 
从远程仓库克隆代码到本地:
git clone <远程地址 URL> - 
每个新功能独立分支开发,创建新分支开发功能:
git switch -c feature/xxx - 
开发中频繁添加文件到暂存区、提交更改到本地仓库:
git add .→git commit -m "xxx" - 
查看当前仓库状态、查看提交历史日志:
git status→git log - 
定期从远程仓库拉取最新代码,更新本地仓库(避免冲突):
git pull origin main - 
本地仓库功能开发完成后,推送代码到远程:
git push -u origin feature/xxx,git push -u origin main - 
在远程仓库(如 GitHub/Gitee/GitLab)发起 Pull Request(PR),等待审核合并。
 - 
解决推送冲突,先
git pull→ 解决冲突 → 重新提交。 
# 1.1 进入项目文件夹目录内部
cd project
# 1.2 创建并初始化一个新的 Git 仓库
git init
# 2 关联远程仓库,管理远程仓库
git remote add origin <URL>
# 3 从远程仓库克隆代码到本地
git clone <URL> 
# 4 创建新分支开发功能
git switch -c feature/xxx
# 5.1 开发中频繁添加文件到暂存区
git add <file> # 添加指定单个文件到暂存区
git add .      # 添加所有变化的文件到暂存区(新增、修改)
git add -u     # 添加所有修改和删除的文件,但不包括新文件
git add -p     # 拆分文件提交
# 5.2 开发中频繁提交更改到本地仓库
git commit -m "描述本次修改"
git commit -m "写一句清晰的提交说明,比如:添加了用户登录功能"
# 6.1 查看当前仓库状态,包括暂存区和工作区的对比。(常用!哪些被修改了、哪些已暂存)
git status
# 6.2 查看提交历史日志,包含提交的哈希码、日期、提交者、提交信息等。
git log
# 7 定期从远程仓库拉取最新代码,更新本地仓库(避免冲突)。git pull(= fetch + merge)
git pull origin main
# 8 本地仓库功能开发完成后,将本地代码推送到远程仓库
git push -u origin feature/xxx
git push -u origin main
git push origin main
# 9 在远程仓库(如 GitHub)发起 Pull Request(PR),等待审核合并。
# 10 解决推送冲突,先 `git pull` → 解决冲突 → 重新提交。
6 实用技巧
6.1 忽略文件
创建一个名为 .gitignore 的文件,列出希望 Git 忽略,不需要跟踪的文件和文件夹(如日志、依赖、本地配置文件、IDE 配置、编译产物、node_modules 等等):
- 
.gitignore忽略文件示例:- 
node_modules/:表示忽略 node_modules 依赖目录 - 
*.log:表示忽略所有 .log 文件 - 
!important.log:表示不要忽略 important.log 文件 - 
.idea/:表示忽略 IDEA 配置 
 - 
 
6.2 解决合并冲突
合并分支时若出现冲突(同一文件同一位置修改),Git 会在文件中标记冲突位置:
<<<<<<< HEAD(当前分支内容)
这是当前分支的代码
=======
这是待合并分支的代码
>>>>>>> feature/xxx(待合并分支)
冲突解决方式流程:
执行git pull后若冲突,手动编辑修改文件保留需要的内容,然后 git add <冲突文件> 和 git commit 完成合并。
6.3 Stash 储藏更改
当需要切换分支,但又不想提交未完成的工作时,即工作区未提交时(暂存未提交的更改),可用 stash 临时储藏,暂存当前修改,临时存储工作区:
git stash        # 储藏当前工作区和暂存区的修改,保存工作进度
git stash pop    # 恢复进度,恢复最近一次暂存储藏并删除储藏记录
git stash list   # 查看暂存储藏列表
git stash save "描述"     # 暂存修改
git stash apply          # 应用暂存
6.4 查看文件差异
git diff              # 查看工作区与暂存区的差异
git diff --cached     # 查看暂存区与上次提交的差异
git diff --staged     # 查看暂存区和最新提交的差异
git diff commit_id1 commit_id2 # 查看两次提交之间的差异
6.5 图形化工具推荐
- 
VS Code(内置Git支持)、GitKraken(可视化分支)、SourceTree。
 
6.6 特殊场景
- 
回退目录:
git reset <commit> -- src/ - 
精准移植提交:
git cherry-pick abc123 
7 进阶技能
7.1 标签(Tag)
- 
为特定提交打标签(如版本号),创建版本标签:
git tag -a v1.0 -m "Release"→git push origin v1.0。 
git tag v1.0
git push origin v1.0    # 推送标签到远程
7.2 子模块(Submodule)
- 
添加子模块:
git submodule add <url>。 - 
克隆含子模块项目:
git clone --recurse-submodules <url>。 
8 Git 练习
8.1 学习资源
- 
官方文档
- 
Git 官方文档:https://git-scm.com/doc (最权威,有书和多国语言版本)。
 - 
Pro Git 书籍(免费电子书)(官方文档)
 
 - 
 - 
在线课程
- 
GitHub Learning Lab(互动式教程)
 - 
freeCodeCamp Git 教程(英文)
 
 - 
 - 
工具辅助
- 
图形化工具 (GUI):初学者可以先用 GUI 工具辅助理解,如 GitHub Desktop, GitKraken, Sourcetree, VS Code 内置的 Git 功能。它们能可视化地看到分支、提交历史的变化。
 - 
托管平台:GitHub、GitLab、Bitbucket。
 
 - 
 
8.2 学习路径
- 
学习目标
掌握Git核心功能,能够独立完成项目版本管理、分支协作及远程开发,具备解决常见冲突和优化工作流程的能力。
 - 
分阶段学习
 
graph LR
A[核心概念] --> B[安装配置]
B --> C[本地操作:add/commit/status/log]
C --> D[分支管理:branch/merge]
D --> E[远程协作:clone/push/pull/PR]
E --> F[高级技巧:stash/revert/rebase]
8.3 学习实践
最重要的建议:实践是学习 Git 的关键!不要怕犯错! Git 几乎所有的操作都是可以撤销或挽回的。大胆地去使用它,遇到问题时,善用 git help <命令> 或搜索解决方案(如 Stack Overflow),99% 的 Git 问题网上都有答案。
- 
个人仓库
- 
在GitHub创建仓库,模拟完整流程:
- 
初始化 → 分支开发 → 合并 → 部署
 
 - 
 - 
学习基本的提交、分支和推送操作。
 - 
实践标签管理:
git tag v1.0.0 
 - 
 - 
协作项目
- 
在 或 创建仓库练习协作。
 - 
在 GitHub 上参与开源项目,练习 Pull Request 和 Issue 跟踪。
 - 
实践
clone→修改→commit→push→创建PR的全流程。 
 - 
 - 
模拟团队开发
- 
与朋友一起克隆同一仓库,练习合并分支和解决冲突。
 - 
分支命名规范
 - 
代码审查流程
 - 
解决合并冲突
 
 - 
 - 
交互式练习
- 
(可视化分支操作,交互式学习游戏,通过游戏直观理解分支和合并)
 - 
Git Exercises(命令实战)。
 
 - 
 - 
实践
- 
在自己的项目上用起来!从
git init,add,commit,push开始。 - 
在 GitHub 上找一个开源项目,Fork 它,克隆到本地,尝试修改然后提交,最后发起一个 Pull Request (PR)。这是最真实的协作体验。
 
 - 
 
8.4 关键提示
- 
动手实践: 理解 Git 核心思想,遇到冲突时善用
git diff和图形化工具(如VSCode内置Git)。 - 
高频练习:实际使用中,多练习分支操作和远程协作。
 - 
原子化提交:每次提交只解决一个问题。
 - 
频繁拉取更新:
push前务必先pull,减少冲突。 - 
.gitignore:忽略日志、编译产物等无关文件(例:添加
node_modules/)。 - 
工作流:掌握工作流逻辑后,命令自然熟练。
 - 
遇到问题多查阅
git --help或官方文档,实践是掌握Git的核心! 
8.5 实践避坑
- 
慎用
git push -f:强制推送会覆盖远程分支,需团队确认 - 
共享分支避免变基:已推送至远程的分支禁止使用
git rebase - 
临时修改用
git stash:避免污染提交记录 
内容目录
2.1 本地三大区域2.2 远程第四区域2.3 分布式架构2.4 数据存储原理
3.1 安装 Git3.2 初始配置(必做)3.3 可选配置
4.1 仓库初始化与克隆4.2 添加文件与跟踪提交4.3 查看历史与版本回退4.4 分支操作(核心)4.5 远程仓库交互
6.1 忽略文件6.2 解决合并冲突6.3 Stash 储藏更改6.4 查看文件差异6.5 图形化工具推荐6.6 特殊场景
 
