文章目录
- 目录
- 引言
- 环境准备
- 一、仓库初始化与首次提交
- 1.1 初始化 Git 仓库
- 1.2 创建 .gitignore 文件
- 1.3 首次提交
- 技术解析
- 二、分支创建与多轮小步提交
- 2.1 切出 feature 分支
- 2.2 2-3 次小步提交
- 第一次提交:新增功能基础文件
- 第二次提交:实现核心逻辑
- 第三次提交:修复参数校验问题
- 技术解析
- 三、分支合并(merge 选型及理由)
- 3.1 合并到 main 分支
- 3.2 选型理由(merge vs rebase)
- 四、制造并解决合并冲突
- 4.1 制造冲突
- 步骤1:feature 分支修改目标行
- 步骤2:main 分支修改同一行
- 步骤3:触发合并冲突
- 4.2 解决冲突
- 步骤1:查看冲突文件
- 步骤2:手动解决冲突
- 步骤3:完成合并提交
- 技术解析
- 五、版本回滚(git revert 演示)
- 5.1 查看提交历史
- 5.2 执行 git revert
- 5.3 补充:cherry-pick 迁移修复提交
- 技术解析
- 六、GitHub 平台适配说明
- 总结
- 核心要点回顾
目录
引言
若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力!有问题请私信或联系邮箱:funian.gm@gmail.com
Git 作为分布式版本控制系统,是开发者日常协作、代码版本管理的核心工具。本文将通过空目录实操的方式,按步骤演示 Git 最核心的基础操作(初始化、分支管理、提交、合并、冲突解决、版本回滚),并结合技术解析说明背后的设计逻辑,帮助新手快速掌握 Git 核心用法。
环境准备
本次演示基于 Linux/macOS 终端(Windows 可使用 Git Bash),先创建空目录作为演示仓库:
# 创建并进入空目录mkdirgit-demo&&cdgit-demo一、仓库初始化与首次提交
1.1 初始化 Git 仓库
git init是创建 Git 仓库的第一步,会在当前目录生成隐藏的.git文件夹(仓库核心配置/版本记录都存于此):
# 初始化仓库gitinit# 验证:查看.git目录(Linux/macOS)ls-la|grep.git输出示例:drwxr-xr-x 9 user staff 288 Jan 9 10:00 .git,说明初始化成功。
1.2 创建 .gitignore 文件
.gitignore用于指定 Git 需忽略的文件/目录(如日志、缓存、IDE 配置等),避免无关文件提交到仓库。
创建并编辑.gitignore:
# 创建.gitignore文件touch.gitignore# 编辑内容(示例:忽略常见无用文件)cat>.gitignore<<EOF # 日志文件 *.log # 缓存目录 node_modules/ # IDE配置(VSCode) .vscode/ # 系统临时文件 .DS_Store EOF1.3 首次提交
提交是 Git 保存版本的核心操作,需遵循清晰的提交信息规范(推荐 Conventional Commits 规范:类型+描述):
# 将.gitignore加入暂存区gitadd.gitignore# 首次提交(提交信息清晰描述操作)gitcommit -m"feat: 初始化仓库,添加.gitignore忽略规则"提交成功后,可通过git log查看提交记录:
gitlog --oneline# 输出示例:f876541 (HEAD -> main) feat: 初始化仓库,添加.gitignore忽略规则技术解析
git init:初始化本地仓库,生成.git目录(包含 objects、refs、config 等核心文件);.gitignore规则:支持通配符(*)、目录(/)、注释(#),优先级为「本地.gitignore > 全局.gitignore > .git/info/exclude」;- 提交信息规范:
类型(可选作用域): 描述(如 feat/fix/docs/style/refactor/test/chore),便于追溯和自动化生成 CHANGELOG。
二、分支创建与多轮小步提交
2.1 切出 feature 分支
Git 分支是「轻量级指针」,feature/<topic>是行业通用的功能分支命名规范(<topic>为功能主题),用于隔离功能开发:
# 从main分支创建并切换到feature/user-login分支(推荐新命令git switch)gitswitch -c feature/user-login# 等价于旧命令:git checkout -b feature/user-login# 验证分支状态gitbranch# 输出示例:* feature/user-login# main2.2 2-3 次小步提交
「小步提交」是 Git 最佳实践:每次提交只完成一个小功能/修复,便于追溯、回滚和代码评审。
第一次提交:新增功能基础文件
# 创建用户登录功能文件touchuser.js# 写入基础代码echo"// 用户登录模块">user.js# 暂存+提交gitadduser.jsgitcommit -m"feat: 新增用户登录模块基础文件"第二次提交:实现核心逻辑
# 修改user.js,添加登录函数cat>>user.js<<EOF // 登录函数 function login(username, password) { return { code: 200, msg: "登录成功" }; } EOF# 提交gitcommit -am"feat: 实现用户登录核心函数"# -am 等价于:git add + git commit(仅适用于已追踪文件)第三次提交:修复参数校验问题
# 修改user.js,补充参数校验sed-i'''3i\ if (!username || !password) return { code: 400, msg: "参数不能为空" };\ 'user.js# 提交gitcommit -am"fix: 补充登录参数非空校验"技术解析
- 分支本质:
refs/heads/目录下的文本文件,存储对应提交的哈希值; - 小步提交优势:
- 单个提交逻辑清晰,便于 Code Review;
- 回滚时仅影响局部功能,风险可控;
- 多人协作时减少冲突概率。
三、分支合并(merge 选型及理由)
3.1 合并到 main 分支
合并分支有两种核心方式:merge和rebase,本次选择merge(更适合新手+保留分支历史):
# 切换回main分支gitswitch main# 合并feature/user-login到maingitmerge feature/user-login --no-ff# --no-ff:强制创建合并提交(保留分支历史,便于追溯)合并成功后,git log --graph --oneline可查看分支合并图谱:
* a1b2c3d (HEAD -> main) Merge branch 'feature/user-login' |\ | * e4f5g6h (feature/user-login) fix: 补充登录参数非空校验 | * i7j8k9l feat: 实现用户登录核心函数 | * m0n1o2p feat: 新增用户登录模块基础文件 |/ * f876541 feat: 初始化仓库,添加.gitignore忽略规则3.2 选型理由(merge vs rebase)
| 操作 | 特点 | 适用场景 |
|---|---|---|
merge | 保留分支历史,生成合并提交,无代码篡改 | 团队协作、公共分支(main/develop) |
rebase | 线性历史,无合并提交,重写提交哈希 | 个人开发分支、功能分支合入前整理 |
本次选 merge 的核心原因:
- 新手易理解:合并记录清晰,可通过
git log直观看到功能分支的所有提交; - 无风险:
rebase会改写提交历史,若分支已推送到远程,可能导致协作冲突,merge更安全; - 可追溯:保留「功能开发-合并」的完整上下文,便于后续问题定位。
四、制造并解决合并冲突
4.1 制造冲突
冲突产生的核心原因:同一文件的同一行被不同分支修改。
步骤1:feature 分支修改目标行
# 切回feature分支,修改user.js第5行(登录提示)gitswitch feature/user-login# 修改登录提示文案sed-i'''s/msg: "登录成功"/msg: "登录成功,欢迎回来"/'user.js# 提交修改gitcommit -am"feat: 优化登录成功提示文案"步骤2:main 分支修改同一行
# 切回main分支,修改同一行(不同文案)gitswitch mainsed-i'''s/msg: "登录成功"/msg: "登录成功,您的账号安全有效"/'user.js# 提交修改gitcommit -am"feat: 调整登录成功提示语"步骤3:触发合并冲突
# 合并feature分支到main,触发冲突gitmerge feature/user-login终端会提示冲突:
Auto-merging user.js CONFLICT (content): Merge conflict in user.js Automatic merge failed; fix conflicts and then commit the result.4.2 解决冲突
步骤1:查看冲突文件
gitstatus# 输出示例:# both modified: user.js步骤2:手动解决冲突
打开user.js,冲突区域会被标记:
// 用户登录模块// 登录函数functionlogin(username,password){if(!username||!password)return{code:400,msg:"参数不能为空"};return{code:200,msg:"登录成功"};<<<<<<<HEADreturn{code:200,msg:"登录成功,您的账号安全有效"};=======return{code:200,msg:"登录成功,欢迎回来"};>>>>>>>feature/user-login}<<<<<<< HEAD:main 分支的代码;=======:冲突分割线;>>>>>>> feature/user-login:feature 分支的代码。
手动修改为最终想要的内容(比如合并两者的优点):
// 用户登录模块// 登录函数functionlogin(username,password){if(!username||!password)return{code:400,msg:"参数不能为空"};return{code:200,msg:"登录成功,欢迎回来!您的账号安全有效"};}步骤3:完成合并提交
# 标记冲突文件已解决gitadduser.js# 完成合并提交gitcommit -m"fix: 解决user.js登录提示文案合并冲突"技术解析
- 冲突本质:Git 无法自动判断同一行代码的优先级,需人工介入;
- 冲突解决核心:保留正确代码,删除冲突标记(
<<<<<<</=======/>>>>>>>); - 避免冲突:频繁拉取远程分支、小步提交、按模块分工开发。
五、版本回滚(git revert 演示)
Git 回滚有两种核心方式:git revert(安全,推荐)和git reset(危险,不建议公共分支使用)。
5.1 查看提交历史
gitlog --oneline# 输出示例(假设需回滚“调整登录提示语”的提交):# 9876543 (HEAD -> main) fix: 解决user.js登录提示文案合并冲突# 8765432 feat: 调整登录成功提示语# 7654321 Merge branch 'feature/user-login'# ...5.2 执行 git revert
git revert会创建一个反向提交,撤销指定提交的修改,且保留原提交历史(无数据丢失):
# 回滚“调整登录成功提示语”的提交(哈希为8765432)gitrevert8765432若有冲突,按第四步的方法解决后执行git commit即可。
5.3 补充:cherry-pick 迁移修复提交
git cherry-pick用于「挑选单个提交」迁移到其他分支(比如将 feature 分支的修复提交迁移到 main):
# 查看feature分支的修复提交哈希gitlog feature/user-login --oneline# 输出示例:e4f5g6h fix: 补充登录参数非空校验# 切回main分支,迁移该提交gitswitch maingitcherry-pick e4f5g6h技术解析
| 回滚方式 | 原理 | 适用场景 | 风险 |
|---|---|---|---|
git revert | 创建反向提交,撤销修改 | 公共分支(main/develop) | 无 |
git reset | 移动HEAD指针,删除提交 | 本地私有分支、未推送提交 | 高(数据丢失) |
git cherry-pick | 复制单个提交到当前分支 | 跨分支迁移修复/小功能提交 | 低(仅复制提交) |
六、GitHub 平台适配说明
以上操作均为本地操作,若需推送到 GitHub,补充以下步骤:
# 1. 在GitHub创建空仓库,复制仓库地址# 2. 添加远程仓库gitremoteaddorigin https://github.com/你的用户名/git-demo.git# 3. 推送到GitHub(-u 绑定本地main到远程origin/main)gitpush -u origin main# 4. 推送feature分支到远程gitpush origin feature/user-login总结
核心要点回顾
- 仓库初始化:
git init生成.git目录,.gitignore 规范忽略文件,首次提交需清晰描述; - 分支管理:
feature/<topic>命名规范,小步提交便于追溯,合并优先选merge(保留历史); - 冲突解决:冲突源于同一行多分支修改,手动删除冲突标记并保留正确代码,
git add标记解决; - 版本回滚:公共分支用
git revert(安全),私有分支可试用git reset,跨分支迁移提交用git cherry-pick。