一文吃透Git:本地操作|冲突处理|远程协作|GitFlow工作流详解

发布时间:2026/9/12 20:32:21
一文吃透Git:本地操作|冲突处理|远程协作|GitFlow工作流详解 文章说明本文基于比特就业课Git讲义整理涵盖Git安装、核心概念、本地操作、分支管理、冲突处理、远程仓库、多人协作、企业GitFlow分支模型适合入门学习、期末复习、面试复习。一、什么是版本控制器1.1 痛点日常写文档、写代码为了防止改错丢失手动复制多份文件报告‑v1、报告‑v2、报告‑最终版、报告‑究极版。问题版本多记不清每个版本改了什么多人协同修改文件很难合并。1.2 版本控制器记录工程每一次改动、版本迭代支持版本回溯方便多人协同作业。Git是目前行业最主流分布式版本控制器。重要特性1. Git主要跟踪文本文件代码、txt、html可以精确看到哪一行增删改。2. 二进制文件图片、视频、压缩包仅能保存完整文件无法看到内部改动细节只能感知文件大小变化。二、Git安装与基础配置2.1 各平台安装命令1. CentOS7sudo yum -y install git git --version #查看版本2. Ubuntusudo apt-get install git -y git --version3. Windows下载安装包图形化安装。2.2 用户信息配置必做提交代码身份标识--global全局配置本机所有git仓库生效不加则仅当前仓库生效。# 设置用户名和邮箱 git config --global user.name 你的名字 git config --global user.email 你的邮箱 # 查看全部配置 git config -l # 删除配置 git config --global --unset user.name git config --global --unset user.email三、创建本地仓库 .git目录详解3.1 创建本地仓库仓库就是被Git管理的文件夹。git init # 在当前目录初始化git仓库执行后生成隐藏目录 .git绝对不要手动修改里面文件会直接损坏仓库。3.2 .git目录核心文件/文件夹解析文件/目录作用index暂存区(stage/index)git add的内容存这里HEAD指针记录当前所处分支内容示例ref: refs/heads/masterrefs/heads/存放各个分支每个文件保存该分支最新commit‑idrefs/tags/存放标签tag信息objects/对象库存放git全部提交对象blob、tree、commithooks/钩子脚本可在提交/推送前后执行自定义脚本查看对象内容命令git cat-file -p commit‑id可以解析commit对象、tree对象、blob对象。commit‑id是SHA‑1哈希生成的40位十六进制字符串不是简单1、2、3自增数字。四、三大核心区域工作区、暂存区、版本库1. 工作区电脑实际操作的文件夹我们写代码的地方。2. 暂存区stage/index.git/index临时存放待提交修改桥梁。git add将工作区改动放到暂存区。3. 版本库repository.git目录真正保存历史所有版本git commit把暂存区数据存入版本库。关键流程工作区 →git add→ 暂存区 →git commit→版本库。仅仅新建文件只是工作区文件git不会管理必须addcommit。五、本地基础命令5.1 添加文件到暂存区 git addgit add 文件名1 文件名2 # 添加指定文件 git add 目录名 # 添加整个目录包括子目录 git add . # 添加当前目录所有改动5.2 提交到本地版本库 git commit‑m必须写填写本次提交说明方便后续回溯。git commit -m 提交说明 # 提交暂存区全部内容 git commit 文件1 文件2 -m xxx # 只提交暂存区指定文件5.3 查看提交日志 git loggit log # 完整日志 git log --prettyoneline # 简洁一行展示显示commit id说明 git log --graph --prettyoneline --abbrev-commit #图形化看分支合并5.4 查看状态与差异git status # 查看工作区、暂存区状态提示下一步操作 git diff # 工作区 vs 暂存区差异 git diff HEAD -- 文件名 # 工作区 vs 版本库最新版本差异六、版本回退 reset 命令6.1 reset三种模式git reset [--soft | --mixed | --hard] [版本标识]参数版本库暂存区工作区使用风险--soft回退不变不变安全只移动HEAD指针--mixed(默认)回退回退不变常用--hard回退回退回退⚠️危险未提交代码直接丢失6.2 版本定位写法HEAD 当前版本 HEAD^ 上一个版本 HEAD^^ 上上版本 HEAD~n 往上n个版本 完整/部分commit‑id 指定某个历史版本6.3 找回丢失commitgit refloggit log看不到已经被回退覆盖的commitgit reflog记录本地每一次操作可以找回所有曾经的commit id。git reflog git reset --hard 部分commit-id # 恢复到丢失版本七、撤销修改的三种场景场景1修改完还没有git add只在工作区丢弃工作区修改恢复到暂存区/版本库状态git restore 文件名 # 旧写法git checkout -- 文件名 --不能省略场景2已经git add到暂存区没有commit第一步把文件从暂存区撤回到工作区第二步丢弃工作区修改git reset HEAD 文件名 # 取消暂存mixed模式 git restore 文件名 # 丢弃工作区改动场景3已经git commit提交本地还没有push远程直接版本回退git reset --hard HEAD^⚠️注意如果已经推送到远程仓库不建议本地reset回退会造成远程本地版本冲突。八、删除文件1. 手动rm删除只是工作区删除git依然记录该文件。2. git rm同时删除工作区暂存区之后需要commit提交这次删除操作。git rm 文件名 git commit -m 删除xxx文件误删恢复git restore 文件名九、Git分支管理概念每次commit连成一条时间线就是分支。HEAD不是指向提交HEAD指向当前分支指针。master是git初始化默认主分支。9.1 分支基础命令git branch # 查看本地所有分支*代表当前分支 git branch dev # 创建dev分支 git checkout dev # 切换到dev分支 git checkout -b dev # 创建并且直接切换dev最常用 git merge dev # 将dev分支合并到【当前所在分支】 git branch -d dev # 删除已经合并过的分支 git branch -D dev # 强制删除没有合并完成的废弃分支注意不能删除自己当前正在checkout的分支要切到别的分支再删。9.2 Fast‑forward快进合并如果master没有新提交dev分支直接移动master指针无新增commit。缺点删除分支之后历史看不出曾经做过合并。9.3 --no‑ff 禁用快进推荐正式项目合并的时候强制生成一个新merge提交完整保留分支历史痕迹。git merge --no-ff -m 合并dev分支 dev十、合并冲突处理当两个分支对同一个文件同一处都做了修改git无法自动合并出现冲突CONFLICT(content)。1. git提示冲突文件内标记冲突标记 HEAD // 当前分支内容 当前分支代码 //分割线 被合并分支代码 dev1 //被合并分支名2. 手动打开文件删掉 标记编辑成最终想要的代码3. git add .标记冲突解决4. git commit -m 解决冲突合并分支提交完成合并。放弃本次合并git merge --abort十一、stash 工作现场储藏场景正在分支写一半代码功能没写完突然需要切别的分支修复bug不想提交半成品代码。git stash # 保存当前工作现场工作区变干净 git stash list # 查看所有储藏的现场 git stash pop # 恢复现场同时删掉这条stash记录最常用 git stash apply # 恢复不删除stash记录需要手动git stash drop git stash apply stash{0} # 指定恢复某一条储藏最佳实践修复bug优先在自己本地分支解决冲突再合并到主分支不要直接在master解决冲突保护主分支稳定。即dev分支先merge master冲突在dev解决测试完毕master再merge dev此时无冲突。git stash 通俗讲解场景你正在自己分支写代码代码只写一半不能提交commit但是现在要切到别的分支改Bug。直接切换分支未保存的代码会跟着跑到另一个分支代码全部乱掉。stash就是临时把写一半的代码“打包封存起来”把工作区变回干净状态等处理完Bug切回来再把代码恢复出来。每条命令详解git stash # 保存当前工作现场工作区变干净把工作区、暂存区改动打包存起来。执行完git status工作目录干干净净就像没写过这些代码一样。⚠️只保存已经修改的文件新创建还没有git add的全新文件默认不会被stash保存。git stash list # 查看所有储藏的现场你可以多次执行git stash会存多条备份。输出示例stash{0}: WIP on dev: a23bc4d 完成登录模块 stash{1}: WIP on dev: 87fa321 开始写聊天框stash{0}代表最新保存的那一份现场数字越大保存时间越早。git stash pop # 恢复现场同时删掉这条stash记录✅最常用取出**最新stash{0}**的代码恢复到工作区恢复成功之后这条储藏记录直接删除。日常90%场景用pop用完即销毁不会堆积无用stash。git stash apply # 恢复不删除stash记录需要手动git stash drop把代码恢复出来但是备份记录仍然保留在仓库中。如果后续不需要这条备份必须手动执行git stash drop stash{0} # 删除指定一条储藏 git stash clear # ⚠️清空全部stash备份git stash apply stash{0} # 指定恢复某一条储藏当你有多份stash备份不想取最新的指定恢复某一条。例git stash apply stash{1}恢复更早的那一份代码现场。完整实战流程1. 在dev分支写了一半代码还不能commit2. git stash # 封存半成品工作目录干净3. git checkout master # 切换主分支去修复线上bug4. 修改Bug → git commit提交bug修复5. git checkout dev # 切回自己开发分支6. git stash pop # 将之前写一半的代码恢复回来继续开发⚠️容易踩坑1. 如果恢复代码的时候当前文件已经改动会产生stash冲突和分支合并冲突一模一样手动解决标记符号。2. stash是本地仓库功能不会上传远程Gitee/GitHub换电脑就看不到这些储藏。3. 全新未add的文件不会被stash保存新文件先执行git add再stash。一句话面试回答git stash用于保存尚未提交的工作现场。开发进行到一半需要临时切换分支处理bug使用stash把半成品临时储藏处理完别的工作之后再恢复代码。pop恢复并删除备份apply恢复但保留备份list查看所有储藏列表。十二、.gitignore忽略文件作用告诉git某些文件/文件夹不要纳入版本管理比如编译产物、日志、配置、临时文件。.gitignore示例内容*.so *.ini build/ # 排除所有.开头隐藏文件但保留.gitignore .* !.gitignore强制添加被忽略的文件git add -f 文件名排查哪个规则忽略文件git check‑ignore -v 文件名十三、远程仓库Gitee/GitHubGit是分布式版本控制系统每个人电脑都拥有完整仓库副本不需要联网也可以本地提交。公共服务器gitee/github仅仅方便大家交换代码。13.1 两种协议1. HTTPS协议直接克隆每次push需要输入账号密码。2. SSH协议配置SSH公钥免密码推送。SSH密钥配置步骤1. 生成密钥对ssh-keygen -t rsa -C 你的注册邮箱 # 一路回车生成 ~/.ssh/id_rsa(私钥保密) id_rsa.pub(公钥粘贴到gitee)2. 复制id_rsa.pub全部内容粘贴到gitee账号‑SSH公钥设置。13.2 远程仓库基础命令git clone 远程仓库地址 # 克隆远程仓库到本地自动生成origin远程别名 git remote # 查看远程仓库别名默认origin git remote -v # 查看远程仓库详细fetch/push地址 #推送git push 远程别名 本地分支:远程分支 git push origin master # 本地master推送到远程origin的master git pull origin master # 拉取远程master并且合并到当前本地分支推送失败常见原因远程有别人新提交本地版本落后先执行git pull拉取合并解决冲突再push。13.3 本地分支关联远程分支# 本地新建dev分支关联origin/dev远程分支 git checkout -b dev origin/dev # 设置已有本地分支追踪远程分支 git branch --set-upstream-toorigin/dev dev查看全部本地远程分支git branch -a git branch -r #只看远程分支远程已经删除本地还显示过期远程分支清理git remote prune origin十四、tag标签管理tag给某一个commit打版本标记用于版本发布如v1.0、v2.0。git tag #查看全部标签 git tag v1.0 #给最新commit打标签 git tag v0.9 commit-id #给指定历史commit打标签 git tag -a v1.1 -m 版本1.1发布说明 #带说明的标签 git show v1.0 #查看标签对应的提交详情 git tag -d v1.0 #删除本地标签 git push origin v1.0 #推送单个标签到远程 git push origin --tags #推送所有本地标签到远程 #删除远程标签 git push origin :refs/tags/v1.0十五、多人协同开发流程1. 开发者克隆仓库2. 开发新功能新建feature/xxx本地分支开发3. 开发完成push推送到远程feature分支4. 如果推送被拒绝远程版本比本地新 →git pull拉取远程本地解决冲突再push5. 自测完毕提交Pull Request/Merge Request请求合并到目标分支6. 管理员代码评审合并到目标分支7. 合并完成删除临时feature分支。规范禁止直接在master主分支写代码master只接受合并保证主分支稳定。十六、企业GitFlow分支模型分支名称作用来源分支合并去向说明master生产线上正式版本无hotfix/release只读稳定分支上线版本打tag禁止直接修改develop开发主分支存放开发完成功能masterrelease所有feature开发完合并到此开发环境使用feature/*新需求/新功能开发分支developdevelop每个需求新建开发完合并develop上线后删除release/*预发布/测试分支developdevelop master提测给测试人员测试环境、预发布环境上线完成删除hotfix/*线上紧急bug修复分支mastermaster develop线上出故障基于master创建修复后同时合并master和develop打完tag删除GitFlow完整工作流1. 新需求基于develop创建feature/xxx分支开发2. feature开发完成合并回develop3. 一批需求完成基于develop拉出release/v1.0交给测试4. release测试出bug在release分支修复5. 测试全部通过release分别合并进master和developmaster打版本tag删除release分支6. 线上出现紧急bug从master拉hotfix/xxx修复修复完同时合并master、developmaster打tag删除hotfix。补充GitFlow只是一种分支模型不是唯一标准还有主干开发模式企业根据团队规模灵活选择。十七、开发环境概念1. 开发环境开发人员日常调试代码来自develop分支2. 测试环境测试人员测功能来自release分支3. 预发布环境配置和线上生产完全一致上线前最后验证4. 生产环境面向真实用户线上服务来自master分支。十八、常见面试简答题1. 工作区、暂存区、版本库三者关系1工作区我们实际操作代码的本地文件夹日常编写修改代码的位置。2暂存区Stage/Index相当于一个临时中转站位于.git/index。执行git add将工作区的改动放到暂存区。3版本库本地仓库.git目录Git真正保存所有历史版本数据执行git commit将暂存区内容提交存入版本库生成一条版本记录。完整流程工作区 → git add → 暂存区 → git commit → 版本库新创建文件仅仅停留在工作区Git不会跟踪必须经过git add放到暂存区再git commit提交版本库才算纳入版本管理。2. git reset --soft / --mixed / --hard区别--hard风险git reset移动HEAD分支指针回退到指定历史版本。三种模式对三个区域影响各不相同1 --soft只移动版本库HEAD指针。暂存区、工作区内容保持原样不变。场景想重新commit不需要改动代码只重新生成一次提交记录。2 --mixed默认模式可以省略不写版本库回退暂存区同步回退工作区不变。场景提交之后想撤销提交修改完代码再重新提交最常用。3 --hard版本库回退、暂存区回退、工作区文件也强制回退到历史版本。⚠️--hard风险工作区所有未提交的修改会直接永久丢失无法恢复如果代码已经push推送到远程仓库再本地reset --hard本地和远程版本不一致后续推送会报错多人协作环境严禁随意使用。参数版本库暂存区工作区--soft回退不变不变--mixed(默认)回退回退不变--hard回退回退回退数据丢失风险3. git stash什么时候用使用场景当前分支代码写了一半半成品不能commit提交但是需要临时切换其他分支去修复bug或者处理紧急任务。直接切换分支未提交的修改会跟随到另一个分支造成代码混乱。• git stash把当前工作区、暂存区的修改打包储藏让工作目录恢复干净此时可以安全切换分支• 处理完别的工作切回原分支git stash pop恢复之前半成品代码继续开发。补充要点1stash只保存在本地不会上传远程仓库2默认不会保存还没有git add的全新文件3pop恢复同时删除储藏记录apply恢复但是保留储藏备份。4. 什么是冲突冲突如何解决什么是冲突两个不同分支对同一个文件的同一行代码都做了修改Git无法自动判断采用哪一份代码合并时就产生冲突。冲突解决完整步骤1. Git提示CONFLICT(content)文件内部自动写入冲突标记 HEAD // 当前分支代码 此处是当前分支内容 // 分割线 此处是被合并过来分支代码 dev // 被合并分支名称2. 打开文件手动删除 这些标记把代码编辑成最终需要的正确版本3. 修改完毕执行git add 文件名标记冲突已经解决4. 执行git commit完成本次合并。如果想放弃本次合并恢复合并之前状态git merge --abort5. Fast‑forward和--no‑ff合并区别Fast‑forward快进合并Git默认行为条件master分支没有产生任何新提交。合并dev分支的时候Git不产生新commit仅仅直接把master指针移动指向dev最新提交。缺点1. 没有新增合并提交记录2. 如果后续删除dev分支整个分支开发历史痕迹直接消失无法看出曾经进行过一次分支合并。--no‑ff禁用快进合并git merge --no‑ff -m 合并dev分支 dev无论是否满足快进条件强制生成一条全新merge提交节点。✅优点完整保留分支历史可以清晰看到什么时候做的分支合并企业正式项目推荐使用。简单总结fast‑forward不生成新commit历史干净但丢失分支痕迹--no‑ff生成专门合并commit保留完整分支演进轨迹。6. GitFlow各个分支用途feature/release/hotfix/master/develop1 master主分支线上生产稳定版本只读禁止直接在这里写代码。每一次上线版本都会打tag标签代表线上发布版本。2 develop开发主分支所有开发功能完成之后合并到此分支作为开发环境基准分支。所有新功能从develop拉出。3 feature/*功能分支每个新需求新建一条feature分支从develop分支拉出功能开发测试完成合并回develop上线之后该分支删除。4 release/*预发布/测试分支一批功能开发完毕从develop分支拉出release分支交给测试人员。只修改bug不新增功能。测试全部通过同时合并到master和developmaster打版本tag之后删除release分支。5 hotfix/*热修复分支线上master出现严重紧急bug。直接从master分支拉出hotfix分支修复故障bug修复完成同时合并回master打tag上线与develop保证下一个版本也包含bug修复代码处理完毕删除hotfix口诀feature做功能release给测试hotfix救线上develop汇总开发master保存线上稳定版本。7. git reflog作用git log只能看到当前分支可到达的commit提交记录。当执行git reset版本回退旧commit节点在git log会消失看不见。git reflog记录本地仓库全部操作历史每一次commit、reset、merge、checkout所有HEAD指针移动记录全部保存。✅核心用途找回因为reset --hard误操作丢失掉的commit版本。拿到丢失commit‑id执行git reset --hard commit‑id恢复被回退丢掉的代码。⚠️注意reflog只存在本机本地不会同步远程仓库。8. .gitignore作用哪些文件一般需要忽略作用.gitignore告诉Git哪些文件、文件夹不需要纳入版本控制Git会直接忽略不会追踪。通常需要忽略的文件类型1. 编译产物build/、Debug/、*.o、*.so、可执行程序编译生成的中间文件2. 日志文件*.log程序运行日志3. 本地配置文件*.ini、本地私有配置每个人本地配置不一样不要提交仓库4. IDE编辑器自动生成文件.vscode/、.idea/5. 操作系统生成的垃圾文件.DS_StoreMac6. 大型二进制资源数据库dump、临时备份文件。示例.gitignorebuild/ *.log .vscode/ *.ini .DS_Store补充如果文件已经被Git跟踪此时修改.gitignore不会自动忽略该文件需要先删除缓存。强制提交被忽略文件命令git add -f 文件名。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询