说句实话,我见过太多新手(包括当年的我自己)卡在同一个地方:本地Git装好了,Gitee仓库也建好了,结果准备推代码的时候,SSH公钥这一步直接把人整自闭。命令行一跑就是Permission denied (publickey),或者每次push都要输一遍用户名密码,烦到想把电脑扔出窗外。
所以今天这篇就专门聊一条最完整的链路:Git基础学习之Gitee的使用和设置SSH公钥。从装Git开始,到注册Gitee、建仓库、生成密钥、配公钥、推代码、克隆项目,最后再把新手最容易踩的坑挨个列出来。全程都在讲怎么落地,适合刚接触版本控制的新手,也适合以前只会用“绿色对勾工具”上传下载、现在想真正搞懂底层原理的同学。文章里所有命令我都会解释它是干什么的、为什么要这么写,保证你看完能自己独立操作一遍,而不是照抄完就忘。
1. 先搞清楚我们要搭一套什么体系
1.1 Git、Gitee和SSH各自扮演什么角色
很多新手一上来就急着敲命令,结果Git、Gitee、SSH这三个东西到底各管哪一段,完全没概念。这就像你要装修房子,但不清楚谁是设计师、谁是施工队、谁是物业。先把角色理顺,后面所有操作都会有画面感。
Git是一个分布式版本控制工具,它可以记录你对项目的每一次修改,想回到哪个历史版本就回到哪个版本。它在你电脑本地就能工作,不依赖网盘或者服务器。我用一个很朴素的类比:Git就像是你写论文时的“历史版本管理器”,每次保存都会生成一个快照,哪天发现写崩了可以随时回退到之前的任何快照。和SVN这种老牌集中式版本控制不一样,Git的每个本地仓库都保存着完整历史,你坐高铁没网也能commit,等有网了再push上去。
Gitee是一个基于Git的代码托管平台,你可以把本地仓库推送到Gitee上,这样代码就有一个云端备份,别人也能通过它协作、评审、提Issue。它本质上就是给Git这辆“跑车”铺了一条高速公路。为什么要用托管平台?因为只有你本地一份代码,硬盘坏了就全没了;只想把代码收在本地不上传,那当然也行,但你要协作、要备份、要让同事拉你的代码,Gitee这种平台就是刚需。
SSH公钥是Gitee用来识别“你是不是你”的一把钥匙。它由一对密钥组成:公钥放在Gitee账号里,私钥留在你自己电脑上。当你执行git push时,Git会用私钥“签名”,Gitee拿你的公钥去验证签名是否匹配,验证通过就放行。整个过程不需要你手动输入账号密码,所以也叫免密配置。这就是为什么设置SSH公钥是“一劳永逸”的操作——配一次,以后这台电脑上所有和Gitee的交互都不用再输密码了。
1.2 为什么选Gitee而不是别的平台
我知道很多教程上来就说GitHub,但对国内新手来说,Gitee有几个非常现实的优点。
第一,访问速度快。Gitee服务器在境内,git clone和git push的速率明显比海外平台更舒服。你总不想拉个开源项目还坐等转圈吧。第二,中文界面,对英文不好的朋友相当友好。菜单上写的是“仓库”“克隆/下载”“提Issue”,几乎不用查字典。第三,Gitee同样支持免费私有仓库,个人练习或者公司内部小项目都很合适。第四,Gitee本身也提供了开源许可证模板、CI/CD、静态Pages托管等服务,一个平台基本能覆盖学习和轻量部署的需求。
更关键的一点是,Gitee的操作方式和GitHub几乎一致。你只要在Gitee上把SSH公钥、仓库创建、分支推送这一套流程跑通,切到GitHub或者GitLab时几乎零成本迁移,命令照样跑,只是域名和账号变了。所以这篇虽然以Gitee为例,但你实际练会的是通用的Git操作能力。
2. 环境准备:装好Git,配好“名片”
2.1 Windows下Git安装详细步骤
我以Windows系统为例,这是大多数新手使用的环境。Git官网在git-scm.com可以直接下载,如果下载速度很慢,可以去国内一些高校的开源软件站找Git for Windows的安装包,找最新版本下载即可。
安装包点击后一路Next一般也能用,但我建议安装过程中留意几个关键选项,别全程无脑点默认。
第一,选择编辑器。新版Git安装时会让选默认文本编辑器,默认是Vim。对完全没用过Vim的新手来说,不小心进了git commit的编辑界面会卡在里面出不来,那种体验很绝望。所以你在安装时可以把默认编辑器改成Notepad++、VS Code或者Sublime这类自己熟悉的编辑器。安装完成后也可以在命令行里用git config --global core.editor "code --wait"把编辑器改为VS Code。
第二,调整PATH环境变量。安装界面会问怎么用Git命令,有“仅从Git Bash使用Git”“从命令行以及第三方软件使用Git”等选项。这里务必选中间那个“Git from the command line and also from 3rd-party software”。这样你打开Windows自带的CMD或PowerShell都能直接用git命令,也能让IDEA、VS Code等开发工具正确找到Git。
第三,换行符处理。安装时会问你Checkout Windows-style, commit Unix-style line endings还是别的。默认选项就是为跨平台协作设计的,能自动处理CRLF和LF的转换,一般不用改动,直接下一步。
安装完成后,在任意文件夹按住Shift键点击鼠标右键,选择“在终端中打开”或打开Git Bash,输入git --version,如果能输出版本号,说明安装成功。
提示:很多人装完Git后在PowerShell里输入git,系统提示“无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,多半是刚才PATH那个选项选错了,或者安装完没有重新打开终端。重装一次选中间选项,或者重启终端再试即可。
2.2 配置用户名和邮箱:不配这个,提交记录就是无名氏
Git安装好之后,还有一个很容易被新手无视的步骤——配置全局用户名和邮箱。不要跳过,因为每次git commit时,Git都会把这两项信息写入提交记录里。如果没配置,提交时会直接报错或者显示一堆奇怪的默认值,团队协作时根本看不出是谁改的代码。
打开Git Bash,执行下面两行:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"这里的名字和邮箱不一定非要和Gitee账号一致,但强烈建议保持一致,这样你在Gitee上的提交记录能正确关联到账号头像和主页。邮箱建议填真实常用邮箱,因为如果以后参与开源项目,这个邮箱会被公开在提交历史里。
配置完之后可以用git config --list查看当前所有配置,确认写进去了。如果你在某个项目里需要临时用不同的身份提交代码,可以去掉--global在该仓库目录下重新配置一份,这个局部配置会覆盖全局配置,按项目区分身份。
2.3 Git自带的辅助工具:Git Bash和Git GUI
装完Git后,开始菜单里会出现Git Bash、Git GUI和Git CMD等几个入口。很多新手会疑惑该用哪个,这里统一说明一下。
Git Bash是Windows上一个模拟Linux命令行的环境,很多教程里的命令都是以它为基础写的。强烈建议你在学习阶段坚持用Git Bash,因为网上查到的资料、官方文档里的命令绝大多数都是Linux风格,用Git Bash执行会比较一致。而且它支持ls、cat、grep这些常用命令,体验比CMD舒服太多。
Git GUI是一个简单的可视化界面,可以完成提交、暂存、查看历史这些基本操作。新手想快速用图形界面入门可以试试,但它对理解Git工作流帮助有限,我更建议先学会命令行,图形工具作为辅助。顺便提一句,网上常见的“小乌龟”TortoiseGit是Windows下另一个图形化Git客户端,它会在资源管理器右键菜单里集成各种Git操作,习惯Windows操作的人可能会喜欢,但它默认不会帮你理解Git底层的逻辑,所以我更推荐新手优先掌握前面说的命令行基础。
3. 在Gitee上注册账号、创建远程仓库
3.1 注册账号与基本设置
打开Gitee官网,点击注册,用户需要填手机号或邮箱,设置用户名和密码。这里有个容易被忽略的点:用户名注册之后一般不能随便改,而且它会出现在你的仓库地址里,比如git@gitee.com:用户名/仓库名.git,所以最好想一个简短、专业、好记的名字,别用那些非主流符号或者一长串乱七八糟的数字。
注册完成后建议把个人资料补充一下,绑定一个真实邮箱。因为之后你在本地用git config配置的邮箱如果和Gitee账号邮箱对不上,推送代码虽然能成功,但Gitee网页端会认为这个提交来自陌生作者,不关联到你的账号头像,看起来就像别人替你提交一样。这个细节虽然不影响代码功能,但影响使用体验。
3.2 新建仓库时那些选项是什么含义
在Gitee首页右上角点击“新建仓库”,会进入仓库设置页面。这里有几个字段,每一个都值得说明白。
仓库名称就是你项目叫啥,建议用英文、短横线或者下划线连接,不要用空格。路径是自动根据仓库名称生成的,也会出现在克隆地址里,如果能自己改的话建议保持简短。仓库名称和路径的关系有点像你给文件夹起名和它的实际路径的关系,路径最好简短,因为每次git输入地址时都要敲。
接着是仓库是否开源。私有仓库只有你和被你添加的成员能看到,适合练习和公司项目。公开仓库所有人可见,适合开源。如果是学习阶段练手,建议选私有,不丢人也不麻烦。以后想开源了可以在仓库设置里改为公开,但公开仓库改回私有会比较麻烦,所以一开始不用着急选公开。
然后是“初始化仓库”这一块,有三个勾选项:README、.gitignore、开源许可证。
README文件是项目的说明文档,会显示在仓库首页。小项目建议勾上,它可以让你一打开仓库页面就看到项目介绍。.gitignore文件是告诉Git哪些文件不需要纳入版本管理,比如编译产物、日志、IDE配置等。Gitee提供了一堆模板供选择,你如果项目类型清楚就直接选对应模板,比如Java项目选Java,Python项目选Python。开源许可证这个很多人看着就懵,简单说它声明了别人能不能用你的代码、怎么用。个人学习项目其实可以暂时不选,如果以后想开源,我一般建议按这个逻辑选:
| 许可证 | 通俗理解 | 适合场景 |
|---|---|---|
| MIT | 别人拿走用、改、分发都行,基本没限制,但出了问题别找你 | 想让大家随便用,最低门槛 |
| Apache 2.0 | 可以商用、修改,但要保留版权声明,并对专利有明确授权说明 | 项目希望被企业采用时 |
| GPL-3.0 | 别人用了你的代码,那他的代码也得开源 | 想强制别人也开源时 |
新手第一次建仓库,我推荐先选MIT或者不选,别因为纠结许可证卡住。仓库创建成功之后,你会看到一个初始页面,里面代码区、Issues、Pull Requests、Wiki、统计等标签都在。右上角那个“克隆/下载”按钮是最常用的,点击之后会弹出两种地址:HTTPS地址和SSH地址。HTTPS地址形如https://gitee.com/用户名/仓库名.git,SSH地址形如git@gitee.com:用户名/仓库名.git,这就是你之后要和本地仓库关联的远程地址。
4. 设置SSH公钥:从每次输密码到一劳永逸
4.1 SSH公钥的工作原理
这章是整个标题里的题眼,我多花点篇幅讲透。很多人知道要配置SSH公钥,但不知道为什么要配,配了之后为什么就不用输密码了。
SSH是一种安全远程登录协议,它采用的是非对称加密。所谓非对称,就是它会生成一对密钥:一把公钥和一把私钥。公钥是锁,私钥是钥匙。你可以随便把公钥放到任何服务器上,但它只能用来验证,不能反推私钥。私钥则必须牢牢保存在你自己的电脑上,永远不要发给别人,也不要传到网上。
当你的Git客户端第一次连接Gitee时,Gitee会检查你的SSH连接是否带有对应私钥的签名,验证通过后,之后这个连接的通道就被视为可信。当你执行git push时,Git会拿着私钥做认证,Gitee用你账号下留存的公钥来确认,确认通过之后就直接允许推送,不再询问账号密码。这就是SSH免密的核心原理。
那么SSH和HTTPS到底选哪个?很多新手上传代码时两个地址都能用,搞不清楚区别。我把差异整理成一张表:
| 对比项 | SSH方式 | HTTPS方式 |
|---|---|---|
| 验证方式 | 公钥/私钥配对 | 用户名+密码或个人访问令牌 |
| 推送隐私 | 每次操作免密 | 需要保存凭据或反复输入 |
| 地址形式 | git@gitee.com:xxx.git | https://gitee.com/xxx.git |
| 推荐场景 | 平时自己写代码推送 | 只想临时克隆开源项目 |
| 安全提示 | 私钥必须保密 | 注意别泄露密码 |
我个人的经验是:**只要你准备长期往Gitee推送代码,就配SSH公钥,绝对值得。**HTTPS也不是不能用,尤其只是克隆公开仓库时很方便,但自己项目push时每次都要输账号密码,输入令牌更是还要建一次令牌,烦得很。
4.2 在Git Bash里生成SSH密钥对
现在进入正题,打开Git Bash,执行以下命令:
ssh-keygen -t rsa -b 4096 -C "你的Gitee登录邮箱"这里稍微解释一下参数:-t rsa指定密钥类型是RSA,-b 4096指定密钥长度为4096位,比默认的2048位更难破解,-C后面的字符串相当于给密钥加了一个注释,一般填邮箱,方便以后在Gitee上认出这把钥匙是哪个设备的。
执行之后,终端会提示你保存密钥的位置,默认是C:\Users\你的用户名\.ssh\id_rsa,直接按回车使用默认位置即可。接着它会让你设置passphrase。这个passphrase是给私钥再加的一道密码,每次使用私钥时都要输入。如果你追求完全免密,直接按回车留空;如果你担心电脑被别人用,私钥会被盗走,可以设置一个passphrase,但代价就是每次连接Gitee都要输入一次这个口令。我建议个人开发机留空就行,公司的加密要求另说。
生成完成后,进入.ssh目录看一下:
ls -l ~/.ssh正常情况下能看到两个文件:id_rsa和id_rsa.pub。id_rsa就是私钥,id_rsa.pub才是公钥。注意区分,后面你要复制到Gitee的,是id_rsa.pub这个文件的全部内容。
提示:如果是Mac或者Linux环境,生成命令完全一样,目录位置一般在
/home/用户名/.ssh/。Windows用户如果习惯打开文件资源管理器,可以到C:\Users\你的用户名\.ssh\下查看,不过要开启“显示隐藏文件”才会看得到.ssh文件夹。
4.3 把公钥复制并配置到Gitee
查看公钥内容,命令如下:
cat ~/.ssh/id_rsa.pub终端会输出一串以ssh-rsa开头、以你邮箱结尾的字符串,这就是你的公钥。它是一整行,别复制漏了。
接下来,登录Gitee网页端,鼠标移到右上角头像,进入“设置”,然后左侧菜单选择“安全设置”里的“SSH公钥”。把公钥粘贴到输入框,标题随便填,比如“我的Windows电脑”,填一个你能认出来的设备名就好。然后点击添加。
添加成功后,可以在SSH公钥列表里看到这把公钥。建议你在这里清楚地命名每台设备的公钥,比如“办公室台式机”“家里的笔记本”,这样以后想吊销某台设备的访问权限时,一眼就能辨认出来。
最后一步是验证是否配置成功。回到Git Bash,输入:
ssh -T git@gitee.com第一次连接会出现询问是否信任主机,类似“Are you sure you want to continue connecting (yes/no)”,输入yes回车即可。之后如果看到“欢迎某某来到 Gitee”这样的欢迎语,说明SSH公钥已经配好了。如果看到Permission denied (publickey),说明公钥没配上或者私钥找不对,别慌,我第6章会专门讲排查方法。
4.4 多台电脑、多个账号的公钥怎么管理
有些同学既要在公司电脑上推送,又要在家里的电脑上推送,那就需要在每台电脑上分别生成自己的密钥对,然后把各自的公钥都添加到同一个Gitee账号下。这没问题,流程完全一样,后台SSH公钥列表里会有多把公钥,互不冲突。
还有一种情况是,你同时有Gitee、GitHub等好几个平台的账号,或者在一台电脑上有两个不同的Gitee账号想分别推送不同的仓库。默认情况下,Git会用同一个私钥去连接所有服务器,如果两边平台的公钥不同就麻烦。这时候可以通过SSH配置文件来指定不同域名使用不同私钥。
在~/.ssh/目录下创建一个名为config的文件(没有扩展名),写入类似这样的内容:
Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/gitee_id_rsa Host github.com HostName github.com User git IdentityFile ~/.ssh/github_id_rsa这样Git连接不同域名时就会自动挑选各自的私钥。新手如果只有一个账号,其实不需要折腾这个,但知道有这么个办法,以后遇到多账号场景就不至于一头雾水。
5. 完整实操:把本地代码推到Gitee仓库
5.1 在本地初始化仓库:工作区、暂存区、版本库
假设你已经写了一个项目文件夹,比如叫my-project,现在想把它交给Git管理并推送到Gitee。在项目文件夹里右键打开Git Bash,执行:
git init这条命令会创建一个隐藏的.git目录,意味着这个文件夹成为了一个Git仓库。可以继续用git status查看当前仓库状态。刚开始所有文件都是未跟踪(untracked)状态,Git还没有记录它们。
这里要引入Git最核心的三个概念,理解了它们,后面所有操作都顺理成章:
- 工作区:你正在写代码的那个文件夹,你能看到和编辑的所有文件。
- 暂存区:Git中一个过渡区域,相当于购物车,先把你打算提交的内容放进去。通过
git add把文件从工作区放进暂存区。 - 版本库:Git真正保存历史记录的地方。通过
git commit把暂存区的内容固化成一个历史版本。
这个机制看起来很绕,但它的好处是你可以只提交一部分文件,而不是一次性把所有改动都打包。写代码时,改了两个文件,其中一个还没改完,那你只git add另一个改完的,提交一个干净的版本,非常灵活。
执行以下两条命令,把你项目里的全部文件都加入暂存区并提交:
git add . git commit -m "第一次提交"git add .表示把当前目录下所有未跟踪和修改的文件加入暂存区。git commit后面-m参数后面写的是提交说明,这个习惯一定要养成好,说明要写清楚这次改了什么,别写“更新”“修改”这种没营养的话,以后回溯历史时你会感谢自己当时写了详细说明。
5.2 关联远程仓库并完成首次推送
现在本地仓库有了第一个提交,接下来把远程仓库地址关联到本地。回到Gitee仓库页面,点击“克隆/下载”,复制SSH地址。然后执行:
git remote add origin git@gitee.com:你的用户名/your-repo.git这里origin是为远程仓库起的默认别名,相当于说“我以后写origin就是指这个地址”。执行后可以用git remote -v查看当前仓库关联的远程地址,确认无误后就可以推送了:
git push -u origin master如果你在Gitee上创建仓库时默认分支名是main,那就把命令里的master换成main。推荐根据实际情况来,大部分新仓库现在默认分支可能是master或main,都可以。-u参数表示把本地的master分支与远程的master分支建立跟踪关系,之后你再执行git push时不加参数也能推到正确分支。
这里新手最容易遇到的第一道坎:如果Gitee仓库在创建时勾选了README或.gitignore文件,远程仓库已经有一个初始提交,而你本地也已经有了一个提交,两边历史完全没有交集,push时会被拒绝,提示类似“failed to push some refs”或“fetch first”。解决办法有几种,我建议在确认远程那几个文件是可有可无的情况下,最简单直接的方式是:
git pull --rebase origin master git push -u origin mastergit pull --rebase的意思是先把远程的提交拉下来,并把你本地的新提交“接”在远程提交的后面,让历史变成一条直线。之后再push就顺利了。如果你不想保留远程的初始文件,也可以在Gitee仓库页面把刚生成的README删掉,但更通用、更常见的做法还是pull --rebase。
推送成功后,刷新Gitee仓库页面,你会看到代码已经出现在仓库里,提交记录、文件列表一清二楚。到这个节点,你已经完成了一条完整的“本地代码上Gitee”的链路。
5.3 克隆仓库到另一台电脑或另一个目录
假如你在公司的电脑上写了代码推到了Gitee,回家之后想同步,不用手动拷贝文件,直接克隆就行。新建一个文件夹,在Git Bash里执行:
git clone git@gitee.com:你的用户名/your-repo.git这会把远程仓库整个下载到当前目录下,自动生成一个名为your-repo的文件夹,并且本地仓库自动关联好了远程origin地址,你甚至不需要再执行git remote add。克隆成功后,你已经可以用git pull拉取最新代码,修改后再git push推送。
克隆时要注意,如果你是用SSH公钥配置的那台电脑去克隆,才会有免密效果;如果换了一台没有配置公钥的机器,建议就用HTTPS地址克隆,或者先去那台机器上把公钥配置好再来用SSH方式克隆。
5.4 日常开发的标准提交节奏
写代码不是一次性推完就结束了,真正的日常是反复修改-提交-推送。我建议新手养成这样一套肌肉记忆:
git status # 查看当前改动 git add 相关文件 # 把改动加入暂存区 git commit -m "说明这次改了什么" git pull # 如果多人协作,先拉取别人改动 git push # 推送到远程git status非常重要,它不会修改任何东西,只是向你报告仓库当前状态。每次操作前先跑一下它,心里就有底了。有些新手一上来就git add .然后commit,但并不知道自己到底提交了什么,直到某次误把密码配置文件提交上去才追悔莫及,这个问题我后面会讲如何用.gitignore来避开。
如果你在IDE里操作,比如VS Code、IDEA、PyCharm,你会发现界面上的按钮本质上都在调用上面这些Git命令。比如VS Code的Git面板、IDEA的Commit和Push按钮,背后就是git add、git commit、git push这些命令的组合。有时候你在VS Code输出面板里看到一条特别长的命令,类似git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks ...,不用害怕,这只是IDE为了让Git更适配Windows环境而额外加的一些配置参数,核心操作还是那几件事。
5.5 让.gitignore和Gitee Pages成为你的帮手
关于.gitignore,我再多说两句。很多新手发现自己的项目里有一堆不该提交的文件,比如node_modules、.idea、__pycache__、编译产物、日志文件等,全都提交到了仓库里。这不但让仓库膨胀,还会拖慢克隆速度,更严重的是可能会把本地配置里的数据库密码、API Key这类信息泄露出去。
正确做法是,在项目目录下创建一个.gitignore文件,把不该提交的路径或模式写进去。比如:
node_modules/ dist/ .idea/ *.log .env改完.gitignore后,只要git add之前Git就会自动忽略这些文件。但如果你在写下.gitignore之前已经不小心提交过这些文件,那光加忽略规则还不够,因为文件已经被Git跟踪了。这时需要从Git缓存中移除它们:
git rm -r --cached node_modules git commit -m "移除误提交的node_modules并加入忽略规则" git push--cached参数的意思是只从Git版本管理中移除,不会删除你本地磁盘上的文件。这个命令我真是反复安利给身边的朋友,太多人载过“误提交敏感文件”的坑。
另外,Gitee还提供一个静态页面托管服务,叫Gitee Pages,你可以在仓库的“服务”菜单里找到入口。如果你写的项目是纯前端,比如一个HTML页面或一个前端小应用,就可以开启Gitee Pages,系统会为仓库生成一个访问地址,直接把仓库里的静态文件渲染成网页。这个功能对做个人博客、项目演示、甚至纯前端的小程序演示都很有用。虽然它和SSH公钥没什么直接关系,但作为Gitee使用过程中的一个亮点功能,非常值得你了解一下。等以后你手上有一个纯前端项目,就能体会到“代码推到Gitee后直接得到一个网站”的便利。
6. 新手高频问题和排查技巧实录
6.1 环境类问题:git命令找不到、版本不对
很多同学遇到的第一句报错是“无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。这通常发生在PowerShell或CMD里,本质上就是系统找不到git命令。原因一般有这么几个:
一个可能是安装时PATH选项选错了,导致git没被加入系统环境变量。解决办法很简单,在开始菜单里搜“编辑系统环境变量”,打开后找到“Path”变量,看看里面有没有Git的安装路径(一般是C:\Program Files\Git\cmd),没有就手动加进去。另一个可能是你已经正确安装,但安装完没有重启终端,终端还停留在旧环境变量里。关掉终端重新打开,或者干脆重启一次电脑,这个问题多半就消失了。
6.2 权限与认证问题:SSH连接失败、公钥验证不通过
**Permission denied (publickey)**是SSH公钥配置类问题里最高频的报错。遇到这个提示,按下面顺序排查:
- 先确认你添加的是公钥不是私钥,很多新手把
id_rsa的内容贴进去了,Gitee当然不认。 - 确认复制公钥时没有多复制空格或少复制字符,建议直接
cat ~/.ssh/id_rsa.pub然后整行完整复制。 - 确认生成的密钥对所在目录和Git当前使用的一致。如果电脑上多套密钥,检查
~/.ssh/config有没有被配置“拐跑”。也可以用ssh -T -p 22 git@gitee.com来直接测试。 - 确认密钥文件权限是否正常。Windows下一般没问题,但Mac/Linux下私钥文件权限如果过于开放,SSH会拒绝使用,需要执行
chmod 600 ~/.ssh/id_rsa。
还有一个常见误区是:明明用了SSH方式克隆或推送,但报错信息里地址却是https://开头。那说明你复制的克隆地址是HTTPS的,或者远程origin设置成了HTTPS地址。用git remote -v看一眼,如果不对,用git remote set-url origin git@gitee.com:用户名/仓库名.git改回来即可。
6.3 推送被拒:远程和本地历史对不上
正如前面讲的,如果远程仓库已经有初始提交而你本地是另一个独立历史,push就会报错。很多人拿到这个报错就紧张,其实解决方案就一句话:先git pull --rebase origin master把远程拉到本地,再重新push。如果你不确定远程有哪些改动,先用git fetch origin把远程分支抓下来,然后用git log origin/master --oneline查看远程提交记录,做到心里有数再合并。
另外“Everything up-to-date”这个提示也会让新手困惑,明明本地改了文件,为什么push的时候说全部是最新的?这是因为你改了工作区文件但没有git add和git commit。Git只推送已经被记录成版本的改动,你没提交,Git就认为没有新东西。这时候跑一下git status,看到红色文件列表就明白了。
6.4 提交记录写错了、误提交了怎么办
提交完了发现commit message写错了,或者发现某个文件不该提交,这非常常见。如果提交还没有推送,用:
git commit --amend -m "新的提交说明"可以修改最近一条提交的信息。如果你只是想撤销最近一次commit但保留改动,用:
git reset --soft HEAD~1这条命令会回到提交前状态,但你的文件改动都还在。如果想把改动也一起清掉,用git reset --hard HEAD~1,但这条命令会丢弃改动,新手不建议乱用,最好先确认清楚。
如果已经推送到了远程,再改本地历史就需要强推git push --force,但非常不推荐在协作项目里强推,因为会覆盖别人的提交记录。个人练手仓库你随便折腾,一旦有其他人参与,就要遵守“不要改写已推送的公共历史”这条规矩。
6.5 关于Gitee批量删库和删除文件的说明
热搜词里有“gitee批量删库”,我特意提醒一句:Gitee网页端目前没有“勾选多个仓库一键删除”的批量入口,只能一个一个进仓库管理页面删除。删除仓库是一个很重的操作,Gitee会把仓库引导到确认页面,要求你输入仓库名之类的信息,并且删除之后数据恢复很困难,官方找回流程繁琐。所以不管是删除整个仓库,还是删除仓库里的文件,操作前都先想想是不是真的需要。
如果只是想删除仓库里的某个文件,正确做法不是去网页端直接删(当然网页端也能删,但也会多一个提交),而是在本地用命令:
git rm 文件名 git commit -m "删除不需要的文件" git push如果你只是想让某个文件不再被Git跟踪,但磁盘上还要保留,那就用前面提到过的git rm --cached 文件名。这两条的区别一定要分清,误用git rm删掉本地文件而没留意后果的人我见过不少。
6.6 常见问题速查表
最后把高频问题整理成一张速查表,方便你以后遇到问题直接对照:
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| git命令找不到 | 环境变量没配好或终端未重开 | 检查PATH、重启终端 |
| Permission denied (publickey) | 公钥没配好或私钥不匹配 | 重查公钥内容与目录 |
| push被拒 | 远程和本地历史分叉 | git pull --rebase 再push |
| 每次push都要密码 | 用的HTTPS地址 | 换成SSH地址 |
| Everything up-to-date | 没有新提交 | 先git add和git commit |
| 中文文件名显示乱码 | Windows编码问题 | 设置 core.quotepath=false |
| .gitignore没生效 | 文件已被跟踪 | git rm -r --cached 再提交 |
| 误提交大文件 | 把构建产物或安装包提交了 | 从版本库删除并加入忽略规则 |
| 想改最近commit信息 | 提交说明写错 | git commit --amend |
7. 一点实操后的个人体会
最后再说几句掏心窝子的话。配置SSH公钥这件事,看起来只是“复制粘贴一把钥匙”的技术操作,但往深了想,它其实是你从“用工具”迈向“理解工具”的一道分水岭。我教过好几个零基础朋友,他们在完成“生成密钥-添加公钥-首次push成功”这个闭环后,对Git的整体理解会上一个台阶,因为在这个过程中,你接触到了远程协议、加密认证、仓库关联这些最核心的概念。
按我个人经验,新手在学习这段内容时,不必急着一次把所有功能都弄懂,抓住“本地提交三连”(status、add、commit)配合“推送两连”(pull、push)就已经能应付大多数日常工作。SSH公钥配好之后,那些曾经让你崩溃的命令行报错会越来越少,因为大部分报错归根到底就是身份认证和历史分叉两个问题。
这篇文章写到的所有命令和步骤,都是我自己在Windows、Mac环境下一遍遍敲过验证过的。如果你严格按照流程操作,大概率能一次跑通。万一中途遇到我上面没列到的问题,也不要气馁,先去git status和git remote -v里找线索,大多数时候答案就藏在命令的输出里。