1. 为什么我想写一篇“朋友专用”的 Git 教程
先把话说在前面:这篇文章不是写给资深工程师看的,是写给“知道 Git 很重要、但是每次用都要搜百度”的那群人看的。我自己带过不少新人,也手把手教过好几个朋友用 Git,最后发现真正阻碍大家的往往不是某一个具体的操作有多难,而是脑子里没有一个连贯的图景——不理解 Git 到底在干嘛,自然记不住命令,遇到报错更是一头雾水。
所以我决定换个思路,用“教朋友”的心态来写这篇 Git 基础操作入门。整篇文章围绕一个重点:用最少的概念,建立最稳的操作习惯。我会尽量避开那些高阶的花活,专注讲清楚三类最常见的场景——本地仓库怎么管、远程仓库怎么连、出问题怎么救。这三件事搞通了,日常开发 90% 的 Git 操作就已经覆盖了。
这篇文章适合谁看?零基础纯小白、刚从 SVN 或其他工具切过来的人、以及“用了一年 Git 但全靠图形界面点来点去、一敲命令就心虚”的同事。认真看完,跟着敲一遍,以后面对 Git 就不会再发怵了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Git 到底是什么,它解决的又是什么问题
2.1 从一个“灾难现场”说起
想象一下这个画面:你的项目文件夹里躺着 项目最终版.doc、项目真最终版.doc、项目终极不改版.doc、项目真的不改了.doc……这不是段子,这是所有没接触过版本管理工具的人都经历过的噩梦。
Git 就是来终结这个噩梦的。它是一个分布式版本控制系统,核心功能就两件事:记录每次改动,然后让你随时能撤回。你可以把 Git 理解为单机游戏里的存档机制——玩到一个关键节点存个档,后面玩崩了不用重新开始,读档就行。
区别在于,Git 的“存档”不仅记录文件在那个时刻的完整内容,还记录了谁在什么时间改了什么、为什么改。这就像一个时间机器,你随时可以回去看看任何一个历史瞬间的代码长什么样。而且这个时间机器的开关很轻,本地就能运行,不依赖网络、不依赖服务器,自己一个人也能用起来。
2.2 那“分布式”三个字又该怎么理解
传统的老牌版本管理工具(比如 SVN),是“集中式”的:所有历史记录存在一台中心服务器上,每个人干活都要先把代码从服务器拉下来,改完了再传上去,万一服务器挂了,整个团队的历史记录就全完了。
Git 不一样。它是分布式的,意思是每个人的电脑上都存着完整的仓库副本——包括全部历史记录、全部分支、全部改动记录。没有中心服务器的时候,你自己正常干活,提交代码、看历史、建分支、撤销改动,全部本地搞定,快得很。等需要和别人协作的时候,再通过远程仓库(比如 GitLab、GitHub,或者公司内部搭建的 Git 服务)把各自的改动同步一下。
这带来的直接好处是:离线也能干活、历史记录更安全(每个人都是完整备份)、分支和合并的体验极其顺滑。这也是为什么 Git 现在几乎成了整个软件行业的默认选择。
2.3 先建立三个核心概念:工作区、暂存区、版本库
动手敲命令之前,建议先把 Git 的“三块地盘”搞明白。不夸张地说,很多人学了几个月 Git 还在犯糊涂,就是因为没建立这几个概念。
- 工作区:就是你电脑上看到的那个文件夹。你正常新增、修改、删除文件,操作的都是工作区。
- 暂存区:一个中间缓冲区,英文叫 index 或 stage。你可以理解为一个“待提交清单”,把想提交的文件先放进去。
- 版本库:Git 真正存历史记录的地方,位于隐藏的
.git目录里。所有已经提交的快照都存放在这里。
执行 git add 是把改动从工作区放入暂存区,执行 git commit 是把暂存区的内容永久保存进版本库。至于工作区和暂存区之间的状态比对,用 git status 和 git diff 来看。
这三个概念搞清楚了,后面所有命令你都能自己推导出使用逻辑,而不是死记硬背。
3. 环境准备:Git 安装与基础配置
3.1 Windows / macOS / Linux 的安装方法
Windows 用户:推荐直接去 Git 官网(git-scm.com)下载安装包。下载的时候注意看是否是 64 位版本。安装过程中基本一路 Next 就行,但有几个地方建议稍微留意一下:
- 在选择默认编辑器时,如果你不熟悉 Vim,建议改成 VS Code 或 Notepad++,否则以后在命令行里提交合并信息时可能会被 Vim 困住(我见过不少人在这一步被劝退)。
- 在调整 PATH 环境的界面,选择 “Git from the command line and also from 3rd-party software” 这个推荐选项,这样可以在 CMD、PowerShell 里直接用 git 命令。
- 行尾转换符建议保持默认(Checkout Windows-style, commit Unix-style line endings),这个对跨平台协作更友好。
macOS 用户:如果你装了 Homebrew,一条命令 brew install git 就搞定;没装的话,去官网下载 .dmg 安装包也可以。打开终端验证一下 git --version,有输出就说明装好了。
Linux 用户:Ubuntu/Debian 系用 sudo apt install git,CentOS/RHEL 系用 sudo yum install git,基本没什么坑,装上直接用。
3.2 装完之后的第一件事:配置身份信息
安装完成后第一件事不是急着用命令,而是先把你的“名片”设置好。Git 每次提交都会记录提交人的姓名和邮箱,这个信息是跟着提交走的,并且将来很难改,所以一定要现在设置好。
bash复制git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
注意两点:第一,--global 表示全局生效,也就是这台机器上所有仓库都会默认用这套身份信息,如果你有多个不同身份的仓库需要分开配置,可以去掉 --global 在某个特定仓库里单独设置。第二,邮箱不一定要用真实邮箱,但建议用你托管平台(GitHub/GitLab)绑定的邮箱,这样提交记录才能正确关联到你的账号头像。
验证配置是否生效的命令是:
bash复制git config --list
3.3 顺便把别名配好,能省不少事
用得多了你会发现有几个命令特别长,比如 git checkout、git branch、git status。可以给它们设置别名,以后少敲几个字符:
bash复制git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
配完之后,输入 git st 就等价于 git status。这种小技巧刚开始可能觉得无所谓,真的用起来以后会感谢自己。
4. 本地仓库的日常操作:这是你必须吃透的部分
4.1 初始化仓库与第一次提交
假设你现在有一个项目文件夹叫 my-project,想在项目里用 Git 做版本管理。首先要做的就是在项目根目录执行:
bash复制cd my-project
git init
这个命令执行完后,项目里会多出一个隐藏的 .git 文件夹,这就是版本库的存放位置。注意:这个文件夹不要手动改动、不要提交到远程仓库,更不要删掉。删掉它等于删掉了项目所有历史记录。
然后试着做第一次提交。你可以先随便创建一个文件,比如 README.md,然后执行:
bash复制git add README.md
git commit -m "初始化项目,添加README文件"
-m 后面跟的是提交说明,这条说明很重要,它是你未来回溯历史时的“路标”。我见过太多人写“update”“修改”“123”这种毫无信息量的提交信息,等要查问题时恨不得穿越回去扇自己两巴掌。提交信息建议遵循一个简单的原则:看完就能知道这次改动的意图。比如 修复登录页在 Safari 下样式错乱的问题 就比 fix bug 强了一万倍。
4.2 工作区、暂存区、版本库之间的状态流转
日常开发中你最多接触到的命令是 git status。它会告诉你当前仓库处于什么状态,哪些文件被改了、哪些文件已经放入暂存区、哪些还没有被 Git 跟踪。几乎每次动手之前都应该先 git status 看一眼,这不是废话,而是保护自己的最好习惯。
举个例子,你正在改代码,改完几个文件后想把它们提交。步骤如下:
bash复制git status # 看哪些文件被改了
git add 文件名1 文件名2 # 只暂存想提交的文件
git status # 再确认一下暂存区内容
git commit -m "具体说明改了什么"
这里要特别强调 git add 的用法:它可以接具体文件名,也可以接 git add .(把当前目录下所有改动加入暂存区)。对新手我的建议是,尽量养成“明确指定文件”的习惯。因为 git add . 很可能把你不想提交的文件也加进去,尤其当项目里混着临时文件、日志文件、密钥文件时,这会非常危险。
4.3 还没提交就已经改错了,怎么撤销
很多新人最怕的就是“改坏了”。别怕,Git 的设计初衷就是为了让你有后悔药吃。分两种情况来讨论:
文件已经 git add 了但还没 git commit:这时你想把文件从暂存区撤回来,可以使用:
bash复制git restore --staged 文件名
这个命令的意思是:把文件从暂存区退回到工作区,也就是撤销刚才的 git add,但是文件的改动内容还在,不会丢。
工作区的文件改动不想要了:你想直接丢弃改动、回到最近一次提交的状态,使用:
bash复制git restore 文件名
注意:git restore 文件名 这个操作是不可逆的,它会用最近一次提交的内容覆盖工作区当前内容。所以执行前一定要确认这个文件里的改动确实不要了,否则改完就真找不回来了。谨慎再谨慎。
4.4 查看历史记录与版本回退
git log 是查看提交历史的命令。默认它会列出所有提交,按时间倒序,每条包含提交哈希、作者、日期和提交信息。
bash复制git log --oneline --graph
--oneline 让每条提交只显示一行,--graph 会在左边画出分支图形,看起来更直观。你可能会看到类似这样的输出:
text复制a1b2c3d (HEAD -> main) 修复登录页样式问题
e4f5g6h 增加用户注册功能
i7j8k9l 初始化项目
前面那串 a1b2c3d 是提交哈希(版本号),HEAD 表示当前所在的版本位置。
假如你想把整个项目回退到某个历史版本,可以使用 git reset。这个命令有三种模式,对新手来说,先记住两个就够了:
bash复制git reset --soft 提交哈希 # 回退到指定版本,但保留改动到暂存区
git reset --hard 提交哈希 # 回退到指定版本,并且丢弃之后所有改动
--hard 很好用,但也非常危险,它会强行使当前目录完全恢复到那个历史版本的状态,之后的改动会彻底丢失。如果不确定,宁可先用 --soft,或者干脆用 git revert(创建一个新的提交来抵消历史提交),这个比 reset 更保守、更适合新手。
4.5 分支:Git 最让人上瘾的功能
分支是 Git 的灵魂,也是很多新手觉得“高深”的部分。其实用一个生活化的类比你马上就懂了:分支就是在你的时间线上开出一条“平行世界”,你可以在平行世界里做实验、写新功能,完全不影响主世界,实验成功了再合并回来,失败了就扔在一边。
创建分支的命令:
bash复制git branch 新分支名 # 创建分支,但还停留在当前分支
git checkout 新分支名 # 切换到该分支
日常更常用的是直接把两步合并成一步:
bash复制git checkout -b 新分支名
查看当前在哪个分支:
bash复制git branch
文件名前面带 * 的就是当前分支。
切换分支后,你在工作区所做的所有修改都是属于当前分支的。注意:在切换分支之前,最好把当前工作区的改动先提交干净,否则 Git 会拒绝切换(提示你工作区有未提交的改动),或者把你的改动带到另一个分支上去,这很容易造成混乱。
4.6 合并分支:把平行世界并回来
当你在功能分支上开发完毕,想把它合并回主分支,先切回目标分支(比如 main),然后执行:
bash复制git checkout main
git merge 功能分支名
如果两个分支的改动互不冲突,Git 会自动完成合并,非常顺畅。如果改动了同一个文件的同一块地方,就会报冲突,提示你手动解决。看到冲突提示不要慌,这是 Git 在保护你。你需要打开冲突文件,搜索标记(<<<<<<<、=======、>>>>>>>),把两边的内容梳理成最终想要的版本,然后删除标记,再执行:
bash复制git add 冲突文件
git commit
给新手的心得:解决冲突时不要图快乱删代码,要搞清楚两边各自的意图再合并。实在拿不准就找写那边代码的同事聊一聊,比自己在角落瞎猜靠谱得多。
5. 远程仓库协作:clone、push、pull 与免密配置
5.1 第一次和远程仓库打交道
公司或开源项目通常会把代码托管在一个远程 Git 服务上,比如 GitHub、GitLab、Gitee,或者公司内部搭建的 GitLab。把远程仓库复制到本地的工作叫“克隆”,命令是:
bash复制git clone https://github.com/用户名/仓库名.git
克隆完成后,你的本地会生成一个和远程仓库同名的文件夹,里面包含了完整的代码和历史记录。这时 Git 会自动帮你把远程仓库设置为 origin(这是远程仓库的默认别名,可以理解为这是“官方源头”)。
查看当前仓库关联了哪些远程地址:
bash复制git remote -v
5.2 推送提交:local → remote
你在本地提交了若干版本之后,想把这些改动同步到远程仓库,用:
bash复制git push origin 分支名
这里的 origin 是远程仓库名,分支名 是你想推送的本地分支名。第一次推送新分支时,Git 可能会提示你加上 --set-upstream(或 -u)参数来建立本地分支与远程分支的关联关系:
bash复制git push -u origin 新分支名
这样设置之后,以后在这个分支上直接敲 git push 就能推送,不用再写远程仓库名和分支名了。
5.3 拉取更新:remote → local
当你的同事推送了新代码到远程,你需要把这些更新拉到本地。有两种方式:
bash复制git pull
git pull 实际上做了两件事:先 git fetch(把远程的更新下载到本地,但不改动你工作区的文件),再 git merge(把远程的更新合并到当前分支)。所以你可以把 git pull 理解为“下载 + 合并”的快捷键。
这里给新手一个重要的实战经验:在每次准备开始写代码之前,先拉一次最新代码(git pull),写完后提交推送。 不要一次写很久不拉更新,否则一旦别人改了同一个文件,你在最后 pull 时要面对的冲突信息可能是一整屏的,解起来非常让人头疼。
5.4 配置免密登录,省去每次输密码的烦恼
每次 push/pull 都要输入用户名密码,确实让人烦躁。作为一个“好朋友教程”,这个坑必须帮你填上。
Git 目前有两种主流免密方式:HTTPS + 凭据管理器 和 SSH Key。
方式一:HTTPS 凭据管理器。在 Git 装好后,Windows 上一般自带 Git Credential Manager。第一次 push 的时候输入账号密码,它会弹窗问你是否记住凭据,选“是”以后就自动免密了。如果你用的是 macOS,系统钥匙串也会帮你记住。这种方式最简单,适合大多数不想折腾 SSH 的同事。
方式二:SSH Key(更推荐、更稳)。原理是:在你电脑上生成一对密钥(公钥和私钥),把公钥放到 Git 托管平台上,之后你和远程服务器之间通信就用密钥对来验明身份,不需要再输密码。
生成密钥:
bash复制ssh-keygen -t rsa -b 4096 -C "你的邮箱"
一路回车(可以设置一个 passphrase,也可以留空),完成后会提示你公钥和私钥的存放路径,一般是 /c/Users/你的用户名/.ssh/id_rsa.pub。用文本编辑器打开这个文件,复制里面全部内容,然后登录你的 GitHub/GitLab,在 Settings -> SSH and GPG keys 里添加。
添加之后测试一下:
bash复制ssh -T git@github.com
看到 “Hi 用户名! You've successfully authenticated” 类似的提示,说明配置成功了。以后 clone 仓库时用 SSH 地址(git@github.com:用户名/仓库名.git),就不再需要输入密码了,稳定性也远高于 HTTPS。
5.5 关于“login failed / GitLab 版本报错”这类远程连接问题
使用 Git 的人多多少少会遇到远程连接失败的问题,最常见的报错是登录失败或者平台提示 API token 错误。这类问题的排查思路基本一致:
- 先确认你的账号在远程平台是否有对应仓库的权限,第一次用的人很容易在权限配置这一步漏掉;
- 如果用的是 token 验证方式,检查 token 是否过期、是否选择了正确的权限范围;
- 用
git remote -v检查远程地址是否正确,特别注意是不是把https://和git@两种格式混在一起了; - 网络不稳定时,
git push偶尔会失败,先重试两三次,还不行再看具体报错信息。
遇到报错的第一原则是:不要盲目删掉本地仓库重来,先多看几行报错信息,Git 的报错大多已经把问题原因写在里面了。
6. 疑难杂症排查:高频报错与我的独家心得
6.1 常见报错速查表(建议截图保存)
实际操作中我见过太多人一头扎进“Git 报错”的搜索里,其实很多问题是高频、固定的。我整理了一张表,把新手最常踩的坑都列出来:
| 报错信息或现象 | 原因分析 | 解决方案 |
|---|---|---|
fatal: not a git repository (or any of the parent directories): .git |
当前目录不是 Git 仓库 | 往上层目录看,确认是否在正确的项目目录里;如果整个项目还没做 Git 管理,先执行 git init |
git : 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 |
Git 未安装,或 PATH 环境变量未配置正确 | 重新安装 Git,并在安装时选择 “Git from the command line” 选项;装好后重开终端 |
Please tell me who you are |
没有配置用户名和邮箱 | 执行 git config --global user.name "名字" 和 git config --global user.email "邮箱" |
fatal: refusing to merge unrelated histories |
两个仓库没有共同的历史记录,常见于把两套互不相关的项目强行合并 | 如果确认要合并,执行 git pull origin main --allow-unrelated-histories;不确定则先问清楚 |
| 中文文件名显示成乱码 | 未开启 Git 的 UTF-8 支持 | 在 Git Bash 中执行 git config --global core.quotepath false,再执行 git status 就能正常显示中文了 |
remote: Repository not found |
仓库地址不存在,或没有该仓库的访问权限 | 用浏览器打开远程地址确认仓库是否存在,再检查账号权限 |
| push 被拒绝(non-fast-forward) | 远程有其他同事推送了新提交,你的本地落后 | 先 git pull 合并远程更新,再重新 git push |
LF will be replaced by CRLF |
行尾符号的跨平台转换提示 | 这是正常提示,不是错误。保持默认配置即可,一般无需处理 |
6.2 一个容易忽略但其实很重要的细节:不要轻易自行删 .git 目录
有的朋友遇到 Git 卡死、状态混乱、或者某些命令怎么都不对,第一反应是把 .git 文件夹删了重新 git init。这个操作确实能“解决”眼前问题,但是代价是所有历史记录全部消失——所有提交、所有分支、所有记录都归零。
我的建议是:除非这个项目刚创建、完全没有历史提交,并且你确定这些改动都不重要,否则绝对不要这么做。遇到问题请先查资料、问同事,或者把问题贴出来让大家帮忙看看。Git 是一个设计得很好的工具,大多数问题都有安全、体面的解决方案,完全不需要用“删库重来”这种粗暴手段。
6.3 我踩过的坑与长期心得
说一下我个人的体会。早期我带过一个朋友,他在本地折腾了一下午,最后把 .git 删了重来,导致我帮他 review 的那些提交记录全没了,只能从零开始对比。从那次之后我再教新人,一定会反复强调三件事:
第一,提交信息永远写清楚。 这是对自己负责,也是对将来接手你代码的人负责。好的提交信息意味着一条清晰的历史线索,能大幅降低排查 bug 的时间成本。
第二,别怕分支,日常试着多用分支。 哪怕是你一个人维护的小项目,也可以用 git checkout -b dev-xxx 开一个功能分支,稳定后再合入 main。这能让你养成好习惯,将来团队协作时你会非常庆幸自己有这个习惯。
第三,遇到报错先把报错完整读三遍。 绝大多数 Git 报错信息已经给出了明确的方向,很多时候问题根本不是 git 本身,而是分支不对、远程权限不对、或者目录不在仓库里。
7. 写给朋友的实战建议:从第一行命令到形成肌肉记忆
7.1 去努力“理解”,而不是“背诵”
Git 支持的命令非常多,网上教程列出一大堆,容易让人产生畏难情绪。但实际工作中常用的就是那么十几个。与其把所有命令都背下来,不如把原理吃透——理解了“工作区、暂存区、版本库”的关系,你就会明白为什么 git add 之后还要 git commit;理解了分支的本质是“平行世界”,你就不会在切换分支时手忙脚乱。原理通了,命令就是顺理成章的事情。
我推荐你安排一次半小时的“刻意练习”:自己建一个临时文件夹,执行 git init,然后创建几个文本文件,依次执行 git add、git commit、git checkout -b、修改文件、切换分支、git merge、git reset。全程只用命令行,强迫自己不看图形界面,一小时下来你会发现自己对 Git 的掌控感有了质的飞跃。
7.2 建议用命令行入门,图形工具作为辅助
很多新人喜欢用 TortoiseGit(小乌龟)这类图形化工具,因为它们看起来更“友好”。但我的真实心得是:如果你真的想把 Git 用好,建议至少先把命令行操作练熟。原因有三:
第一,图形工具的操作是点点点,你很难理解每一步背后发生了什么,一旦界面上出现和预期不一样的弹窗,你往往不知道它想干什么;第二,命令行在任何环境都可用——远程服务器、云主机、别人的电脑上都可以操作,而图形工具很多情况下装都装不上;第三,命令行更高效,熟练之后一条命令完成的操作,用鼠标可能要点好几次。
当然,对纯小白来说,TortoiseGit 或 VS Code 的 Git 插件也不是不能用,它们可以作为入门辅助。但殊途同归,最终你的理解深度决定了你遇到问题时的自救能力。
7.3 把“Git 帮我们做了什么”牢牢记在心里
经常有朋友问我,学 Git 是不是背命令就好了?我的回答一直是:你真正要学习的不是命令本身,而是 Git 的思维模式——版本管理思维、分支协作思维、回滚安全思维。一旦形成了这种思维,哪怕有一天出现了新的版本管理工具,你也能很快上手,因为底层逻辑相通。
在这些年帮同事、帮朋友排查 Git 问题的经历中,我最大的感受是:大多数“疑难杂症”其实都是基础概念不牢导致的连锁反应。 只要你把流程走顺、理解核心概念、养成每次操作前看一眼 git status 的习惯,10 次里有 8 次的 Git 焦虑都可以直接避免。
最后分享一个小技巧:如果你实在不确定一个命令会不会有副作用,先查 git help 命令名 看官方说明,或者在测试仓库里试一遍再上真实项目。就算搞砸了也无所谓——在 Git 的世界里,绝大部分失误都还有后悔药吃。这也是这门工具教给我的另一件事:留好退路,大胆尝试。
