ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Git从入门到实践:快照思维、分支合并与疑难排查全攻略

2026/9/30 11:36:11 拓冰建站 浏览量
Git从入门到实践:快照思维、分支合并与疑难排查全攻略 简介这是一份以Git为唯一主题的PDF入门教程定位零基础与初级开发者。包体信息显示资源共1个文件类型为PDF大小3.05MB属于轻量型阅读材料。已有10872人学习下载适用面较广。内容从Git诞生背景讲起说明其为分布式版本控制系统的两大特点然后覆盖Windows环境安装配置、git init创建版本库以及git add与git commit的版本创建流程并重点讲解git reset、HEAD^与git reflog等回退与恢复操作。还涉及工作区、暂存区、master分支与HEAD指针概念配合code.txt与code2.txt的示例演示方便对照实践。作为入门资料表述通俗细致章节安排适合初学者按顺序阅读也可作为日常查阅的速查手册。1. git 是什么快照思维不建立学多少命令都会翻车我见过不少同事被 git 劝退不是因为命令多而是开头接受的心智模型就是错的。市面上的 git使用教程大多在教你背命令背完照样翻车根子在于脑子里没有那个“存档模型”。git 不是记“改了哪一行”的差异文件而是每次 commit 都把整个文件夹拍一遍快照生成一个还原点。这和 SVN 那种增量版本思路完全两回事也是 git 和 svn 区别中最核心的一条git 是分布式的每个本地仓库都是全量存档不是中心服务器的镜像。带着这个理解学三小时能摸到门槛不带这个理解三年还在 reset 和 checkout 之间来回试错。这个教程不追概念默认你是拿来干活的不是研究版本控制理论的。从安装配置、日常提交、分支合并到远程协作最后收在报错排查和几个进阶技巧上适合完全没碰过 git 的初学者也适合会 clone 但遇到 merge 冲突和 amend 就心里发虚的熟手。2. git安装及配置教程Windows、macOS、Ubuntu 三条路与首次配置2.1 安装前的选型Git Bash、小乌龟和 IDE 内置终端各管什么“git bash 安装”是被搜得最多的词之一但很多人没搞清 Git Bash 到底是个什么东西。它不是一个独立的 git 版本而是 Git for Windows 自带的一个模拟 Linux 终端的壳里面预装了 bash、ssh、curl 一套常用工具。我建议新手一开始就在 Git Bash 里敲命令不要在 CMD 里折腾。原因很实际Windows CMD 对单引号、路径分隔符、UTF-8 中文的处理和 Linux 差异太大同样的命令在 CMD 里报错换到 Git Bash 里就正常这会省掉大量玄学排错时间。使用方式适合人群我的建议Git Bash 命令行想真正搞懂 git 工作流的人首选配合本文所有命令直接跑Windows CMD / PowerShell习惯纯 Windows 环境能用但注意转义与编码问题TortoiseGit小乌龟只想右键完成提交拉取的人看提交历史方便冲突解决仍要懂命令VS Code / IDEA 内置终端IDE 重度用户日常开发主力底层调用的还是 Git BashmacOS 和 Ubuntu 用户不必纠结系统里装好 git 后终端本身就是类 Linux 环境和 Windows 上 Git Bash 的行为一致。真正需要想清楚的是你的日常操作到底发生在哪个壳里。我一般建议在 IDE 终端里执行 git 命令弹错能直接看到输出写代码和提交切换成本最低。2.2 Windows 最小安装镜像下载、PATH 选项和安装后自检Windows 下最常规的安装方式是从官网下载 Git for Windows 的 exe一路 Next。但国内网络环境里官网下载经常慢得让人怀疑人生常见做法是走国内镜像站像清华、阿里、华为这些镜像站在 git 仓库目录下都有对应 Windows 版本的安装包选你系统位数对应的那个 exe 即可。注意镜像站的“git”目录里会有大量子目录别下成 Linux 源码包看到.exe后缀再动手。安装过程中的选项页有三处直接决定你后面能不能在 IDE 终端里用 gitAdjusting your PATH 这步务必选第二项 Git from the command line and also from 3rd-party software。如果选了第一项 Git Bash only装完在 PowerShell 或 VS Code 终端里敲 git 会直接提示“无法将 git 项识别为 cmdlet”这个坑后面还会在排查章单独讲。换行符处理那步一般选默认的 Checkout Windows-style, commit Unix-style line endings。要是团队里有跨平台脚本文件后续真出问题再一起改core.autocrlf新手别在这一步自己吓自己。终端模拟器选 Use MinTTY粘贴长命令时比 Windows 默认控制台顺手得多。装完后打开 Git Bash 做一次自检git --version # 输出形如 git version 2.23.0.windows.1 即安装成功 where.exe git # 查看 git 实际所在目录确认 PATH 是否生效git --version是最直接的安装验证where.exe git在 Windows 命令行里能看到 git 的全路径如果这里找不到但你明明装过那就是 PATH 没配上。很多人的 git 下载安装教程走到这里就停了其实还差最后一步配置。2.3 首次全局配置用户名、邮箱、默认分支和编辑器安装完成不等于能正常工作。git 每次提交前必须知道“你是谁”否则 commit 时会弹出一个让你填写身份信息的错误提示。这个配置是一次性的覆盖全局可以在任意终端执行git config --global user.name 你的名字 git config --global user.email youexample.com git config --global init.defaultBranch main git config --global core.editor code --wait git config --list --show-origin--global表示写入用户级配置对应~/.gitconfig文件user.name和user.email会进到每次提交的作者信息里建议和你的代码托管平台账号保持一致否则提交记录里显示的是另一张脸。init.defaultBranch main让新建仓库默认分支叫 main 而不是 master这是近几年的普遍做法避免新老理解偏差。core.editor配成code --wait表示用 VS Code 当提交信息编辑器写完关掉窗口git 才会继续执行不配的话有些环境会弹出 Vim新手进去不知道怎么退出这一条绝对值得写进配置。git config --list --show-origin会列出当前环境下所有生效的配置项还带来源文件路径。以后遇到“我这配置怎么没生效”的问题先跑这条命令看是不是某个仓库里的 local 配置把全局配置覆盖了。配置分 system、global、local 三个层级仓库内.git/config的优先级最高查问题按 local 再看 global顺序别反。3. 把 git 当存档用add、commit、分支合并的命令工作流3.1 工作区、暂存区、本地仓库add 为什么省不掉git 的核心模型是三个区域工作区是你电脑里能直接看到的文件目录暂存区是 git 内部的一块中间区域标记“哪些改动要进下一次提交”本地仓库是已经 commit 过的所有历史快照。理解这个模型的捷径是把它类比成拍照工作区是你摆好的场景add 是按下快门commit 是把这张照片装进相册。所以 add 和 commit 一定是两步前者决定照片里有什么后者决定相册里多哪一张。很多新手觉得 add 是多余的直接 commit 不行吗。不行因为这个设计保证了你能“只提交想提交的改动”。比如一次改了三份文件其中一份是临时调试代码只想提交另外两份用git add精确挑选就能实现。日常快速场景git add -A一把梭也没问题但你要知道add 和 commit 的分离并不是历史包袱而是一个刻意设计的精细控制机制。3.2 最小可复用工作流从 status 到 commit 的六条命令我见过最快的手忙脚乱是人到了提交这一步不知道该提交什么又怕把不该提的提上去。按这个顺序走能治这个焦虑git status # 查看工作区状态看到哪些文件被改、哪些还没被跟踪 git diff # 查看还没 add 的具体改动内容 git add -A # 把新增、修改、删除全部加入暂存区 git status # 第二次查看确认暂存区里都是你想要的 git commit -m feat: 完成登录接口 # 生成本地快照 git log --oneline -5 # 看最近 5 条提交记录确认这一步没白做git status是整个工作流里出现频率最高的命令它告诉你三个区域当前各是什么状态git diff只看未暂存内容暂存过的改动要看git diff --cached。git add -A里的-A包含“新增、修改、删除”三种变化等于全部纳入如果你想只加某个目录写git add src/不写-A就别指望删掉的目录被跟踪。git commit -m的-m直接带提交信息不加会进入编辑器git log --oneline把每次提交压成一行显示-5限定条数。整套下来一分钟内能完成闭着眼也不会漏。3.3 分支合并现场switch、merge 和冲突解决分支是 git 最值钱的功能也是“git分支合并”这类搜索背后真正的痛点。建分支、切分支现在推荐的命令是git switch它比老式checkout -b语义更清楚switch只管切分支checkout还兼任恢复文件职责混在一起容易让新手记混。典型流程如下git switch -c feature/login # 基于当前分支新建并切换到 feature/login # 在这个分支上开发提交若干次 git switch main # 切回主分支 git pull # 先把远程 main 最新内容拉到本地 git merge feature/login # 把特性分支合入 main git branch -d feature/login # 合并完成后删除特性分支-c是 create 的缩写表示新建分支并切换branch -d会先检查分支是否已被合并如果没合并会拒绝删除防止你误删还在使用的分支。合并时 git 默认做 fast-forward也就是 main 没有新提交时直接把 main 指针快速移动到 feature 分支上历史是一条直线如果 main 也动过git 会生成一个额外的 merge commit 把两条线接起来。这两种结果都不是异常只是合并方式不同。冲突才是新手最怕的。当两个分支改了同一处代码时git 没法替你决定保留哪边会在冲突文件里嵌入两组标记 HEAD 账号: 123 账号: 456 feature/login HEAD到之间是当前分支的内容到 feature/login之间是对方分支的内容。解决方式很笨但很可靠打开文件逐处决定留哪边或改写成新内容然后删掉所有、、标记行保存后执行git add再git commit合并就完成了。如果冲突处理到一半想放弃git merge --abort能把分支恢复到合并前的状态等于给你一颗后悔药。4. push/pull 与 SSH 免密配置从 Gitee 建库到 IDEA / VS Code 拉取项目的完整链路4.1 先把本地仓库和远程仓库接上头国内团队用 Gitee 的场景很多Gitee 上建一个空仓库后你有两种方式让本地代码和它建立关系一种是直接git clone把远程仓库拉下来另一种是在本地现有目录里手动加 remote。两种各有用途但手动加 remote 更值得讲清因为很多已有的项目不是靠 clone 开始的。git clone gitgitee.com:user/repo.git # 效果等价于初始化本地仓库、加 remote、拉取远程内容 cd repo git remote add origin gitgitee.com:user/repo.git git branch -M main git push -u origin maingit clone之后进入仓库目录remote 已经自动配好名字默认叫origin。git remote add origin是手动建立同名关联origin只是一个约定俗成的名字不是 git 的强制命名。branch -M main里的-M表示把当前分支重命名并强制覆盖适合你本地还叫 master、远程要求 main 的场合。push -u origin main里最关键的是-u全称--set-upstream它把本地 main 和远程 main 的追踪关系记录到配置里。设置之后以后直接敲git push和git pull都不必再带 remote 名和分支名这是“傻瓜化”体验里非常重要的一环。4.2 SSH 密钥免密配置顺便清掉缓存的旧密码HTTPS 方式 clone 仓库后每次 push 都要输账号密码就算系统帮你记住了一旦平台密码改了或你换了电脑一堆认证失败弹窗能让节奏彻底断掉。我一般建议直接上 SSH 免密一次性配置长期省心。先生成密钥对再把公钥贴到 Gitee 后台ssh-keygen -t ed25519 -C youexample.com -f ~/.ssh/id_ed25519 eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519 cat ~/.ssh/id_ed25519.pub-t ed25519指定密钥算法ed25519 是目前推荐强度高且速度快-C是注释通常写你的邮箱方便在后台辨别是哪台机器的密钥-f指定保存路径这里用了默认路径回车一路到底即可。生成完后ssh-agent负责在内存里管密钥ssh-add把私钥加进去最后cat显示公钥内容复制整段贴到 Gitee 的 SSH 公钥设置页面。完成后用ssh -T gitgitee.com验证首次会提示确认主机指纹输入 yes再看到欢迎文字就通了。还有一类高频问题是你以前用过 HTTPS 方式平台改了密码后 push 一直报认证失败。这是 Windows 凭据管理器缓存了旧密码导致的。先看当前用的什么凭据助手再用 git 自带的指令把对应凭证清掉git config --global credential.helper # 输出 manager / store 之类的值 printf protocolhttps\nhostgitee.com\n\n | git credential rejectcredential.helper决定了账号密码存在哪git credential reject是用来删除已存储凭据的底层接口printf传给它协议和主机名注意 host 要和实际仓库域名完全一致。清除后下次 push 会重新弹登录框输入新密码即可。4.3 从 IDEA 和 VS Code 创建新项目并拉取 git 仓库命令行能解决所有问题但很多场景下鼠标更快。IDEA 打开后的欢迎页或 File 菜单里有 Get from VCS 选项把 Gitee 仓库的 SSH 地址粘贴进去选好目录就能拉取。VS Code 更简单左侧栏的源代码管理图标点 Clone Repository输入 URL在弹出的输入框选择本地存放路径即可。两个 IDE 拉完后会自动识别远程仓库分支信息也会同步显示。这里有个前提容易被忽略IDE 拉取 SSH 地址时如果本机没配好 SSH 密钥会卡在登录弹窗或直接报认证失败。所以上述 4.2 的密钥配置要先完成IDE 只是替你调用了 git 底层命令不会绕过本机认证。VS Code 里首次提交还需要在弹窗里填 user.name 和 user.email对应git config的内容IDEA 则是在 Settings 的 Git 配置项里读取全局配置。两个 IDE 的推送按钮背后都在执行我前面讲过的 add、commit、push只是界面把命令隐藏了。如果你的 IDE 报“无法自动推送”回到终端跑一遍git remote -v和git push -u origin main问题会立刻暴露。5. git疑难杂症排查9 类高频报错的现象、原因与解决5.1 环境与初始化报错仓库没初始化、PATH 没配对报错一任何目录下敲git add或git commit都会弹出下面这句fatal: not a git repository (or any of the parent directories): .git现象是命令执行后直接退出完全不干活。原因不外乎两种当前目录根本没执行过git init或者你的命令用错了目录。git 判断“我是不是在一个仓库里”的唯一标准是当前目录或上级目录里是否存在.git文件夹。解决方法是先执行git init初始化仓库如果你确定仓库存在但还是在报错用git rev-parse --show-toplevel看仓库的根目录在哪大概率你站在了子目录之外。还有一种少见情况是.git目录损坏磁盘断电后残留了半截文件处理方式是先备份代码文件再删掉.git重新git init历史记录找不回但代码能保住。报错二在 PowerShell 或 VS Code 终端里敲 git提示“无法将 git 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。这个报错几乎都出在安装环节路径没有配进系统的 PATH 环境变量。解决方式分两步。第一步重启终端因为环境变量在会话启动时读入装完 git 后不重启终端就会出现这个假报错第二步还不行就重跑安装程序在修改 PATH 那一步选 “Git from the command line”。如果不想重装手动把C:\Program Files\Git\cmd加进系统 PATH 也有效注意别加错成usr\bin那里的命令和 Windows 终端不完全兼容。5.2 远程与认证报错SSH 连不上、密码缓存作祟报错三push 或 clone 时提示ssh: connect to host gitee.com port 22: Connection refused或者干脆ssh认证失败。先分辨是网络问题还是密钥问题。执行ssh -T gitgitee.com如果卡住或端口不通多半是公司网络封了 22 端口如果返回欢迎信息但 git push 仍要密码说明你用的仓库地址是 HTTPS 而不是 SSH。网络受限时把 remote 地址从gitgitee.com:user/repo.git改成https://gitee.com/user/repo.git是最快的绕行方案密钥问题则要检查ssh-add -l是否存在私钥。报错四HTTPS 方式提交时提示Authentication failed。这个原因我前面讲过是凭据管理器里的旧密码没更新。除了用git credential reject清凭据还有一个更直接的排查方向git config --global credential.helper如果输出manager去 Windows 凭据管理器里找到 gitee 相关的条目手动删掉。macOS 则是在钥匙串访问里搜 gitee 删除记录。说句血泪经验很多人换了平台密码之后从来不记着去清本地凭据这个坑我一年内踩了不下三次。报错五clone 大仓库时网络超时或者断在半路。常见做法是用浅克隆只拉最近 N 次提交的历史git clone --depth 1 gitgitee.com:user/repo.git--depth 1表示只拉最新一次提交对应的文件历史记录全部不要速度能提升一个量级。等到确实需要历史时再用git fetch --unshallow补全但那时往往项目已经在本地正常运行了。网络层面如果配过国内镜像或代理也要先确认这些配置没有干扰 git 服务端协议。5.3 提交与合并现场amend 用不对、merge 冲突堆满、reset 删错报错六commit 提交完发现漏了个文件或者提交信息有个错别字不想留着一条黑历史。这就是git commit --amend的主场git add 漏掉的文件.txt git commit --amend -m 修正后的完整提交信息--amend的意思不是“追加提交”而是把上一次提交替换成新的提交。所以它既能改提交信息也能把临时补的文件吸收进上一次提交历史记录看起来始终只有一条完整提交。注意一个大前提这条提交还没推送到远程或者推送后只有你一个人在用这个分支才能这么干。已经推到团队共用的分支再 amend就需要强制推送别人的本地历史会被打断这是协作中的大忌。报错七git merge直接失败输出Automatic merge failed; fix conflicts and then commit the result。很多人看到失败两个字就慌。我在 3.3 里讲过冲突的产生原理这里补两个最高频的现场应对命令git diff --name-only --diff-filterU # 只看哪些文件存在冲突 git merge --abort # 想放弃就回到合并前状态--diff-filterU里的 U 代表 unmerged也就是冲突文件列出清单后逐个打开处理。处理到一半否定自己了merge --abort是唯一不需要任何复盘就能恢复原状的操作放心用。报错八git reset --hard执行后发现想保留的提交没了。这是被问爆的“误删后悔药”场景。git 给你的后悔药叫 refloggit reflog git reset --hard 你想要的那个版本号git reflog记录的是本地仓库每次 HEAD 移动的历史包括 reset、merge、checkout 这些操作导致的变更。你 reset 之前的提交 ID 会完整留在 reflog 里哪怕它已经不指向任何分支。查到目标提交号后git reset --hard就能回到那个状态。这个命令不会记录没有被 add 过的文件内容所以珍贵手误前尽量先 commit 或至少 add 过否则谁也救不了你。6. 把 git 练成肌肉记忆自检脚本、worktree 与 reflog 的日常用法6.1 每天开工前跑一遍的 git 环境自检我习惯把“能不能顺利开始干活”变成一个固定动作。每天进办公室先跑这几行命令输出全部正常才开始写代码git --version git config --global --get user.name git config --global --get user.email git status -sbgit status -sb里的-s是简短模式输出更紧凑-b会显示当前分支和与远程追踪分支的关系。如果### main...origin/main后面出现[ahead 3]说明本地还有 3 个提交没推先推完再动手避免一天结束带着没同步的分支回家。这套自检用不了十秒但能提前暴露密钥过期、账号丢失、分支落后这些潜在问题。等哪天你不再需要想“我这一步该敲什么”git 就算真正练进肌肉记忆了。6.2 一个同时干两件事的效率技巧git worktree开发到一半线上突然来了一个紧急 bug要你在另一个分支上发修复包常见操作是先 stash 再切分支回头再 stash pop来回折腾还容易冲突。git worktree解决的就是这个窘境同一个仓库可以同时在磁盘上开两个目录各占一个分支互不干扰git worktree add ../hotfix-0715 hotfix git worktree list第一条命令在仓库的上级目录创建一个hotfix-0715文件夹并让它检出 hotfix 分支原来的开发目录继续留在旧分支上写你的东西。git worktree list能查看当前仓库一共挂了多少个工作树用完了执行git worktree remove ../hotfix-0715清掉。唯一要注意的是每个分支只能被一个 worktree 检出同一个分支不能同时开两个工作树这是 git 的硬性隔离规则。6.3 给新手的几个收尾习惯最后讲一句实在话git 的学习没有终点但工作流有最优解。我现在每天必做的三件事是下班前git status确认没有遗漏文件提交前跑git diff而不是无脑 add遇到复杂改动时先建分支绝不直接在 main 上提交。这些年带项目见过的绝大多数问题翻来覆去就是本章和上一章里列的这些场景——环境没配好、密码缓存了、合并慌了、reset 手快了。把每一个报错当成一次补课报错信息不是黑匣子它通常直接告诉了你原因。希望这份教程能帮到你从只会一句git clone变成敢改、敢回滚、敢跟别人共用一个仓库的人我踩过的这些坑你不必再踩一遍。本文还有配套的精品资源点击获取