先给你交个底:这篇东西不是讲那些花里胡哨的 IDE 快捷键,也不是吹 Git 命令多酷。文章的核心就一个——你在 IntelliJ IDEA 里写好的项目,怎么安全、规范、不出幺蛾子地推到 Gitee 仓库里。我会把整个流程拆开揉碎了讲,从为什么非要这么做,到每一步怎么点、命令怎么敲、报错怎么解,全部按我实际操盘的经验来。如果你是刚入门 Java、还在用 IDEA 写练习项目,或者公司要求代码统一走 Gitee 管理但没人带,那这篇文章就是给你准备的。看完你不仅能推上去,还能把日常更新、分支合并、回滚这些事都理顺。
1. 为什么非要把 IDEA 项目托管到 Gitee
1.1 只把代码放在本地,风险比你想象的大
很多人最开始写代码的习惯是:新建一个文件夹,项目丢进去,写完就完事了。运气好点的,会复制一份到 U 盘或网盘里当备份。但这种方式说白了就是听天由命——硬盘随时可能坏,系统随时可能崩,文件误删了也没地方后悔去。我自己就经历过一次惨痛的教训:大学做课设时,写了两周的代码存在 D 盘某目录下,结果室友装游戏把我整个盘给格式化,连个渣都没剩。从那时候起我就养成了一个习惯:所有值得保留的代码,必须进版本管理系统。
把项目推到 Gitee 仓库,最直接的价值就是多了一层保险。代码不在你本地吃灰了,而是在远程服务器上有一份完整副本。哪怕你电脑当场报废,换一台新机器、把仓库克隆下来,代码照样能接着写。而且 Gitee 仓库是有版本历史的,每一次提交都是一条记录,你哪天改崩了想回到之前的版本,随时都可以。
1.2 Git 和 Gitee 到底是什么关系
先把概念厘清,不然很多新手会混淆。Git 是一个版本控制工具,它跑在你自己电脑上,负责跟踪文件的每一次改动。Gitee 则是一个代码托管平台,相当于把 Git 仓库放到一台 24 小时在线的远程服务器上,方便你备份、分享,也方便团队协作。IDEA 是写代码的编辑器,Git 是管理代码版本的工具,Gitee 是存放代码的远程仓库,三个角色各司其职。
它们之间的协作关系是这样的:你在 IDEA 里改代码,改到一定程度后用 Git 打一个提交(commit),这个提交先落在你本地仓库;然后你把本地提交推送到 Gitee(push),远程仓库就有了这份记录。反过来,同事推了新代码到 Gitee,你拉下来(pull)就能看到最新版本。这套组合拳就是目前绝大多数公司团队开发的标准流程。
1.3 这套流程适合谁来用
我把话说在前头,这不是小白的专属问题。如果你的项目仅仅是本地练习、不打算跨设备,那确实可以暂时不折腾;但只要你的代码需要备份、需要给别人看、需要多人协作、需要部署到服务器上构建,那 Git + Gitee 就是必需品。尤其是用 IDEA 做 Java 开发的朋友,Maven 拉依赖、多模块工程、配置文件管理,这些场景没有版本控制简直寸步难行。
这篇文章会覆盖从零到一的完整路径,包括环境准备、SSH 密钥配置、IDEA 里如何初始化仓库、Gitee 上如何创建远程仓库、怎么完成首次推送、日常提交更新、分支合并和回滚操作,最后附一份我踩过的坑清单。我尽量把每个步骤都讲到能直接照着点的程度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前的准备工作:IDEA、Git、Gitee 账号
2.1 确认 IDEA 和 Git 环境已经就绪
在开始之前,先确认机器上装好了两样东西:IDEA 和 Git。IDEA 我用得最多的是 IntelliJ IDEA,社区版完全足够做日常练习和多数项目开发。安装这块没什么可多说的,去官网把安装包下下来、一路下一步就行,需要注意的就是内存设置——如果你的电脑内存不是特别充裕,在安装完第一次启动时把 Heap 大小调低一点,省得把机器拖死。
Git 是必须单独安装的,IDEA 本身不内置 Git,它只是做了一层集成。Windows 用户一般去 Git 官网下 Windows 版,安装时选择默认选项即可。装完后打开命令行工具,输入 git --version,能打印出版本号就说明 OK 了。如果你是 Mac 用户,通常系统自带 Git,也可以通过 Homebrew 装最新版。
装完之后要做一件很多人容易跳过的事:给 Git 配置用户信息。这个信息会跟着你的每一次提交记录走,在 Gitee 仓库的提交历史里显示出来。打开终端执行:
bash复制git config --global user.name "你的名字"
git config --global user.email "你注册Gitee用的邮箱"
这两个配置项是全局的,配置一次以后所有仓库都通用。提交记录里如果没带名字和邮箱,后续追溯代码是谁改的就会很麻烦。注意,email 一定要和 Gitee 账号绑定的邮箱一致,这样你在 Gitee 上的提交记录才能正确关联到你的账户头像。
2.2 注册 Gitee 并生成 SSH 公钥
Gitee 账号注册没什么好说的,官网填个邮箱、设个密码就完事。这里重点说 SSH 公钥。很多新手第一次连接 Gitee 时被 HTTPS 方式的密码输入折磨得够呛,其实配好 SSH 后就能做到免密推送,一步到位。
生成 SSH 密钥对在终端里执行:
bash复制ssh-keygen -t ed25519 -C "你注册Gitee用的邮箱"
如果系统比较老不支持 ed25519,可以换用 ssh-keygen -t rsa -b 4096 -C "你的邮箱"。执行后一路回车,默认会在用户主目录的 .ssh 文件夹下生成两个文件:id_ed25519(私钥)和 id_ed25519.pub(公钥)。私钥留在本机,公钥要填到 Gitee 上。然后把公钥文件的内容完整复制出来,粘贴到 Gitee 的「设置 - 安全设置 - SSH 公钥」里,标题随便起。这一步的意义是让 Gitee 信任你的电脑,后续推送代码时通过私钥完成身份验证,不再需要输密码。
配置完后在终端测试一下连接:
bash复制ssh -T git@gitee.com
看到欢迎信息(Hi xxx! You've successfully authenticated)就说明通了。
2.3 在 IDEA 里完成 Git 相关设置
打开 IDEA,进入 File -> Settings -> Version Control -> Git,在 Path to Git executable 里确认路径正确,点 Test 按钮,正常情况下会弹出 Git 版本信息。这步的作用是让 IDEA 能调用 Git 命令行执行版本控制操作。
接着在 Settings -> Version Control 里把「Directory」映射配一下,如果项目目录还在,IDEA 一般会自动识别到 Untitled 目录并提示,你选择 Git 即可。如果忘了提前设置,在项目里执行 VCS -> Enable Version Control Integration 也可以达到同样的效果。
这里还要顺带提一个 2023 年之后新版本 IDEA 的坑:IDEA 默认开启了「Use credential helpers」和相关安全策略,如果你遇到 Git 相关报错信息里有 suspicious ownership 或 safe.directory,要按提示把对应的目录加到信任列表里,否则后续操作会各种受阻。
3. 把本地项目变成 Git 仓库
3.1 初始化仓库两条路:命令行与 IDEA 界面
现在打开你那个要提交的 IDEA 项目。假设你已经写好了一个 Java Maven 项目,结构大概是 src/main/java、pom.xml 这些。接下来要做的,就是把它初始化成一个 Git 仓库。
命令行方式:在项目根目录打开终端,执行 git init,它会生成一个 .git 隐藏目录,这个目录里装着所有版本历史和你本地仓库的配置信息。初始化完成后项目就纳入 Git 管理了。
IDEA 界面方式:在项目根目录右键或者通过顶部菜单 VCS -> Enable Version Control Integration,弹窗中选择 Git,点击 OK。效果和命令行 git init 相同,而且 IDEA 会自动给出一个 VCS 菜单分组,后续的提交、推送、分支操作都能在这个菜单里完成。
两种方式用哪个都行,我更推荐一开始用 IDEA 的图形化操作,因为后面日常操作本来就在 IDEA 里做,图形化界面能让你对当前 Git 状态一目了然。
3.2 不想把 target 和 .idea 提交上去?先配好 .gitignore
这是新手最容易翻车的地方。第一次提交时如果不管三七二十一全选提交,IDEA 的 .idea 目录、target 目录、*.iml 文件、编译生成的 class 文件就会一股脑进仓库。看起来没什么大不了,但这些文件换一台机器就变了,会导致大量无意义的 diff,严重污染提交记录,甚至带来配置冲突。
方案是在项目根目录创建 .gitignore 文件。IDEA 新建文件时默认就会提供 .gitignore 模板,或者在命令行执行 touch .gitignore。下面是我常用的 Java + Maven 项目的 .gitignore 内容:
gitignore复制target/
!.mvn/wrapper/maven-wrapper.jar
*.class
*.log
.idea/
*.iml
.DS_Store
解释一下这几条规则。target/ 是 Maven 编译输出目录,完全没必要入库;.idea/ 是 IDEA 的工程配置目录,包含了你本地的运行配置、编码风格等,多人协作时容易因为个人设置不同而产生冲突,建议忽略;*.iml 是模块描述文件,同样因人而异。如果你用的是其他构建工具,再按实际情况补充即可。
提示:.gitignore 写的规则在文件已经被 Git 跟踪的情况下是不生效的。也就是说,如果你已经先把
.idea目录提交进仓库了,后面再配置 .gitignore 也不会自动从仓库移除它。这种情况要么手动用git rm -r --cached .idea把它从跟踪列表移除后再提交,要么干脆在项目初始化时就把 .gitignore 配好。
3.3 第一次本地提交:提交信息怎么写
配置好 .gitignore 后,在 IDEA 里按 Ctrl+K(Mac 是 Cmd+K)打开 Commit 窗口。窗口左侧会列出所有有改动的文件,状态包括新增(红色或绿色)和修改(蓝色)。第一次提交时,项目里所有文件都是新增状态,全选勾上。填写提交信息(Commit Message),然后点击右下角的 Commit 按钮。
提交信息怎么写,这也是有门道的。我见过很多人写「111」、「aaa」、「更新」这种提交信息,等改完一批想回滚时,压根分不清哪次提交做了什么。规范的做法是用一句话说清楚这次提交的目的,业界流行的 Conventional Commits 规范很值得参考:
feat:表示新增功能fix:表示修复 bugdocs:表示文档变更style:表示格式调整,不影响逻辑refactor:表示重构test:表示测试相关chore:表示构建过程或辅助工具变动
比如你写了一个新增注册功能的模块,提交信息就可以是 feat: 新增用户注册功能;修复了一个空指针异常,就写 fix: 修复登录时空指针异常。这套约定在团队协作时特别有用,一看提交记录就能知道每一条改动的语义,而且很多自动化工具(如生成变更日志)都依赖这个规范。
第一次提交执行成功后,本地仓库就拥有第一个 commit 了。
4. 创建 Gitee 远程仓库并完成首次推送
4.1 在 Gitee 上创建一个空仓库
登录 Gitee,点击页面右上角的「+」号,选择「新建仓库」,进入创建页面后会看到几个要填的选项。仓库名是必填的,名字尽量用英文小写、短横线分隔,比如 my-springboot-project。路径会跟着仓库名自动带出,你可以在后面自定义。公开或私有按需选择——练习项目建议私有,免得误传敏感信息;开源项目就选公开。
下面还有三个初始化选项:README、.gitignore 模板、开源许可证。这里要特别注意,如果你打算把本地已有的项目推上来,这三个选项全都不勾,直接创建一个空仓库。因为一旦勾选了 README,远程仓库会多出一个初始提交,而你本地仓库也有自己的提交历史,第一次推送时就会出现两端历史不相交的冲突。我就见过不少人因为勾了 README,被推送失败气得不行,其实问题就出在这。
创建完之后,Gitee 会跳转到一个带操作指引的页面,上面展示了仓库的远程地址。地址有两种格式:HTTPS 格式是 https://gitee.com/用户名/仓库名.git,SSH 格式是 git@gitee.com:用户名/仓库名.git。因为我们前面配好了 SSH 公钥,这里就选 SSH 格式。顺便把 git@gitee.com:用户名/仓库名.git 这个地址复制下来,下一步要用。
4.2 连接本地仓库与远程仓库
回到 IDEA,项目里打开终端,或者在 IDEA 的 Terminal 面板里执行命令。先把本地仓库和远程仓库关联起来:
bash复制git remote add origin git@gitee.com:你的用户名/你的仓库名.git
这里 origin 只是一个远程仓库的别名,你叫它什么都行,约定俗成叫 origin。执行完这条命令,远程仓库就算关联上了。验证一下:
bash复制git remote -v
如果能看到 fetch 和 push 两条带地址的输出,就说明关联成功。
这里插一句,为什么推荐 SSH 地址而不是 HTTPS?HTTPS 方式推送时每次都要输入用户名和密码,虽然 Git 有 credential helper 能缓存,但第一次配置还是麻烦,而且偶尔会抽风。SSH 地址配好公钥后完全免密,一条命令直接推上去,体验完全不一样。
4.3 第一次 push 的完整操作
连接好远程仓库后,执行推送命令:
bash复制git push -u origin master
-u 参数的意思是建立本地 master 分支和远程 master 分支的跟踪关系,等价于 --set-upstream。设置好之后,以后在这个分支上直接执行 git push 就行,不用再重复指定远程仓库和分支。
如果你用的是 Git 初始化时默认的分支名,上面命令用 master;如果创建仓库时默认分支名是 main,或者你本地的默认分支已经被改成了 main,就把最后的 master 换成 main。推送成功后,IDEA 左下角的 Version Control 面板里会出现远程分支信息,Gitee 网页端刷新也能看到仓库里的文件了。
首次推送成功后,后续每次在 IDEA 里提交时,提交按钮旁边多了一个「Commit and Push」选项,点了会同时完成本地提交和远程推送,非常方便。
4.4 首次推送的报错大坑:non-fast-forward 和没有共同祖先
首次推送大概率会遇到下面这个经典报错:
code复制! [rejected] master -> master (fetch first)
error: failed to push some refs to ...
hint: Updates were rejected because the remote contains work that you do not have locally.
说白了就是远程仓库里有本地没有的提交,最常见的原因就是你创建仓库时不小心勾选了 README 或 .gitignore。这时有两类处理方式:
第一种,确认远程仓库的文件(比如 README)你没用,本地是最完整的版本,那就直接强制推送覆盖掉远程的历史:
bash复制git push -u origin master --force
第二种,如果远程初始文件(README、开源许可证)是你想保留的,那就先把远程内容拉下来合并,再推送:
bash复制git pull origin master --allow-unrelated-histories
git push origin master
--allow-unrelated-histories 这个参数非常重要。因为本地仓库和远程仓库是两个没有共同祖先的独立仓库,普通 git pull 会拒绝合并,加上这个参数表示允许合并两个没有共同历史的分支,合并成功后远程的 README 就会出现在你的项目目录里。
我在实操中更推荐第一种方式——前提是你确认远程仓库里没有需要保留的东西。因为刚创建的远程仓库本来就应该是空的,强制推送能保持历史干净。当然,如果远程已经有了同事推的代码,那就不能这么干了,老老实实用第二种方式合并。
5. 日常代码更新:从一个 Commit 到另一个 Commit
5.1 每天开工和收工的完整流程
代码推上远程仓库只是一切的开始,日常开发中最常做的事情是:改代码、提交、推送,以及拉取别人的更新。以单人开发为例,一次完整的日常更新流程是这样的:
开工时先拉取远程仓库最新代码,确保本地在最新版本上开发:
bash复制git pull origin master
然后正常在 IDEA 里改代码。改完之后先看看改了哪些文件,检查一下有没有把不该提交的文件带进去:
bash复制git status
确认无误后,在 IDEA 里按 Ctrl+K 提交,提交信息按规范写清楚。最后按 Ctrl+Shift+K 或者执行 git push,把本地提交推到远程仓库。
这里有个容易被忽视的细节:git pull 实际上做了两步操作,先 fetch 远程最新提交,再 merge 到本地分支。如果你本地有未提交的改动,直接 pull 有可能因为冲突合并而失败。所以我的习惯是:在 pull 之前先把本地改动提交掉,或者至少用 stash 暂存起来,这样 pull 过程会干净很多。
5.2 分支:什么时候该开新分支
很多新手从头到尾只用一个 master 分支,这种做法在单机练习时问题不大,但一旦项目复杂起来就寸步难行。举个例子,你正在开发登录功能,突然线上有个紧急 bug 要修,你总不能把手头半成品一起提交上去吧?这时候分支的作用就体现出来了。
分支的核心理念是:给代码的某一种状态打一个独立副本,互不干扰。在 IDEA 里,右下角有一个分支状态的指示器,点击它可以打开分支管理面板。新建分支的入口在 Git -> Branches -> New Branch,取个名字比如 feature-login,切到新分支开发登录功能;修 bug 时切回 master 分支,新建一个 hotfix 分支,修完后合并回 master,再推到 Gitee 远程仓库。
用分支的好处是,你可以保证 master(或主分支)始终处于可发布状态,所有没验证完的功能都在各自的分支上。团队协作时,这个习惯尤其重要,因为别人拉取你的代码时不会被你半成品牵制。
5.3 多分支合并与冲突处理
分支开多了,最终还是要合并回主干的。在 IDEA 里,切到目标分支(比如 master),执行 Git -> Merge,选择要合并进来的分支(比如 feature-login),点击 Merge 即可。如果 Git 发现两个分支在同一文件的同一位置做了不同的修改,就会标记为冲突。
合并冲突是每个开发者都绕不开的噩梦。冲突发生时,IDEA 会弹出窗口列出冲突的文件。双击文件进入合并界面,左边是本地版本,右边是远程分支版本,中间是合并结果。你需要在左右两边选择保留哪一部分,或者手动编辑中间的结果。处理完所有冲突后,点击「Mark as Resolved」,然后再提交一次合并提交。
这里有个经验之谈:尽量减少人为冲突。在多人合作时,改代码前先 git pull,保持本地分支尽可能接近远程状态;文件级别的职责划分清楚,大家尽量改不同文件。这样即便有自动合并,也不会频繁出现令人头大的冲突提示。
5.4 提交信息写不好,回滚就抓瞎
提交信息规范这件事我再强调一遍。当你需要回滚代码时,git log 输出的就是你的回溯依据。刚学 Git 时我犯过一种病:习惯性写「更新」两个字,过了两个星期再看,三四十条提交全是「更新」,根本分不清哪条对应哪个功能,只能靠时间猜。后来强制自己按规范写 feat:、fix: 这类前缀,回滚时看标题就能精准定位到目标提交。
回滚操作在 IDEA 里有两种典型场景。第一种是还没 push 到远程,发现自己提交错了,此时在 Git -> Log 面板里选择目标提交,右键 -> Reset Current Branch to Here,弹窗里有 Soft、Mixed、Hard 三个选项。Soft 会保留改动并让改动回到暂存区,相当于撤销 commit 但保留文件修改;Mixed 保留改动但不暂存;Hard 则是彻底丢弃所有改动。在这个场景下我一般选 Soft。
第二种是已经 push 到远程,别人可能已经拉取了这个版本,这时不能硬重置历史,而要用 git revert 生成一个反向提交。在 Log 面板里选中要回滚的提交,右键 -> Revert Commit,Gitee 会收到一个新的提交记录,把之前那个提交的改动全部撤销。用的是 R后面的同学 pull 后就是最新正常状态,不需要处理历史重写的麻烦。
6. 折腾 Gitee 这两年,我踩过的坑和常用命令速查
6.1 高频问题排查表
我把自己带过的团队里出现频率最高的几个问题整理成一个表,你直接照着排查:
| 报错 / 现象 | 原因 | 解决办法 |
|---|---|---|
git did not exit cleanly (exit code 128) |
Gitee 远程仓库与本地仓库存在目录冲突或未关联 | 先 git remote -v 确认地址正确;如果是首次推送的空仓库,用 git pull origin master --allow-unrelated-histories 合并后再推 |
! [rejected] master -> master (non-fast-forward) |
远程有本地没有的提交 | 确认远程内容无用则强制推送 git push --force;有需要保留的内容则先 pull 再 push |
Could not read from remote repository |
SSH 公钥配置有问题 | 检查 Gitee 公钥是否添加、本地私钥是否存在;重新用 ssh -T git@gitee.com 测试 |
| IDEA 里提交按钮是灰色 | 文件没有改动(或者在 .gitignore 里被忽略) | 检查文件是否被忽略,或确认是否真的保存了改动 |
| 推送成功但 Gitee 上看不到文件 | 分支名或仓库不对 | 确认推送的是远程对应分支;Gitee 仓库页面切换分支查看 |
| 拉取代码时提示本地修改会被覆盖 | 未提交的本地改动与远程改动冲突 | 先 git stash 暂存,pull 后 git stash pop 恢复,处理冲突 |
6.2 免密推送的两种配置方式
很多人问:为什么我推送时还要输密码?这是因为使用的是 HTTPS 地址,系统没有记住凭据。在 Git 里设置凭据存储是全局的:
bash复制git config --global credential.helper store
执行完后第一次推送会照常输入用户名密码,之后 Git 会把凭据明文存在用户主目录下的 .git-credentials 文件里,以后不再询问。设置完成后,你可以在 IDEA 的 Terminal 里执行一次推送,输入一次密码,之后就一路畅通了。
但说实话,我最推荐的方式还是 SSH + 公钥验证。SSH 连接天然免密,而且不依赖 Git 凭据管理器,跨平台行为一致。你只需要确保两件事:一是本地 ~/.ssh 目录下有私钥文件,二是 Gitee 上添加了对应的公钥。这样 git push 就像吃饭喝水一样自然。
6.3 我踩过的坑和它教会我的事
讲几个真实的翻车现场,帮你避雷。
第一个坑是提交了 .idea 目录。有一个团队项目,所有开发者的 IDEA 版本不统一,导致 .idea 里的编码配置、运行配置互相覆盖,每次拉代码都要重新设置环境。后来花了一个下午的时间把 .idea 从仓库里清掉,再配好 .gitignore,才好起来。这个教训让我明白:提交之前,先想清楚哪些文件是开发环境专属的,哪些是项目真正需要的。
第二个坑是强制推送。有一次我为了省事,在本地重写了一段历史后直接 git push --force,结果把一个同事尚未合并的分支提交给覆盖了,差点把人家半天的工作量弄丢。后来我就学会了:非必要不强制推送,如果非推不可,先和团队确认远程仓库没有别人未备份的提交。
第三个坑是提交信息乱写。每次回滚时翻 git log 都像考古,最后痛下决心强制自己用 Conventional Commits。坚持了半年之后,回滚、生成变更日志、团队 review 都顺了不是一星半点,这个习惯我强烈建议你尽早养成。
6.4 在 IDEA 里顺手完成的 Git 操作
有些操作其实完全不用切到命令行,在 IDEA 里点点就能完成。我把整理好的常用操作路径列一下,平时用这些足够了:
- 查看当前分支状态:右下角分支列表或
Git -> Branches - 查看提交历史:
Git -> Log,可以看所有分支的提交图 - 比较两个版本差异:在 Log 里选中两条提交,右键 -> Compare Versions
- 暂存未提交改动:
Git -> Stash Changes,之后可以Unstash Changes恢复 - 抛弃某个文件的修改:在项目文件上右键 -> Git -> Rollback
- 拉取远程更新:
Git -> Pull,弹窗里可以选择 Pull 的类型(merge 或 rebase)
这里多说一句 Pull 类型的选择。如果你在 IDEA 里点击 Git -> Pull,会看到一个 Update method 的选项,默认是 merge,也可以选 rebase。merge 会保留分支合并历史,产生一条 merge commit;rebase 则是把本地的提交重新放到远程提交之后,让历史呈线性,看起来更干净。我个人偏向 rebase,因为它让提交历史更好读,review 起来更舒服。但是不要对已经推送出去的提交做 rebase——这会导致远程和本地历史不一致,团队其他人拉取时会很痛苦。
最后再分享一个我自己的使用习惯:不要把所有东西都推到一个主分支。哪怕是个人项目,也建议规则化地划分分支类型——主分支保持可发布状态,功能分支用 feature/ 标识,修复分支用 hotfix/ 标识,开发阶段可以有一条 develop 分支作为集散地。这个习惯在只有一个人的项目里可能看起来是多余的,但当项目进入团队协作或需要自动化部署时,你会发现按规则走真的很香。代码托管这件事,工具只是底子,真正拉开差距的是你愿不愿意在提交前多想十秒钟。
