1. 写给第一次用Git的朋友:这篇教程是怎么来的
大概一个月前,我一个关系特别好的朋友转行做前端,第一天上班就被同事甩了一句“你把代码push一下”。他当时整个人是懵的,跑过来问我:push是啥?代码怎么push?我是不是按了个回车就完事了?
我本来想甩给他一堆官方文档,后来想了想,当年我学Git的时候,被那些术语折磨得够呛——工作区、暂存区、版本库、HEAD、远程分支……名词一个接一个,每个字都认识,连在一起就是看不懂。所以这次我决定换一种方式,用最直白的大白话,给好朋友写一份真正能上手的Git基础操作指南。
这篇教程的目标读者非常明确:完全没接触过Git的纯新手,或者是那种“只会clone和commit,一遇到报错就慌”的半新手。内容覆盖从安装配置、最常用命令、到常见报错排查的完整流程。如果你恰好也是这个阶段,那这篇就是为你写的。
先说清楚Git到底是干嘛的。你可以把Git想象成一个极其严格的“存档管家”,你每完成一个小阶段,就跟它说“帮我存个档”,它就把当前所有文件的状态记下来。以后任何时候,你都可以回到任何一个存档点。多人协作时,每个人都在自己的电脑上改代码,最后把改动合并到一起,Git保证这个过程不混乱、不丢东西。
学Git不需要什么高深基础,只要你:
- 会打开终端(Windows上的cmd、PowerShell,或者Mac的Terminal)
- 知道cd、dir/ls这几个最基础的目录操作命令
- 有要管理的项目文件夹,哪怕是写几篇Markdown笔记也行
满足这三条,你就能跟我朋友一样,花一晚上把这篇内容里的东西全学会,第二天上班就能用上。我写这篇的时候特别控制篇幅,每个命令只讲“它干什么、什么时候用、最容易踩什么坑”,把那些花哨但平时用不到的高级操作全部砍掉,只留刚需。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Git安装与环境配置:先把“地基”打牢
2.1 Windows和macOS下的安装步骤
我知道很多人一上来就想敲命令,但Git没装好,后面全是白搭。这里直接给出两个主流系统的安装方法。
Windows用户,去Git官网下载安装包,下载的时候注意选择对应系统版本(64位就选64-bit)。安装过程一路Next默认选项即可,但有一步需要注意:默认编辑器建议保留Vim,虽然Vim用起来不友好,但新手阶段你基本碰不到需要打开编辑器的情况,等以后熟悉了再改成VS Code也不迟。
还有一步是调整PATH环境变量的选项,默认的“Git from the command line and also from 3rd-party software”就是对的,千万别改成“Use Git and optional Unix tools from Command Prompt”,那样会把系统自带的某些命令覆盖掉,容易引出奇怪的问题。
macOS用户就简单多了,如果你装了Homebrew,一行命令搞定:
bash复制brew install git
没装Homebrew也没关系,直接去官网下载pkg安装包,双击安装就行。安装完之后,在终端里验证一下:
bash复制git --version
能输出类似 git version 2.39.2 这样的版本号,就说明安装成功了。
2.2 全局配置:改用户名和邮箱,不给GitHub/GitLab添乱
装完Git第一件事不是急着clone代码,而是先告诉Git“你是谁”。Git在提交(commit)的时候,会把你的用户名和邮箱写进提交记录里。如果没配置或者配错了,你的提交记录会显示成一堆乱码名字,同事看了都想打人。
打开终端,执行以下两条命令:
bash复制git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
注意两点。一是--global这个参数,意思是这台机器上所有仓库都用这个身份。如果你在不同平台有不同的身份(比如公司GitLab一个号,GitHub另一个号),那就不加--global,到具体某个仓库目录下单独设置,这样这个仓库里就只认当前目录下的配置。
二是用户名建议用拼音或英文,不要太长也不要带空格。邮箱就填你注册代码平台时用的那个邮箱,这样别人看到你的提交记录才能点进你的主页。
配置完之后,可以用下面这条命令查看当前配置是否生效:
bash复制git config --list
看到user.name和user.email都正确输出了,就说明配置成功。这个步骤虽然简单,但我见过太多新手跳过去,结果每次提交都要手动输入身份信息,甚至提交失败,非常耽误事。
2.3 SSH免密配置:告别每次输入密码的折磨
在讲SSH配置之前说一个很多新手会混淆的地方,Git操作远程仓库有两种常见的方式:HTTPS和SSH。
HTTPS的地址长这样:https://github.com/yourname/repo.git,每次push和pull都可能要输入用户名密码(有些平台支持缓存,有的则很烦)。
SSH的地址长这样:git@github.com:yourname/repo.git,配置好密钥之后,push和pull都不需要输密码,体验好得多。
所以我的建议很直接,新手也推荐用SSH,几分钟配置好,后面一劳永逸。
第一步,在终端里生成密钥:
bash复制ssh-keygen -t rsa -b 4096 -C "你的邮箱"
回车之后它会问你要把密钥保存在哪里,直接回车用默认路径就行。接着会让你设置一个passphrase(口令),这一步可以直接留空连续回车两次,就不用每次使用都输入口令。
第二步,查看公钥内容:
bash复制cat ~/.ssh/id_rsa.pub
Windows用户可能是 cat C:\Users\你的用户名\.ssh\id_rsa.pub。终端会输出一串以 ssh-rsa 开头的长字符串,把这串东西整个复制。
第三步,登录你的GitHub或GitLab,找到Settings(设置)里的SSH Keys选项,把刚才复制的内容粘贴进去,保存即可。
你可以测试一下是否配置成功(GitHub为例):
bash复制ssh -T git@github.com
如果是GitLab,就把地址换成对应的。运气好的话会看到一句欢迎信息,比如 Hi yourname! You've successfully authenticated。看到这句话,就说明你的免密配置已经完成了,之后clone和push再也不用输密码。
注意:私钥文件
id_rsa千万不要泄露给任何人,也不要上传到代码仓库。公钥可以随便给,私钥一旦丢了,就相当于把你的代码仓库大门钥匙丢了。
3. 核心操作篇:从一个空文件夹到第一次推送,完整走一遍
3.1 初始化仓库与第一个commit
好,从这一节开始我带你做一个完整的小实验。你随便建一个文件夹,名字叫my-first-git-project,然后在终端里进到这个目录:
bash复制cd my-first-git-project
在这个目录里新建一个文本文件,比如hello.txt,里面随便写点内容,比如“Hello Git”。
现在在终端里执行:
bash复制git init
这行命令的含义是,把当前文件夹变成一个Git仓库。执行完之后,这个目录下会多出一个隐藏的.git文件夹,所有版本信息都存在这里面。如果你哪天想把项目退回成普通文件夹,把这个.git删掉就行。
接下来重新认识一下提交的流程。我朋友第一次用Git的时候,以为“提交”就是直接敲一下git commit就完事了。实际上Git把提交拆成了两步:先把文件放进“暂存区”(staging area),再把暂存区里的内容正式提交成“版本”。
为什么要搞两个步骤?因为有时候你一个文件夹里可能同时改了好几个文件,但你只想把其中一部分提交成版本,另一部分还没写完先不提交。暂存区就像一个购物车,你可以慢慢挑想买的东西放进车里,最后统一结账。
第一步,把hello.txt放进暂存区:
bash复制git add hello.txt
如果你想把所有改动都加进去,可以直接用:
bash复制git add .
这个点号表示“当前目录下所有改动”。新手用git add .比较省心,但要注意,如果项目里有不该提交的文件(比如密钥、临时文件),得提前处理,后面会说。
第二步,正式提交:
bash复制git commit -m "first commit: add hello.txt"
-m参数后面跟的是提交说明,是给这次提交写的留言。留言建议写清楚这次做了什么改动,不要写“update”“修改”这种含糊的话,因为你三个月之后回来看日志,连自己当初改了啥都记不住。
敲完回车,如果看到类似 [main (root-commit) 8a3d4f2] first commit: add hello.txt 的信息,恭喜你,第一个版本已经创建成功了。
3.2 git status和git log:随时掌握仓库状态
在工作中你不可能记得住每一个文件的状态,所以Git提供了两个高频命令让你随时查看“现在到底什么情况”。
git status 查看当前工作区状态。它能告诉你:哪些文件被修改了、哪些文件还没被跟踪、哪些已经放进暂存区了。我自己的习惯是,每次准备commit之前,先跑一下git status,确认我没有漏掉文件也没有多放文件,再执行提交。
git log 查看提交历史。它会列出这个仓库里所有提交记录,每条记录有版本号(一串很长的十六进制字符)、提交人、提交时间和提交说明。新手的版本号不需要全背下来,看前几位就能区分。
bash复制git log --oneline
这个命令会把每条提交压成一行显示,只显示短版本号和提交说明,看起来特别清爽。我平时用最多的是这个模式。
小技巧:如果你觉得
git log显示的内容太多,退出方法是按键盘上的q键。很多新手第一次看log被卡住不知道怎么退出,其实按q就完事了。
3.3 远程仓库:clone、push、pull一条龙
本地玩明白了,下一步就是接入远程仓库。远程仓库可以理解成一台所有人都能访问的公共服务器,你的代码备份在上面,同事也能从上面拉取代码。GitHub、GitLab、Gitee(码云)都是常见的远程托管平台。
在GitHub上新建一个仓库(Repository),名字随便起。建好之后,页面会给你一个SSH地址,类似 git@github.com:yourname/my-first-git-project.git。
接下来把本地的代码和远程仓库关联起来:
bash复制git remote add origin git@github.com:yourname/my-first-git-project.git
这里的origin是远程仓库的默认别名,你自己起的“小名”。你可以有很多个远程仓库,分别起不同名字,但习惯上第一个都叫origin。
然后推送到远程:
bash复制git push -u origin main
这里拆解一下。push是推送的意思;origin是远程仓库名;main是当前分支名(2020年之后GitHub新仓库默认分支是main,之前是master)。-u参数的意思是,把本地main分支和远程main分支建立关联,这样以后你只需要敲git push或git pull,Git就能自动匹配到对应的远程分支,不用再写全了。
如果现在你在另一台电脑或者服务器上,需要把远程仓库的代码拉下来,用clone命令:
bash复制git clone git@github.com:yourname/my-first-git-project.git
这个命令会自动把远程代码复制到本地,并且帮你初始化好Git仓库和远程关联。也就是说,如果是新机器上基于远程代码开始工作,不需要git init,直接clone。
那日常在别人改过的代码上继续工作,怎么把远程最新的改动拉下来?用pull:
bash复制git pull
pull的作用是,把远程仓库的最新提交拉到你本地并自动合并。记住一个黄金规则:在你准备push之前,先pull一次,把队友的最新改动拉下来,确保你的代码是基于最新版本改的,这样可以省掉大量合并冲突的麻烦。
4. 分支操作与多人协作基础:让代码管理不再一团乱麻
4.1 为什么需要分支?类比帮你秒懂
我在教我朋友分支概念的时候,用了这样一个类比:分支就像是开了多条平行的时间线,你在一条时间线上改东西,不影响其他时间线。
举一个实际的例子,假设你们团队在维护一个已经上线的项目,所有人都能在main分支上提交代码。某天产品经理跑过来说,要新做一个会员功能。如果你直接在main上写新功能,万一写了一半发现这里有问题、那里有bug,上线的代码也被你搞得一团糟,同事拉代码下来全都坏了。
正确的做法是:从main拉一个新分支,比如叫feature/member,然后在这个分支里干活。等代码写完、测试通过了,再把feature/member合并回main。整个过程,main一直保持稳定可运行的状态。
4.2 创建、切换与合并分支
创建并切换到一个新分支,最常用的命令是:
bash复制git checkout -b feature/member
这个命令是两条命令的合体:
git branch feature/member创建新分支git checkout feature/member切换到新分支
如果你想分步做,也可以拆开执行。想看一下当前仓库有哪些分支,以及当前在哪个分支上:
bash复制git branch
当前所在分支前面会有一个*号标记。切回主分支:
bash复制git checkout main
在feature/member分支上工作一段时间后,代码写好了,确认没问题了,准备合并回main。步骤是:先切回main分支,然后执行合并:
bash复制git checkout main
git merge feature/member
这里的merge就是把指定分支(feature/member)合并到当前分支(main)上。合并成功说明这条分支的内容已经合入主线,如果要清理掉已合并的分支,可以执行:
bash复制git branch -d feature/member
这是删除分支的命令,-d会检查分支是否已合并,未合并的分支它会拒绝删除,防止你误删工作成果。
4.3 冲突是怎么产生的,以及最简单的解决办法
合并冲突(merge conflict)是新手最害怕的问题,我在带新人的时候发现,十个有九个遇到冲突就慌。冲突本身不可怕,Git会明确告诉你哪些文件冲突了,你只需要手动解决即可。
冲突产生的场景很简单:你和同事都修改了同一个文件的同一行代码。你在分支A改了这一行,同事在分支B也改了这一行,当你把两个分支合并时,Git不知道到底该听谁的,于是把两个版本都保留下来,让你来“裁决”。
如果发生了冲突,执行git merge后终端会提示你类似这样的信息:
code复制CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
这时候你用编辑器打开那个冲突文件,会看到类似这样的内容:
code复制<<<<<<< HEAD
我的版本内容
=======
同事的版本内容
>>>>>>> feature/member
<<<<<<< HEAD到=======之间的是当前分支(你正在合并到的分支)的内容,=======到>>>>>>> feature/member之间的是被合并分支的内容。你需要手动决定保留哪边,或者两边都要,把不需要的删掉,并把这四行标记符号(<<<<<<<、=======、>>>>>>>)整个删除。
处理完之后,保存文件,然后正常执行:
bash复制git add hello.txt
git commit -m "resolve merge conflict in hello.txt"
注意,合并冲突后的提交,不需要再指定-m,因为Git已经预先填好了一条合并说明,但如果你想重新写也可以。到这里,冲突就算解决完毕了。
重要心得:解决冲突最怕的是“合完了就跑”。合并前确认代码逻辑,合并后务必跑一遍测试。我见过太多人解决冲突时删掉了别人的关键代码,导致线上事故的。宁可多花十分钟测试,也不要留隐患。
5. 那些“疑难杂症”高频场景:面试级防坑指南
5.1 commit信息写错了怎么办?git commit --amend
相信每个用Git的人都干过这件事:commit之后才发现提交信息打错了一个字,或者忘了把某个文件加进去。不需要慌,有个补救命令:
bash复制git commit --amend -m "正确的提交信息"
这个命令的作用是,修改最近一次提交的信息。它会把你最后一次commit“替换”成一条新的commit,版本号也会跟着变。如果只是想补充文件进去,可以先git add漏掉的文件,再执行:
bash复制git commit --amend --no-edit
--no-edit的意思是,沿用原来的提交信息不重新编辑。
但是这里有一个特别重要的提醒:amend只适合修改“还没有推送过的本地提交”。如果你已经把这条commit推送到远程了,别人可能已经拉取了这条记录,你再amend改写历史,会导致大家的本地和远程不一致。所以我的原则是:本地未推送的commit,随便改;已经push的,老老实实重新提交一条新的。
5.2 刚才commit的文件有问题,想撤销怎么办
这是另一个高频场景:刚commit完就发现代码有bug,或者文件根本不该提交。针对不同情况,方案也不同:
如果我commit之后还没push,想回退到上一个版本,把这条commit撤销掉,用:
bash复制git reset --soft HEAD~1
HEAD是当前所在版本,HEAD~1表示上一个版本。--soft的意思是保留改动,只是移除了commit记录。也就是说,改动的文件还在暂存区,你可以重新调整后再提交。
如果想让改动完全从暂存区撤回到工作区(文件本身还是保留的,只是状态变成“已修改未暂存”),用:
bash复制git reset HEAD~1
不带--soft的混合reset会把暂存区的文件状态也重置掉。
如果某个文件彻底不想要了,想放弃所有修改回到最近一次提交的状态,用:
bash复制git restore <文件名>
这里要注意,restore会把你对文件的所有未提交修改全部丢弃,而且这个过程不可恢复。所以我在教新人的时候反复强调:restore之前一定要想清楚,或者先备份一下文件内容。宁可慢一点,不要冲动操作把写了几天的代码搞丢。
5.3 远程和本地不一致:pull被拒绝的经典解法
我朋友第一次用Git就遇到了这个问题,他在本地commit完,准备push,结果终端提示:
code复制! [rejected] main -> main (fetch first)
error: failed to push some refs
原因几乎永远是同一个:远程仓库有新提交,但你本地没有拉取。Git为了安全,拒绝你把基于旧版本的代码直接推上去,怕你把别人的修改覆盖掉。
解决办法很简单:
bash复制git pull
先拉取远程更新,再回头看有没有冲突。如果有冲突,按前面第四节讲的方法解决冲突,然后重新提交、再push。如果远程更新和你的本地改动一点关系都没有,pull会直接自动合并成功,然后你再push就顺理成章了。
如果pull的时候报错说“unrelated histories”(无关历史),这通常发生在两个本来不是从同一个起点来的仓库强行合并的情况。如果你确认没问题,加上--allow-unrelated-histories参数强制合并:
bash复制git pull origin main --allow-unrelated-histories
不过这个参数我一般不建议新手用,因为它会让Git把两个完全不相干的版本历史强行拼接在一起,容易产生混乱。能用正常方式解决就尽量别碰。
5.4 黄颜色文件警告:换行符引发的烦恼
Windows用户第一次提交时,可能会看到一大片黄颜色的文件警告,内容类似:
code复制warning: LF will be replaced by CRLF in hello.txt.
这个其实不用紧张,不是错误,只是换行符格式提醒。简单说,Windows系统文本默认用CRLF表示换行,Linux/macOS用LF,Git为了让跨平台协作不混乱,会在提交时自动把换行符转换一下。你什么都不用做,忽略就好。如果真想彻底不看到这个警告,可以在用户目录下创建一个.gitattributes文件并在里面指定换行规则,但这是进阶话题,新手阶段建议直接忽略。
5.5 fatal: not a git repository
在目录下执行Git命令时,如果终端报:
code复制fatal: not a git repository (or any of the parent directories): .git
意思是你当前所在目录不是一个Git仓库,或者它不属于任何Git仓库的子目录。最常见的几种情况:
- 你压根没在这个目录执行过
git init或git clone - 你不小心cd到了
.git文件夹里面(是的,有人真会这样) - 你进入了一个新建的还没初始化的子文件夹
解决办法也明确:要么先执行git init把当前目录变成仓库,要么先确认你要操作的代码在哪个目录,然后cd过去。
5.6 git无法识别,命令行报“无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”
这个报错在Windows PowerShell或CMD里极其常见,几乎每天都有新手问。原因很单纯:Git没安装成功,或者安装成功了但系统PATH环境变量没配置好。
我的排查顺序是这样的:
- 在开始菜单里找“Git Bash”,如果能打开Git Bash,说明Git本体装好了,只是Windows命令行工具没识别到。这种情况,去系统环境变量设置里,把Git的
cmd目录路径(一般类似C:\Program Files\Git\cmd)加到PATH里,然后重新打开终端。 - 如果连Git Bash都打不开,说明安装可能出问题了,直接卸载重装Git。
- 还有一个高频低级错误:终端窗口是在安装Git之前打开的,装完之后没有关闭终端再重开。新装的环境变量需要重启终端才能生效,先关掉终端再打开一次试试。
6. 给小白的日常建议:先背熟一套命令,再去追求花活
写了这么多,我想在最后单独说一点掏心窝的话。
我朋友在学完这篇文章之后,第二天到公司就遇到了新问题——他记不住这么多命令,总是需要一边查一边敲。我跟他说,这很正常,谁都不可能一天把所有Git命令背下来。你只需要把下面这套“最小可用命令集”练到肌肉记忆就行:
bash复制git status # 查看状态,迷茫时先敲这个
git add . # 暂存所有改动
git commit -m "说明" # 提交成一个版本
git pull # 推送前拉取最新
git push # 推送到远程
git log --oneline # 查看历史记录
git checkout -b 分支名 # 创建并切换分支
这七条命令,覆盖了个人开发场景下95%的需求。等你哪一天熟练了,自然会开始接触更进阶的stash(临时藏起改动)、rebase(变基)、cherry-pick(挑拣提交)这些操作。但在我带新人的经验里,基础命令用得好的人,往往比那些花里胡哨命令知道一堆却总出乱子的人,靠谱得多。
另外还有一个小建议:不要害怕搞坏仓库。Git的最大好处就是几乎所有操作都是可逆的,哪怕你把文件删了、commit搞乱了、分支弄没了,搜索引擎搜一下基本都能找回。所以我鼓励你大胆去试、大胆去练,练的过程中踩过的坑,都是最值钱的经验。
我的Git入门笔记到这里就写完了。如果这篇文章帮你解决了问题,或者你在操作过程中遇到了什么我上面没写到的报错,欢迎按你自己的经验补充总结——教别人,是巩固自己掌握程度的最高效方式。
