十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Git核心概念与高频命令实战:从工作区到版本库的完整指南

Git核心概念与高频命令实战:从工作区到版本库的完整指南 Git 这个东西我见过太多人栽在同一个坑里第一周觉得它不过就是 add 和 commit 两个命令第二周就开始在分支合并和工作区回滚里摔跤第三周索性直接把项目复制一份当备份再也不碰 Git 了。这套流程我太熟了因为我自己也是从“复制粘贴备份”走过来的。Git 不是帮你存代码的工具它是帮你管理“代码变化过程”的工具。学 Git 真不用背一箩筐命令只要把工作区、暂存区、版本库三个概念吃透再加上一条合理的提交规范日常工作里九成场景都能从容应对。这篇东西适合刚装了 Git 却不知道从哪下手的初学者也适合已经在用但遇到报错只会瞎猜的老哥们我把从下载安装到日常协作、从常用命令到报错排查的完整流程都梳理一遍尽量把每一个“为什么”都讲明白看完照着敲就行。1. 环境准备Git 安装与环境配置1.1 下载安装官网还是国内源路径怎么选Windows 用户最常见的入口是 Git 官网的 downloads 页面进去之后会自动识别系统点击下载 Windows 版本即可。如果官网下载速度不太理想可以找国内的大型软件源或镜像站比如腾讯软件源、阿里云镜像这类正规渠道把安装包下载下来再装。macOS 用户建议直接用 Homebrew 安装brew install git一条命令完事后续升级也方便。Linux 用户就看发行版Debian/Ubuntu 用sudo apt install gitCentOS/RHEL 用sudo yum install git装完都一样用。Windows 安装过程中最容易出问题的是那三个启动选项。第一项 Git Bash Only 只提供命令行模拟环境第二项 Git from the command line and also from 3rd-party software 会把 git.exe 加入系统 PATH第三项 Use Git and optional Unix tools from the Command Prompt 还会把一堆 Unix 工具也放进 PATH。这里我强烈建议选第二项原因很实际你后面大概率要用到 VS Code、IDEA、TortoiseGit 这类第三方软件去调用 Git如果 Git 不在 PATH 里这些工具要么找不到命令要么只能手动填路径非常别扭。第三项看着功能多但有些 Unix 工具会和 Windows 自带命令名字冲突等遇到坑再回头改反而麻烦。提示安装完成后打开一个新的终端窗口不是安装前开的那个执行git --version能输出版本号就说明装好了。如果提示找不到命令多半是 PATH 没生效或者安装时选的选项不对。1.2 装完先做两件事配置用户名和邮箱Git 的每次提交都会记录作者信息这个信息不是从系统里自动读的而是必须由你自己告诉它。打开 Git BashWindows或者终端macOS/Linux执行git config --global user.name 你的名字 git config --global user.email 你的邮箱--global表示全局生效也就是说这台机器上所有仓库都会用这个身份提交。如果某个项目想单独用别的身份可以去掉--global在项目目录里设置这就是局部配置优先级高于全局配置。查看当前配置可以执行git config --global --list这一步千万别嫌麻烦跳过。我见过好多新手第一次 commit 时报错Please tell me who you are然后一脸懵就是因为没配身份信息。还有一种更隐蔽的情况某些环境下没配置Git 会直接拿机器的 hostname 当用户名提交上去等代码推到远端仓库里一看提交人全是乱码那些提交还不好改特别被动。1.3 Git Bash 到底是个啥为什么要会它Windows 用户装了 Git 之后开始菜单里会多出一个 Git Bash。很多新手不知道它和 CMD 的区别其实 Git Bash 就是一个跑在 Windows 上的迷你 Unix 模拟环境里面不仅能执行 git 命令还能用ls、pwd、mkdir、grep这些 Unix 常用命令而且是 Git 官方捆绑发布的路径配置都帮你处理好了。日常用 Windows 开发我建议命令行操作统一走 Git Bash而不是系统自带的 CMD 或 PowerShell。原因是 Git 的文档、网上的教程、同事的分享绝大多数命令都是在 Unix 风格终端下写的路径分隔符、通配符语法都更统一。你要是在 CMD 里纠结过C:\Users\name该写几个反斜杠就知道 Git Bash 里直接写/c/Users/name有多省心了。当然VS Code 内置终端也可以选 Git Bash 作为默认 shell设置里搜terminal.integrated.defaultProfile.windows就能改。1.4 环境变量问题排查命令“找不着”了怎么办安装 Git 后最常见的报错有两种CMD 里提示“git 不是内部或外部命令”PowerShell 里提示“无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。这两个报错本质是一回事系统在 PATH 环境变量里找不到 git.exe。排查路径很简单先找到你的 Git 安装目录默认一般是C:\Program Files\Git\bin然后打开系统环境变量设置在 Path 里加上这个路径重新打开终端再试一次。另一种情况是安装时选了第一项当时没加入 PATH那就先卸载重装或者手动改环境变量。改完千万不要忘了重开终端窗口因为终端在启动时会读取一次环境变量已经开着的窗口不会自动刷新。顺便说一句macOS 如果执行git提示xcode-select: note: install requested之类的内容说明系统在引导你装命令行开发者工具按提示装完就好或者直接用 Homebrew 安装。2. 先把 Git 的底层逻辑搞明白再动手敲命令2.1 工作区、暂存区、版本库三个抽屉的故事很多人学 Git 卡住就是因为不理解add和commit为什么要分成两步。我用生活里的例子解释假设你在写一份报告电脑桌面上放着草稿这个可以理解成工作区。你改完一段感觉差不多能交付了就把这段草稿拿出来放到一个专门的文件夹里这就是暂存区。然后你觉得这版整体稳定了拍个照存档这就是版本库。对应的 Git 操作就清晰了你在工作区改文件改完后用git add把变更放进暂存区最后用git commit把暂存区里所有内容打包成一个版本记录。这么做的好处是你可以分多次 add 不同文件的修改最后一次性提交或者临时只提交一部分内容避免一次提交里夹带无关改动。提交后如果发现写错了还可以用git reset把暂存区倒退回来不用动工作区。2.2 分支不是文件夹是平行时间线新手理解分支最容易犯的错误是把分支想成文件夹的切换。实际上 Git 分支更像一条条平行的时间线main分支上有一个提交记录dev分支上基于同样位置又另起一条发展线两边各自往前走互不影响。你在dev上改了文件main完全感觉不到直到你把dev合并回main两边才重新汇合。这种设计解决了一个很实际的问题多人开发时每个人在自己的分支上干活不需要互相等待也不需要一有改动就去覆盖别人的文件。等任务完成再通过合并把各自的成果整合。理解了这一点后面再看checkout、merge、rebase就不会觉得混乱因为它们都是在这些时间线上做操作。2.3 为什么 Git 比 SVN 流行离线也能“存档”用过 SVN 的老程序员都知道SVN 是集中式版本控制所有提交都得先连上服务器网络不好或者出差离线版本历史就停摆了。Git 是分布式的每个本地仓库都保存着完整的历史记录你可以随时随地提交、切换分支、查看日志等有网络了再一次推送到远程仓库。这个差异在现在这种远程办公、多设备联动的场景下尤其重要。也正因为本地仓库就是完整的版本库所以 Git 的很多操作速度极快不依赖网络。git log、git diff、git reset这些命令全部在本地完成毫秒级响应。这背后是 Git 以快照snapshot为核心的设计每次提交都会把当前的文件状态做成一个引用关联而不是像某些工具那样只保存差异。2.4 提交规范不是形式主义是给未来的自己减负很多新手提交时随手写一句“update”过两周回来看日志根本不知道那次改了什么。提交规范不是公司强制要求才需要遵守的东西而是对项目历史的注释。我推荐学习 Angular 团队的提交信息规范格式是type(scope): subjecttype 表示提交类型常用的有feat新功能、fix修复 bug、docs文档、style代码格式调整不影响逻辑、refactor重构、perf性能优化、test测试相关、chore构建或辅助工具变动。scope 是可选的模块名称subject 用一句话描述这次改动。例如feat(user): 新增用户头像上传功能 fix(cart): 修复购物车数量为 0 时仍可结算的问题这样做的好处是git log --oneline看一眼就能了解项目演进脉络可以用git log --oneline --grepfeat筛选特定类型提交CI/CD 流程里甚至可以自动根据提交信息生成 changelog。真正做过长期项目维护的人都会感谢当初认真写提交信息的自己。3. 日常高频命令实战从建仓库到改错回滚3.1 新建仓库与克隆仓库init 和 clone 的适用场景本地已有项目想纳入 Git 管理在项目根目录执行git init这个命令会在当前目录生成一个隐藏的.git文件夹里面就是完整的版本库。注意git init之后项目还处于未跟踪状态需要git add .把所有文件加入暂存区再git commit -m initial commit创建第一个提交。如果想从远程仓库拿一份代码用git clonegit clone 远程仓库地址这条命令会自动创建仓库目录、初始化本地仓库、建立远程关联并把默认分支的代码拉下来一步到位。克隆完成后进入目录先执行git status看一眼当前状态再开始改代码。很多新手 clone 完直接改文件改完才发现连目录都没进去过然后报错fatal: not a git repository一脸疑惑。3.2 提交流程add、commit、status、log 的组合拳日常开发最常用的提交流程是四条命令循环往复git status git add . git commit -m fix(user): 修复用户名长度为 0 时的异常 git log --oneline -5git status的作用是查看当前变更情况它会告诉你哪些文件被修改了、哪些新增了、哪些还没被跟踪。git add .会把所有变更加入暂存区如果只想提交指定文件就写具体文件路径。git commit -m后面跟提交信息提交后最好用git log确认一下提交是否成功。这里有个细节git add .会把新增文件、删除文件、修改文件一次性全部暂存适合改动集中的场景。如果这两个小时改了两块完全不相关的需求我建议分开提交用git add 具体文件分别添加再分别 commit。提交信息一定要和实际改动对应否则日志看多了你会觉得自己在玩密室逃脱。3.3 分支操作创建、切换、合并、删除创建并切换新分支git checkout -b feature/login这是最常用的写法-b表示创建新分支并立即切换过去。Git 2.23 之后推荐用更语义化的git switch -c feature/login两者效果一样看个人习惯。查看当前分支git branch带*号的就是当前所在分支。切换到已有分支git switch main合并分支是在目标分支上执行比如要把feature/login合并到main先切到 main再执行git merge feature/logingit switch main git merge feature/login合并后如果历史不需要保留就直接合并完成删除已经合并的分支git branch -d feature/login注意-d只能删除已合并分支如果分支还有未合并的改动Git 会提示要用-D强制删除。这是保护机制防止你误删还在用的工作成果。3.4 冲突解决合并时最容易“劝退”新手的环节合并分支时出现冲突是最常见的劝退场景。冲突的表现是 Git 提示CONFLICT (content): Merge conflict in xxx.txt然后相关文件里出现这样一段标记 HEAD 这是当前分支的改动 这是被合并分支的改动 feature/login HEAD到之间是当前分支的内容到之间是合并进来的分支内容。你需要手动决定保留哪边、删除哪边或者两边都保留并做调整然后保存文件执行git add和git commit。对付冲突我的建议是不要慌冲突文件一般不会太多逐个打开看就好。能用编辑器可视化界面解决的就用界面VS Code 会提供三色高亮点一下就能选择保留哪边不熟悉的就在命令行里手动编辑。关键是提交前务必仔细阅读冲突标记不要整个文件直接覆盖否则很可能把别人有用的改动弄丢。3.5 后悔药系列restore、reset、revert、stash 各自管什么说到撤回一定把四个命令分清楚它们的职责完全不同git restore file丢弃工作区里某个文件的未提交修改回到最近一次提交的状态。文件如果还没 add 过这条命令会直接覆盖你的改动操作前确认一下内容。git restore --staged file把已经 add 进暂存区但还没 commit 的文件退回到工作区解决“不小心 add 多了”的问题。git reset --soft HEAD~1撤销最近一次 commit但保留修改内容在工作区适合提交信息写错了或者漏了几个文件的情况。git reset --hard HEAD~1彻底回退到上一个提交同时丢弃工作区和暂存区所有未保存的修改。这条命令非常危险执行前一定要想清楚。git revert commit生成一个新的反向提交用来撤销已经推到远程的记录不会改写历史适合团队协作环境。git stash把当前未提交的改动暂时存到一边让工作区恢复干净之后用git stash pop再取回来。实际工作里最常用的场景是临时要切分支改一个紧急 bug但手头代码改了一半不想提交又不想丢。这时候git stash就是救星。stash 可以理解成“贴身口袋”把没做完的活放进去干完急事再掏出来继续。3.6 提交后发现漏了文件或写错信息怎么补救刚刚 commit 完就发现少加了文件或者提交信息打错字这是很常见的事也别慌。如果提交还没推到远程用git commit --amend可以修改最近一次提交的信息它的作用是把暂存区的内容合并进上一次提交。操作步骤git add 漏掉的文件 git commit --amend -m feat(user): 修正后的提交信息执行完之后最近的提交会被替换成一条新提交内容和信息都更新了。这个命令只适合在本地提交、还没 push 的情况下用因为一旦涉及远程仓库改写历史就会造成多人协作的麻烦。想改已经推到远程的提交就要小心了一般不建议git push --force而是用git revert生成一条反向提交来抵消错误变更这样团队里其他人的本地历史不会被破坏。4. 远程协作全流程从免密配置到推拉代码4.1 两种远程认证方式HTTPS 和 SSH 怎么选Git 远程仓库的两种常规访问协议是 HTTPS 和 SSH。HTTPS 最简单clone 的时候直接填仓库地址每次 push 需要输入账号密码现在很多平台支持 Personal Access Token 代替密码。SSH 则需要提前生成密钥对把公钥配置到远程平台之后所有操作免密安全性也更高。我个人的习惯是个人机器上优先用 SSH配置一次能免密好几年临时服务器或者不常登录的环境用 HTTPS 加 token 就好省去生成密钥的麻烦。如果公司 GitLab 或 GitHub 对 SSH 支持得很好建议直接把 SSH 当作默认方案。4.2 SSH 密钥生成与配置一步到位以后不用输密码生成 SSH 密钥ssh-keygen -t ed25519 -C 你的邮箱一路回车就能生成密钥对默认保存在~/.ssh/目录。新版 OpenSSH 更推荐ed25519算法如果公司平台版本较老不支持就用rsassh-keygen -t rsa -b 4096 -C 你的邮箱生成后查看公钥cat ~/.ssh/id_ed25519.pub把输出的内容复制去远程平台GitHub、GitLab、Gitee的设置里找到 SSH Keys粘贴保存。然后测试连接ssh -T gitgithub.com返回Hi username! Youve successfully authenticated就说明通了。从此再也不用每次 push 都输密码体验非常顺滑。注意一个细节公钥文件是.pub结尾的那个能公开分享私钥文件没有后缀绝对不能泄露这相当于你的身份证。4.3 push 和 pull推拉代码的正确姿势把本地提交推到远程git push origin mainorigin是远程仓库的默认名称main是你要推送的分支名。第一次推送新分支时要用-u参数建立关联之后就不用再写远程和分支名了git push -u origin feature/login从远程拉取代码有两种方式git pull会自动拉取最新代码并合并到当前分支git fetch只拉取远程的提交记录不自动合并你可以先看看差异再决定怎么处理。团队协作中我更推荐这个流程先git fetch查看远端变化再git pull --rebase把本地提交变基到最新代码之上最后git push。这样做能减少不必要的合并提交历史更干净。注意git pull如果遇到冲突本质还是合并冲突按 3.4 的方法解决即可。而git pull --rebase遇到冲突时解决完不要直接 commit而是git add后执行git rebase --continue。4.4 小乌龟 Git不习惯命令行的图形化选择TortoiseGit 在国内有个亲切的名字叫“小乌龟”是老牌 Git 图形化客户端。安装时会要求配置 Git 的路径指向 git.exe 就行。用它最大的优势是右键菜单集成在资源管理器里选中文件右键就能看到 Git 提交、拉取、推送、日志等操作非常直观。我见过不少同事主力用 TortoiseGit配合 TortoiseGitMerge 解决冲突视觉化程度很高。小乌龟的核心操作改完文件后右键选择“提交”会弹出界面让你勾选要提交的文件填提交信息然后提交。拉取和推送在菜单栏里就有分布很清晰。对于团队里不想背命令的老同事这套方案很友好。不过我自己的经验是命令行的思维方式更接近 Git 内核遇到问题时排查效率更高图形界面适合浏览和对比遇到分支操作还是建议会至少一种命令行形态。图形工具可以在新手期帮你渡过难关但最终还是要敢于回到命令行。4.5 VS Code 集成编辑器里直接搞定 GitVS Code 内置了完整的 Git 支持不需要额外安装插件就能完成绝大多数操作。左侧菜单栏的“源代码管理”面板会列出当前仓库的变更情况文件旁有 M已修改、U未跟踪、D已删除标记。在面板里可以直接输入提交信息、点击提交按钮也可以看到待暂存的变更列表并逐条 add比纯命令行直观很多。如果想进一步增强我推荐装 GitLens 和 Git History 两个插件。GitLens 能在代码行上直接显示这行是谁、什么时候、为什么提交的排查历史问题时非常管用Git History 用于以图形化方式查看分支提交网络理解分叉合并比git log --graph直观。不过要提醒一下VS Code 的“源代码管理”面板对新手友好的前提是你已经理解了暂存区的概念否则点来点去还是容易蒙。4.6 提交到远程仓库的标准流程整理一个每天都用到的完整流程git switch main git pull git switch -c feature/xxx # 开发改动 git add . git commit -m fix(xxx): 修改了 xxx git push -u origin feature/xxx提交前先切回主分支拉取最新代码再基于最新提交创建新分支开发完成后推送。这样能最大程度减少合并冲突。后续如果有新的远程提交在功能分支上执行git fetch和git rebase origin/main把主分支的更新合入自己的分支保持分支与主干同步。5. 报错速查与疑难杂症实录5.1 高频报错排查从“找不到命令”到“not a git repository”整理一个高频报错速查表遇到问题直接对号入座报错信息原因解决方案git 不是内部或外部命令Git 未加入 PATH确认安装选项或手动添加环境变量无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称PowerShell 找不到 git.exe同上或重启终端fatal: not a git repository (or any of the parent directories): .git当前目录不是 Git 仓库git init初始化或 cd 到仓库目录Please tell me who you are未配置用户名或邮箱配置git config --global user.name/emailfatal: refusing to merge unrelated histories两个仓库没有共同历史确认无误后使用--allow-unrelated-historieserror: failed to push some refs to ...本地落后于远程先git pull或git pull --rebase再 pushThe requested URL returned error: 403权限不足或认证失败检查 token、账号权限或 SSH 配置5.2 中文文件名显示成八进制编码core.quotepath有些朋友在git status或者git log时看到中文文件名变成了\346\265\213\350\257\225.txt这类八进制转义看着像乱码。这是 Git 默认行为为了避免某些环境下文件名编码不一致造成问题它会将非 ASCII 字符转义输出。解决办法是执行一条配置git config --global core.quotepath false设置之后中文文件名和中文提交信息都能正常显示。如果你在使用 IDE 或者 VS Code 时看到启动 Git 的命令里带着-c core.quotepathfalse这其实就是工具帮你加上了这个参数目的就是避免中文显示乱码。5.3 IDE 里登录报错token、GitLab 版本不匹配很多人在 VS Code、JetBrains 系列 IDE 里通过插件登录 GitLab 时遇到Login failed. Check API token or GitLab version. Log in via Git if the version is ...这类报错。这个问题的常见原因是插件用的 API 接口版本和你 GitLab 服务端版本不匹配或者 token 权限不足、已过期。解决思路按顺序来先去远程平台重新生成一个有足够权限的 Personal Access Token勾选 api、read_repository、write_repository 等范围在 IDE 里重新登录如果还不行检查 GitLab 版本和插件的兼容性给插件升级更稳妥的方案是不依赖 IDE 插件登录直接在命令行里配置好 Git 凭证让 IDE 复用系统 Git。别在插件设置里反复试密码浪费时间基本解决不了。5.4 .git 目录泄露一个值得重视的安全习惯用 Git 开发完项目部署到服务器时有个安全细节容易被忽略.git目录会记录完整的版本历史和未被提交的敏感信息如果部署时把.git目录也暴露到网站静态目录里访问者可能通过特定路径访问到 Git 内部对象从而获取项目源码甚至数据库配置。这不是让你去“利用”什么而是提醒你做好防护部署生产环境时确保 Web 根目录不包含.git如果用的是构建工具打包把.git排除出发布清单在服务器上配置禁止以点号开头的目录被直接访问。养成这些习惯比事后补救强得多。5.5 被误删的分支和提交怎么救reflog 是最后的后悔药如果某次操作不小心把分支删了或者reset --hard之后发现回退错了先别崩溃Git 还有一层保险叫 reflog。它记录的是仓库 HEAD 指针的每一次移动历史包括 reset、checkout、commit 等所有操作。执行git reflog会看到类似这样的输出abc1234 HEAD{2}: commit: fix(user): 修复登录问题 def5678 HEAD{3}: reset: moving to HEAD~1找到你要回到的那个提交的哈希比如abc1234然后git reset --hard abc1234就能恢复到那个提交的状态。reflog 是本地仓库自带的操作日志只要你的操作是在本地完成的一般都能找到痕迹。这也是 Git 分布式设计的好处——历史记录全在本地误操作往往有挽救的余地。不过它也有保存期限默认 90 天关键操作还是养成定期 push 的好习惯别把所有鸡蛋放一个篮子里。6. 一些长期使用下来的个人心得用了这么些年 Git最深的体会就是它能解决的多数问题本质都是“版本状态管理”的问题。你不需要记住所有命令只需要知道某个功能有没有对应命令需要用的时候查一下即可。真正值得花时间理解的是工作区、暂存区、版本库三层关系以及分支和合并的工作原理。把这两个概念打通命令自然会串起来。刚开始练的时候建议在本地建一个测试仓库随便放几个文本文件把 init、add、commit、branch、merge、reset、revert、stash 全部过一遍故意制造一些场景去实验改错文件、误删分支、提交信息写错……每个坑都踩一次记住了以后遇到同类的报错就不会慌。还有一个小技巧git 命令的参数非常多记不住没关系git help 命令能在本地打开完整文档或者用git 命令 -h快速查看常用参数。Git 最大的门槛不是命令数量而是思维方式的转变。习惯了“所有副本手动备份”的人一开始很难相信一个版本管理工具能把代码历史保护得这么好。等你真正上手再回头看那些复制粘贴出来的project_final_v2_backup文件夹会觉得自己当初太原始了。希望这篇东西能帮你少走一些弯路早点从 Git 的“能用”状态进化到“放心用”的状态。
返回列表