Git实战教程:从快照原理到分支合并与冲突解决 身边总有同事把Git用得行云流水分支切来切去、历史改得干干净净而另一拨人还在被git pull冲突吓得不敢动。2026年了AI辅助写代码早就稀松平常可版本管理这个基本功依然是每个开发者的硬门槛。我见过太多项目死法不是技术选型错了而是几个人在一个仓库里互相覆盖代码最后谁也说不清线上跑的到底是哪一版。这篇教程不打算事无巨细地讲完所有Git命令那没意义你大概率也记不住。我会按自己带新人时最常用的路径来组织先搭好环境接着建立正确的心智模型然后跑通本地提交、远程协作、分支合并这几条最核心的循环最后给你一份“后悔药”手册。目标是两三个小时之内你能把最常用的Git操作练成肌肉记忆直接扔进真实项目里用。后面遇到不熟悉的命令查文档也来得及——关键是你得先知道Git世界里“什么是什么”。熟悉Git的人都知道它最难的不是命令多而是概念和直觉不太一样。所以这篇里我会刻意把“为什么”讲透只有理解动作背后的机制你才不会每次换个场景就懵。1. 上手前的准备安装与首次配置1.1 各平台安装路径Git官方维护了各平台的安装包2026年的主流系统装起来都非常简单。Windows直接到官网下载Windows安装包一路Next即可。装完之后你会得到一个Git Bash强烈建议日常操作都用它而不是系统自带的cmd或PowerShell。Git Bash模拟了Linux终端环境很多命令如grep、find用起来更顺手路径处理也符合Git的习惯。macOS如果你装了Homebrew一条命令brew install git搞定。没装的话从官网下载macOS安装包也行。我建议用Homebrew升级方便后面装其他开发工具也用得上。LinuxDebian/Ubuntu系sudo apt update sudo apt install git -y即可。其他发行版对应自己的包管理器比如Fedora用dnf install git。安装完成后在终端敲一下git --version能输出版本号就说明装好了。我目前用的是2.4x系列的版本2026年Git的新特性主要集中在大仓库性能优化和安全加固上日常命令操作和十年前相比没有颠覆性变化所以网上那些老教程的大部分内容到今天依然适用。提示Windows用户有个常见坑——安装时Git会自动把换行符从LF转成CRLF这本身是为了兼容老式编辑器但跨平台项目里会让git diff看起来一团糟。后面讲配置时我会详细说怎么设最省心。1.2 第一次打开终端必须做的三件事装好Git之后第一件事不是急着建仓库而是先告诉Git“你是谁”并处理好换行符。这一步直接决定你后面提交的时候会不会被队友吐槽。打开终端依次执行git config --global user.name 你的名字 git config --global user.email 你的邮箱 git config --global core.autocrlf input第一行和第二行会写进你的全局配置文件Windows下在用户目录的.gitconfigLinux/macOS也是。每次提交时这两条信息会永久记录在历史里所以建议用真实姓名和常用邮箱。我就见过有人用网名提交结果项目上线后审计代码时老板拿着日志问“这xX_风一样的男子_Xx是谁”场面一度非常尴尬。第三行core.autocrlf input是很多教程不会重点讲但实际踩坑最多的地方。简单解释一下Windows系统里文本换行是\r\nCRLFLinux/macOS是\nLF。如果设置不好你会上传一批文件结果Git认为每个文件都变了因为换行符全部被改变。在Windows上我建议设成git config --global core.autocrlf true这样Git在提交时会把CRLF转成LF存进仓库检出到工作区时再转回CRLF仓库里始终是LF团队成员之间就不会互相制造换行符噪音。在macOS/Linux上设成input即可效果是提交时转LF检出时不转。不想手动一条条执行的话也可以直接编辑配置文件。拿我的配置文件举个例[user] name Your Name email youremail.com [core] autocrlf input editor vim [init] defaultBranch main第四行init.defaultBranch main也很值得设置。以前Git新建仓库的默认分支叫master现在主流平台默认都是main。提前设好可以避免本地仓库跟远端分支名不一致时多做一次重命名操作。第五行把默认编辑器设成Vim是针对我的习惯如果你不太熟Vim先用系统默认的nano也行或者后面配置成VS Code。配置完成后用git config --list检查一下确认所有值没错就开始了。这一步花五分钟能避免后面一个月都难受。2. Git的核心心智模型先想明白再动手2.1 快照不是记录差异很多人学Git卡住是因为用SVN的逻辑去理解Git。SVN记录的是“这个文件从版本1到版本2改了什么”而Git不这么干。Git的核心操作是快照Snapshot——每次提交它把当前所有文件的状态打一个包存成一个不可变的对象。如果某些文件没变化Git会直接复用上一次的快照引用并不重复存储文件内容。你可以把Git理解成一个无限容量的“存档室”每按一次提交键就自动把整个项目目录复印一份放进存档室并贴上一个唯一编号就是那一长串哈希值。一开始可能觉得浪费空间实际上因为复用未变化文件仓库通常不会膨胀得太夸张。这个设计的直接后果是Git的每一次提交都是完整的版本状态所以你在任意时间点都能干净地恢复出当时的项目全貌不需要像SVN那样“从第一次提交开始依次重放所有差异”。还有一点容易被忽略Git里几乎所有操作都是本地完成的不依赖网络。因为整个历史仓库从一开始就完整复制到你的机器上。SVN时代“断网就不能查历史”的痛点在Git这里不存在。我再强调一次以后你看到类似“Git是内容寻址的文件系统”这种高大上说法说的就是这件事——Git存储的不是差异而是完整快照每个快照通过SHA-1未来会迁移到SHA-256哈希值来标识。2.2 三个区域与文件的四种状态理解了快照之后再看Git的文件流转就轻松了。Git仓库里有三个核心区域工作区Working Directory就是你用编辑器打开、直接操作的那堆文件。暂存区Staging Area / Index一个临时存放“待提交内容”的区域你可以理解成提交前的“候选名单”。本地仓库Repository存着所有历史快照的地方也就是你的.git目录里真正存数据的位置。在此基础上一个文件可能处于四种状态未跟踪Untracked文件在工作区但Git从来没记录过它。已修改Modified文件已被Git跟踪但工作区内容和暂存区不一致。已暂存Staged文件已经被加进暂存区下次提交它就会被包含进去。已提交Committed文件已经安全存进本地仓库的历史快照里。日常流程是这样的你修改工作区的文件然后git add把修改放进暂存区再git commit把暂存区的内容固化成一个新的快照。这张流转图看起来简单但很多初学者栽在“暂存区”上总觉得自己改完文件就万事大吉了结果一提交发现什么都没跟上。我经常给学生打一个类比暂存区就是超市购物车。货架上工作区的商品你想买要提交先放进购物车暂存区最后去收银台结账提交。结账只认购物车里的东西你货架上拿起来又放回去的、或者随手塞进自己兜里的收银员都不算数。这个类比你品一品立刻明白为什么git commit不会包含你最新修改但没git add的内容了。查看状态时git status会明确告诉你哪些文件在哪个区。它可以算是Git里最重要的一条命令我一天能敲二十次也不夸张。想快速看懂输出就记住红色在左、绿色居中、干净最好——红色是工作区有改动但没暂存绿色是已暂存待提交全部干净说明你的工作区、暂存区和最后一次提交完全一致。3. 个人本地版本管理先跑通最常用的主循环3.1 三条命令建立项目版本库配件备齐概念落地。现在快速跑通一条主循环git init→git add→git commit。找个测试目录比如~/learn-git打开终端mkdir learn-git cd learn-git echo hello git readme.txt git init git add readme.txt git commit -m feat: 初始化项目添加readme这一套下来你就有了一笔提交。git init会在当前目录生成一个隐藏的.git文件夹这里装的才是仓库本体别去手动翻它交给Git自己管就行。git add后面可以跟文件名、目录名、通配符也可以跟-A把所有修改、新增、删除都囊括进来或.当前目录下所有变化。我日常最常用git add -A或git add .因为逐个添加文件太啰嗦。不过要注意如果项目里有些文件你根本不想提交比如编译产物、本地配置、密钥文件那就在初始化后第一时间写好.gitignore从源头把它们排除在外比事后用git rm清理干净得多。.gitignore的语法也很简单一行一条模式支持通配符和路径# 依赖与构建产物 node_modules/ dist/ build/ *.pyc __pycache__/ # 环境与密钥 .env *.pem config.local.*3.2 commit信息规范与提交频率git commit -m 描述就是创建快照的动作。-m表示直接在命令里写提交信息如果不用这个参数Git会打开默认编辑器等你写多行信息。提交信息写得好不好直接体现一个人的职业素养。我建议不管大项目小项目都遵守Conventional Commits风格git commit -m feat: 新增用户登录接口 git commit -m fix: 修复登录页按钮在移动端点击失效 git commit -m docs: 更新API文档feat新功能、fix修bug、docs文档、refactor重构、test测试、chore杂项。这种规范看着多一条字收益却是长期的哪天你回看历史能一眼看出每次提交的意图而不是看到十几条“update”和“fix”。提交频率这块我的个人习惯是“功能完成一个小闭环就提交一次”不追求每天只交一次也不把一堆无关改动绑在一次提交里。比如“修了登录bug 顺手加了注释 改了历史文档”这种最好拆成两次提交不然将来单点回滚历史时会很难受。3.3 查看历史与检查改动status/log/diff本地仓库里攒了几个提交后你需要三件套来审查历史git status——看当前工作区处于什么状态前面讲过。git log——看提交历史列表。默认输出比较朴素建议加上参数美化一下git log --oneline --graph --decorate -10一行一个提交、带分支图、当前分支标得很清楚只显示最近10条。git diff——看具体改动内容。工作区里你改了文件还没暂存时git diff展示工作区与暂存区的差异暂存之后想再看用git diff --staged。这三个命令组合起来能帮你回答最常见的问题我改到哪了改了什么上次提交是啥有个使用技巧可以提一下如果git diff的输出看起来太密你可以只看某个文件的差异比如git diff src/main.js或者只查看差异统计摘要git diff --stat会输出每个文件的增删行数。这个在开会前抓重点特别有用。4. 给项目装上“存取机”远程仓库与首次推送4.1 什么是远程仓库为什么需要本地仓库能让你自己无限存档但真实项目几乎不可能一个人单机开发。远程仓库就是放在服务器上的Git仓库副本它干三件事备份你的电脑硬盘炸了仓库还能从远端恢复。协作所有人都可以拉取同一个仓库互相合并代码。多设备同步办公室电脑、家里电脑可以保持同一份代码的最新状态。2026年的现状是绝大多数团队都依托代码托管平台公共开源项目用面向公众的平台企业内部敏感项目用私有化部署或云上的私有仓库。但Git本身并不依赖任何特定平台——不管你在哪个网站托管仓库底层命令逻辑都是同一套。所以下面这些操作你只要练会一遍换个平台也不慌张。千万别把平台特有的网页按钮和Git命令混为一谈。4.2 添加remote并推送假设你已经在某个托管平台上创建了一个空仓库页面一般会给你一个仓库地址。接下来在本地仓库里绑定它然后推送git remote add origin https://example.com/yourname/learn-git.git git branch -M main git push -u origin main第一行把远端地址登记为名为origin的远程仓库。这个origin是约定俗成的名字表示“主要远端”你当然可以起别的名字来关联多个远端。第二行确保本地分支叫main跟平台默认分支保持一致。第三行的-u是--set-upstream的简写它会建立本地main分支和远端main分支的“上下游”关系。设了这个以后你想推送时直接敲git push就行不用每次带全参数。推送完之后刷新托管平台页面你的代码就飞上去了。这就是远程连接的全部魔法——没有网速玄学也没有额外认证魔法走的还是Git核心的那些命令。4.3 克隆别人的仓库在一个全新环境里想拿到某个项目用git clone而不是“下载ZIP”。因为clone会把完整历史、所有分支、标签全部复制到本地还会自动把远端设置为origin你立刻就能开始干活。下载ZIP只有一个当前快照既没有历史也没有远端关联。git clone https://example.com/someone/project.git cd projectclone下来之后可以git log翻历史也可以git branch -a查看本地和远端的所有分支。对新人来说这是理解一个陌生项目最快的方式——读提交历史往往比直接翻代码更高效因为每次提交信息都在告诉你“这个项目是怎么一步步长成现在这样的”。4.4 fetch与pull的区别日常循环里你需要从远端拉别人推上去的代码。这里有两个相关命令git fetch只把远端提交下载到本地和git pull设置为fetch 自动合并。git pull git fetch git merge。具体来说git fetch会把远端的最新状态同步到本地仓库的远端跟踪分支里比如origin/main但不会动你当前的工作区和分支。git pull则会直接把origin/main合并到你当前分支。这个区别非常重要。有的人养成习惯每天上来就是一个git pull一旦本地有未提交的改动或者跟远端冲突就会被Git的提示卡住一脸懵。我的建议是**想看清楚远端发生了什么先用fetch确实准备好合并了再用pull。**当你的代码和远端都有分歧时先跑一次git fetch再git log --oneline --graph --all -20对比本地和远端的提交情况比手忙脚乱地处理pull冲突心里有数得多。fetch/pull之后你的本地仓库会同时出现两条演进线理解起来稍微绕一点但这正是Git分布式设计的精华所在本地和远端是两份独立历史只是通过push和pull互相交流。5. 分支最强大的“角色扮演”5.1 分支的本质是移动的指针如果你只打算从这篇教程里带走一个概念那一定是分支branch。Git的分支极其轻量它本质上只是一个指向某个提交的指针。新建分支无非是创建一个新指针让它指向你当前的提交切换分支就是把你工作区的文件还原成目标指针所指向的快照状态。这个轻量特性导致的结果是分支新建和切换的成本极低你完全可以在分支之间来去自如而不用像老式版本管理那样“复制整个目录”。为了理解它的价值我来描述一个真实场景。你正在写新功能A写到一半的时候项目突然出了个线上bug需要你紧急修复。没有分支的话你只能把当前写到一半的改动小心翼翼地保存起来生怕被修复代码干扰。有了分支一切简单git checkout -b fix/hotfix-login # 这个命令等于 git branch fix/hotfix-login git checkout fix/hotfix-login上面这行把指针从当前提交上“裂开”一个新支线然后切过去修复。修好后提交、合并回主线、删除临时分支一气呵成。然后你再切回原来的功能分支发现刚才写到一半的东西原封不动地等在那里。一句话总结分支让你可以在同一时间轴上演多个平行的剧情而它们互不干扰。5.2 分支操作全掌握分支相关的命令其实就那几个更多是概念上的切换。git branch列出本地分支带*的是当前分支。git branch name创建新分支。git switch name切换分支新版Git推荐用switch代替checkout做切换语义更清晰。git switch -c name创建并切换等价于旧的git checkout -b。git merge name把指定分支的提交合并到当前分支。git branch -d name删除分支。如果分支上有未合并的提交Git会拒绝删除需要改用-D强制删除。合并分支的操作里值得一提的是一次合并成功后Git会基于“共同祖先提交”自动计算两条分支的差异并生成一个新的提交把双方的变化整合起来。这个过程中如果双方修改了同一文件的同一行Git无法自动选择就会停下来要求你人工决定——这就是冲突。5.3 合并冲突的应对冲突不是错误它是Git在诚实地告诉你“这两个改法我无法自动替你决定你来拍板。”这是一个正常环节不用恐慌。举个例子。你和同事同时修改了config.json里的一行。他改了远程地址你改了服务端口结果都提交到了同一个分支。你拉取代码、尝试合并时输出会提示CONFLICT (content): Merge conflict in config.json。打开这个文件你会看到“冲突标记”{ serviceUrl: HEAD https://stg.example.com https://prod.example.com teammate/update-config }上面这段里HEAD和之间是你当前分支的版本和 teammate/update-config之间是对方分支的版本。解决方式很简单编辑这个文件删掉、、标记线把两个版本按你需要的方式合并起来比如{ serviceUrl: https://stg.example.com }然后保存、git add config.json、git commit生成合并提交。Git会看到冲突标记已经消失自动完成这次合并提交。实际工作经验里处理冲突时有个小技巧**先通知对方你已经处理了某个冲突避免两个人同时改同一个文件然后互相覆盖。**另外冲突如果比较多就别硬着头皮一个个手动改可以先git merge --abort回滚这次合并重新梳理一下思路再继续。6. 与队友协作的日常节奏6.1 单主干协作模式从一到多协作模式千差万别但2026年大多数中小团队起步用单主干Trunk-Based或简化的Git Flow就够了。简单说大家平时都工作在主分支或一个开发分支上每人负责一小块代码频繁合并。这个模式最大的优点是简单、冲突面积小、对新人友好不会一上来就面对复杂的分支矩阵。实际的一天可能是这样的早上开工前先git pull拉取队友昨晚推的代码。创建或切到一个功能分支比如git switch -c feat/user-profile。在该分支上开发自己的功能正常提交。功能完成先git pull合并远端最新代码git pull --rebase origin mainrebase后面会说解决可能的冲突。切回主分支把功能分支合并进来git switch main git merge feat/user-profile。git push origin main推送今天的成果。这样节奏下来冲突发生的概率被控制到很低。别小看“频繁同步”这件事两个人各自埋头干两天再合并冲突能堆成小山每天合并两三次每次冲突就一行两行的事。6.2 pull的时候用merge还是rebase这是一个容易吵起来的经典问题。简单解释一下merge会保留两条历史线的形状所以历史图上可能出现很多分叉和“化妆品”样子的提交线路。rebase是把本地尚未推送的提交摘下来重新接到远端最新提交的后面历史线变成一条笔直的、干干净净的演进线。我个人习惯本地拉取并用rebase。好处很明显提交历史是线性的git log看着清爽将来用git bisect找bug也更舒服。有代价也有——rebase重写提交哈希所以它只适用于还没推送出去的本地提交。一旦提交已经被推送到共享远端就别再rebase了否则队友会因为你重写了共同历史而想杀人。具体用法git pull --rebase origin main偶尔会遇到“本地修复和远端修复冲突”的情况rebase直接卡住。解决办法一个个解决冲突git add相关文件然后git rebase --continue继续。实在处理不了就git rebase --abort回到rebase之前的状态。6.3 PR/MR的协作流程单主干模式适合小团队快速推进但项目一旦上了规模或者需要做代码评审就得引入更规范的协作流程。目前主流平台普遍支持Pull RequestPR或Merge RequestMR从主分支切出功能分支。本地开发、提交、推送git push -u origin feat/user-profile。在平台上发起PR/MR请求把这个分支合并进主分支。队友在PR里审查代码、提意见、讨论修改。验证通过后合并进主分支删除远端功能分支。这套流程对团队的好处很直观每段代码都经过了第二双眼睛问题能提前发现一半以上。对个人来说你的提交记录不再是自嗨而是要经得起别人“找茬”的过程——这会倒逼你提交信息写清楚、改动范围控制好。如果是开源项目还会涉及Fork PR的流程就是把你感兴趣的仓库先克隆到自己账号下改完再向原仓库发起PR。概念上和上面这套没有本质区别无非是远端仓库归属不同。7. “后悔药”手册如何在出错时自救7.1 改乱了工作区如何还原Git最让人安心的一点是大多数常见错误都能救回来。我把各种“后悔”场景按严重程度从低到高整理一份速查。场景1工作区里有改动但不想要了。git restore .这条命令会把工作区还原到最后一次提交或暂存的状态。新文件夹里如果有些未跟踪的文件想一并清掉用git clean -fd但务必先确认因为它会删除未跟踪文件而且默认不可恢复。你可以先git clean -n看看它打算删什么。场景2已经把文件git add进暂存区想撤回来。git restore --staged file这个操作只把文件从暂存区移出不会改动工作区内容。如果你还想连工作区一起还原就再加--worktreegit restore --staged --worktree file。7.2 已提交了怎么办有三种不同的“后悔”深度**场景3提交完之后发现上一条信息写错了。**如果还没推送到远端用git commit --amend -m 新的提交信息它会替换掉最近一次提交。注意amend同样会重写哈希所以对已推送的提交不能用。**场景4提交的内容有误但你想保留历史。**用git revert commit。它不修改原提交而是创建一个“反向提交”来抵消之前的改动。这是安全公共历史的标准姿势适合用在已经推送到远端的提交上。**场景5提交完发现方向全错想直接回到过去的某个版本。**用git reset。这个命令有三种模式git reset --soft HEAD~1 # 提交撤销改动保留在暂存区 git reset --mixed HEAD~1 # 提交撤销改动保留在工作区默认 git reset --hard HEAD~1 # 提交撤销改动全部丢弃HEAD~1表示“上一个提交”HEAD~2表示倒数第二个以此类推。--soft和--mixed相对温和--hard是核武器用之前多看一眼git log确认你要去的那个提交想清楚了。7.3 误删分支或提交还能找回reflogGit还有一道最后的防线叫reflogreference log。它记录的是你本地仓库的“指针移动历史”也就是说只要操作发生在本地Git都留了一本账不管你是误删分支、误reset还是rebase到一半反悔都能从这本账里找到之前的坐标。举个例子。你删掉了分支feat/old-ideagit branch -D feat/old-idea过一会儿发现里面有个提交还得用。这时候执行git reflog输出里能看到所有HEAD指针移动过的记录包括“branch: deleted”那一行前面跟着一个哈希值。把那个哈希值记下来然后git branch feat/old-idea-2 那个哈希分支原地复活里面的提交也全部找回来了。reflog是本地独有数据克隆一个仓库不会同步reflog。但它默认保留约90天可以配置所以我一直强调**出事先别惊慌先看看reflog。**绝大多数本地误操作都有一条路可以倒带。8. 高频问题排查与效率贴士8.1 常见问题速查表日常答疑久了我整理的这张表能解决80%的基础卡点现象原因解决命令提交了但push被拒远端有新提交本地落后git pull --rebase后重新push合并时冲突状态很乱双方改了同一段代码手动处理冲突git addgit merge --continue提示“detached HEAD”切换到了一个历史提交而不是分支git switch -回到原分支或基于该提交新建分支commit写错了信息想改最近一次提交信息git commit --amend文件没出现在提交里忘了git add或路径被gitignore排除了git status检查必要时改.gitignore想放弃当前所有改动工作区脏了不想保留git restore .加git clean -fd本地分支和origin不同步有人删了远端分支本地跟踪还残存git remote prune origin8.2 必备的“高效率小抄”这些是让我日常工作节奏提升一大截的小配置强烈建议你照抄第一配置命令别名。在~/.gitconfig里加上[alias] st status -sb lg log --oneline --graph --decorate --all co checkout br branch cm commit -m unstage restore --staged last log -1 HEAD --stat加了这些之后敲git st就是状态git lg就是漂亮的提交历史图。别小看少敲的字母就这几个别名我一天能省下来好几分钟而且习惯后几乎离不开。第二善用git stash。当你正在写一半代码突然要切分支处理别的任务时把当前改动“藏”起来git stash push -m wip: 用户列表UI未完成 git switch other-branch # 处理完回来 git switch original-branch git stash popstash不会包含未跟踪文件需要时加-u一起藏。stash list可以查看列表误弹了也可以用git stash apply 编号恢复。第三学习git bisect。这是定位“哪个提交引入的bug”的法宝。逻辑很简单告诉Git一个“好的提交”和一个“坏的提交”Git会在中间二分查找每次问你当前版本是好是坏通过你回答的几次判断把范围缩小到具体是哪一次提交引入了bug。在大型项目里这功能真的能救命比肉眼翻历史高效得多。命令极简git bisect start git bisect bad # 当前版本是坏的 git bisect good 旧提交哈希 # 然后按提示反复测试、标注good/bad最后Git会精确定位 git bisect reset # 结束二分回到原分支8.3 什么人应该学到什么程度最后说点实在的。Git要不要学得很深取决于你的角色如果你是学生或刚入行的初级开发者目标就是熟练使用push、pull、分支、合并、解决冲突再会一点revert和reset足够应付日常作业和大部分公司需求了。别一上来就啃内部实现。如果你是后端工程师或做基础架构的你会经常需要排查历史、做代码评审、处理复杂的多分支发布流程那rebase、cherry-pick、submodule、worktree这些进阶功能值得逐一实践。但也不用急于一天学完每次遇到实际问题再针对性地查命令效果远好于空背手册。如果你本身不是开发者比如做产品、设计、运维、测试的同学大多数时候你只需要知道“主分支稳定”、“提个PR让人看一眼”、“能在需要时恢复出某个历史版本”就够了。把这些高频操作练熟比研究Git原理更能直接提高你的协作效率。最后的个人经验写了这么多其实最想表达的还是那句老话Git不是用来“背”的是用来“用”的。我见过太多同学买了一堆Git书结果Excel表格比代码还先崩溃。所以这篇教程的核心就是帮你把最高频的20%命令练成条件反射剩下的命令遇到问题再查文档比一次性学完效率高得多。我自己带新人的时候总会提醒他们三句话多问git status多看git log出错先查reflog。这三句话能解决日常开发里九成以上的“翻车”现场。等有一天你不用看任何笔记闭着眼睛能handle分支、合并、回滚这些操作了那时候你才真正把Git从“一个麻烦的工具”变成“一个得力的助手”。现在不妨开一个目录敲下第一行git init然后亲手完成一次提交。任何工具都是从第一次实操开始变成你的肌肉记忆的。