news 2026/9/30 5:21:50

IDEA中Git分支回退详解:Revert与Reset操作实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IDEA中Git分支回退详解:Revert与Reset操作实战指南

简介:对于经常使用 IntelliJ IDEA 的开发者来说,Git 分支回退是版本管理中的高频需求,尤其是提交已推送到远程仓库后再想撤销的场景。这份 PDF 面向需要将本地和远程仓库恢复到指定历史版本的研发人员,重点讲解 Revert 与 Reset Head 指针两类方案,从右键菜单入口、参数选择到冲突处理,完整还原回退流程。资料以 1 个 PDF 文件打包,大小约 729KB,配有界面操作说明,适合对照 IDEA 逐步练习。目前已有 22974 人学习下载。内容涵盖非破坏性 Revert 的原理,也分析了 Reset 在 Hard、Mixed 等模式下的行为差异,并提示git push -f强制覆盖远程历史可能带来的协作风险。由于 Revert 会生成一次新的提交,后续反悔也更容易;Reset 则直接移动 HEAD,适合快速回到目标提交。读完可理解两种回退方式的取舍,在实际开发中按场景选择更稳妥的版本回退方案。

1. 提交到本地又Push后发现错了:IDEA里回退指定版本有两条路

在IDEA里把git分支回退到指定的历史版本,是我见过最容易被忽略、又被问得最多的一项日常操作。场景往往长这样:你在git_demo分支上改完Readme.md,先commit到本地,紧接着push到远程,回头才发现少改了一个关键参数,或者干脆这一整次提交就是错的。此时分支的HEAD指针停在了一个不想要的位置,而远程仓库也已经同步过去了。想回退但又不想把队友的代码一起拉下水,怎么办?

答案不是只有一条路。IDEA提供了两种风格完全相反的回退方式:第一种是Revert操作,它针对你选中的历史提交生成一个反向的新提交,旧记录全部保留;第二种是Reset Current Branch to Here,直接让当前分支的HEAD指针强制指向目标版本,之后的所有提交记录会被抛弃。我在日常开发中会把Revert当成首选,因为它是留了后悔药的;Reset则更像快刀斩乱麻,用得少,但特定场景下比Revert可靠得多。这篇笔记就围绕这两种操作展开,把它们各自的参数选择、IDEA里的完整点击路径、push到远程时的坑、以及冲突怎么处理讲清楚。新手可以照着点,老手也能看看自己在分支定位和强制推送时有没有踩过同一块石头。

2. Revert操作:保留历史的“后悔药”,步骤与冲突处理

2.1 为什么Revert更安全:它到底改了什么

先说原理。Revert操作的底层逻辑是git revert <commit>,它会生成一次新的提交,这次提交的内容是目标提交的“逆向补丁”。举个例子,假设你的版本1里Readme.md写着“版本1:第一次编辑”,然后版本2改成“版本2:第二次编辑”,现在你想回到版本1,Revert会生成一个版本3,内容刚好把Readme.md改回“版本1:第一次编辑”。

关键点在于:版本2这个提交本身仍然留在提交日志里,只是它的结果被版本3覆盖了。这意味着整个分支的历史是连续的、可追溯的,任何人打开Git日志都能看到“某个时间点做了一次回退”,而不是“某个提交凭空消失了”。在团队协作中,这种透明性非常重要,review代码的人不需要脑补你刚才发生了什么。所以我一般会建议:只要这条分支不是只有你一个人在push,就不要轻易用重置的方式回退。

这个操作在IDEA里的入口也很直观:在Version Control工具窗口的Log视图里,找到目标历史版本,右键,选择Revert Commit。注意,老版本IDEA里菜单可能叫Revert,新版本更明确的写法是Revert Commit,含义一样,都是针对你选中的那一次提交做反向操作。别选成Revert Changes,那是针对未提交的变更列表的,不是同一个东西。

2.2 从右键到Push:完整操作步骤

我这里用Readme.md的演示场景说明,你实际项目中涉及的文件可能更多,但思路完全一致。

第一步,在IDEA右下角或左侧边栏打开Git工具窗口,切换到Log选项卡。你会看到当前分支的提交历史列表,按时间倒序排列。

第二步,找到你希望回退到的那个历史版本。比如你的分支现在有三个提交,想回到第一个提交版本1,就右键点击那条“版本1:第一次编辑”,选择Revert Commit。

第三步,此时IDEA会弹出冲突对话框。如果目标提交之后没有其他提交动过同一个文件的同一行,可能不会出现冲突;但只要之后有过修改,几乎必然冲突。双击冲突文件,进入合并工具。

第四步,在解决冲突对话框中,左边是当前分支的最新内容,右边是应用Revert补丁后的结果,中间是合并后的最终版本。你需要在中间区域手动调整,把文件内容确定为你真正想要的样子。

第五步,关闭冲突对话框后,Revert生成的变更会出现在Local Changes里。检查无误后,像正常提交一样Commit,提交信息默认类似“Revert: xxx”,可以改写为更明确的描述。

第六步,把这次Revert提交Push到远程仓库。因为Revert本质是一次新增提交,远程分支会快进合并,所以不需要强制推送,直接Push即可。

操作过程对应到命令行,其实就是两条:

git revert <目标提交哈希> git push origin git_demo

第一行的<目标提交哈希>就是你右键选中的那个提交的哈希值,在IDEA里可以在提交详情里复制,也可以用git log拿到完整哈希。git revert会自动创建一个新的提交,所以第二行直接git push就能同步,不会出现因为历史分叉而被拒绝的问题。

2.3 冲突解决时三选一:Accept Yours和Accept Theirs别搞反

这是Revert操作里翻车率最高的地方。很多人在冲突对话框里看到“Accept Yours”和“Accept Theirs”两个按钮,想都不想就点一个,结果回退后的文件内容完全不是自己预期。

IDEA的冲突合并对话框中,三个面板的方向是固定的:左侧是Yours(你的本地当前版本),右侧是Theirs(从引用的提交中引入的版本),中间是After Merge结果。在Revert场景下,Theirs位置显示的是“逆向补丁应用后的内容”,它代表的是删除掉目标提交里的改动之后的状态。也就是说,如果你想要“完全回到目标版本”,大多数情况下应选择的是右侧Theirs,或者手动从左侧拷贝你需要的行。

这里有个血泪经验:不要盲目相信按钮名。我见过合作同事在Revert时点了Accept Yours,结果把之前不想保留的版本2内容又原样保留了下来,冲突看起来“解决”了,实际上Revert根本没生效。后来排查了半小时,发现就是方向选反了。

如果你对三个面板的含义拿不准,最稳妥的办法是手动点击左右两侧的箭头,把需要的内容合并到中间区域。中间区域永远是最终写入文件的内容,确认无误后再点Apply。Revert的目标文件不多时,手合比快捷键靠谱得多。

2.4 为什么推荐:它可以被“后悔”的后悔药

Revert最大的好处是可以再次Revert。如果你回退之后又觉得原来的版本2其实是对的,只需要再次右键那条Revert提交,选择Revert Commit,IDEA又会生成一条新提交,把内容改回版本2。这个操作可以来回做,提交历史里每一步都有记录,永远留有余地。

相比之下,Reset操作一旦执行,原来的提交记录就从分支历史中消失了,虽然还有git reflog这样的底牌可以抢救,但对新人不友好,而且强制推送后的远程历史很难恢复。所以在团队项目里,我会强制自己遵守一条规则:只要这个分支有别人在跟进,回退一律用Revert;只有我自己的个人分支且确认远端不会被其他人pull,才考虑Reset。这个习惯后来帮我至少避开了三次需要跟同事道歉的风险。

3. Reset Head指针:Hard和Mixed怎么选,强制推送的代价

3.1 Reset的本质:分支指针直接指向目标提交

如果说Revert是在历史记录上“叠一层”,那Reset就是把历史记录“撕掉”。底层对应的是git reset <target>,作用很简单:把当前分支的HEAD指针强行移动到目标提交的位置,同时根据你选择的模式,决定暂存区和工作区的内容保留还是清空。

IDEA里触发Reset的入口是:在Log视图右键目标提交,选择Reset Current Branch to Here。弹出对话框中有三个选项:Soft、Mixed、Hard。这三个选项经常把人绕晕,因为它们的名字看不出跟工作区文件有什么关系。我一般用一张表来直观说明它们的区别。

模式HEAD指针暂存区工作区典型场景
Soft移动保留原内容保留原内容想重新提交,但不想放弃任何改动
Mixed移动重置为未暂存状态保留原内容提交内容有误,只想撤销提交、保留工作区修改
Hard移动重置丢弃全部改动彻底回到目标版本,不要任何后面改动

也就是说,Hard模式下不光提交记录被丢掉,工作区和暂存区里的未提交内容也会一并清空。Mixed模式下工作区文件还在,只是暂存区被重置,你可以重新调整后再提交。Soft则保留了全部暂存状态,紧接着commit就能生成一次新提交。

3.2 在IDEA里执行Reset:从右键到push -f

还是基于版本1、版本2的演示环境。假设分支git_demo当前指向版本2,你现在要回退到版本1。

第一步,在Log视图里右键“版本1:第一次编辑”,选择Reset Current Branch to Here。

第二步,在弹出的模式选择框中,如果你确定版本2的内容完全不要了,选Hard;如果只是想撤销版本2这次提交,但工作区里的文件内容还想继续用,选Mixed。确认后点击Reset。

第三步,本地分支此时已经指向版本1,Git窗口里能看到版本2的提交记录从当前分支的顶部消失。但远程仓库git_demo仍然指向版本2,这时候你执行Push,IDEA会弹出一条“Push rejected”的提示,因为本地和远程的历史已经分叉——本地是版本1,远程是版本2,而版本1不是版本2的祖先提交。

第四步,打开Terminal,执行强制推送:

git push -f origin git_demo

-f参数的全称是--force,含义是忽略本地与远程之间历史分叉的检查,直接让远程分支强制指向本地的当前HEAD。执行后远程分支的记录就与本地完全一致了,版本2以及之后的所有提交都会从远程日志里消失。

3.3 Hard与Mixed的选择:损失范围完全不同

选Hard还是Mixed,核心在于你要不要保留工作区里的实际文件内容。我举两个典型的区分场景,你直接套用就行。

场景A:你刚才的全部提交都是测试用的垃圾代码,现在想直接回到干净状态,工作区里的改动也可以毫无保留地丢弃——选Hard。执行完IDEA里显示的分支位置、文件内容、暂存区全部回到目标版本时的状态,就像版本2从未存在过。

场景B:你已经写了很多新的功能代码,还没commit,但刚才不小心把一些不该提交的文件commit并push了。这时候重启或回退版本不是目的,只是想“撤销错误提交但保留我工作的成果”——选Mixed。Reset之后,目标版本之前的提交记录全部消失,但你工作区里的文件和未提交改动依然健在。接下来可以重新add + commit,形成一次干净的提交。

注意,IDEA的Reset对话框旁边还有Soft选项,但在“回退到指定历史版本后想重新提交”的场景下,Soft往往不如Mixed好用。因为Soft会保留暂存区,如果你工作区里堆积了更多未提交的改动,暂存区和未暂存区混在一起,提交时还要手动区分;“保险起见”我一般推荐Mixed,因为暂存区重置后,所有文件都变成“未暂存”,接下来的操作更有主动权,不会把临时文件不小心带进提交。

3.4 为什么git push -f 会让团队“血压升高”

强制推送最有争议的就是覆盖远程历史。假设团队里另一名同事基于远程git_demo的版本2拉了一个本地分支,他正准备提交合并。你执行git push -f让远程变成版本1,相当于把同事的基准分支直接从底层抽走。同事Bless本地感知到的是“远端历史被重写了”,之后他推代码时会被拒绝,只能rebase或cherry-pick,严重点的连之前基于版本2改的文件都找不齐。

所以强制推送之前,必须做一次准确判断:这条分支是否只有你自己在用?远程上有没有你不在时被别人新推的提交?判断方法也很简单,先git fetch,再比较一下本地分支和远程分支的关系。

git fetch origin git log --oneline --graph --all --decorate

如果git log里显示origin/git_demo的HEAD落在你本地HEAD之前哪怕一个提交,都不要直接push -f。这时候应该先把那个新提交摘下来处理,或者跟发布者沟通好再行动。团队协作场景下,我用Revert的次数是Reset的十倍,就是这个原因。

4. 回退前先定位:用git log、git reflog和IDEA提交记录找到目标版本

4.1 别靠眼力:用git log看提交哈希和相对位置

回退前最忌讳的事情,是在提交列表里“差不多”找一个看起来像历史版本的提交就右键。IDEA的Log视图默认用时间和提交信息排序,看起来直观,但提交哈希才是判断绝对位置的唯一依据。

在IDEA的Terminal里执行以下命令,可以快速看到当前分支的所有提交及相对关系:

git log --oneline --graph --all --decorate

输出示例是:

* abc1234 (HEAD -> git_demo) 版本2:第二次编辑 * def5678 (origin/git_demo) 版本1:第一次编辑

abc1234和def5678是提交哈希的前7位,HEAD -> git_demo表示本地分支当前指向的提交,origin/git_demo表示远程分支指向的提交。在做Reset或Revert之前,把目标提交的哈希复制下来,然后到右键菜单里跟IDEA显示的提交详情对比,确认没有看错再动手。

如果在IDEA的Log视图里点选提交,下方Pinned area会显示提交哈希、作者、时间、提交信息,右键还能复制Commit Hash。建议养成把目标哈希复制留存的习惯,特别是当目标版本比较老、中间夹着十几个提交时,有哈希比对能避免回退到错误的分叉点。

4.2 git reflog:给回退上“后悔药”的底牌

git reflog是回退操作中最救命的一条命令。它记录的是本地仓库中所有HEAD指针的移动历史,包括已经被Reset掉、从分支上消失的提交。换句话说,就算你误用Hard模式把版本2的提交从分支上删掉了,只要本地仓库没被清理,版本2的提交哈希依然可以通过reflog找到。

执行方式:

git reflog

输出示例:

abc1234 HEAD@{0}: reset: moving to abc1234 def5678 HEAD@{1}: commit: 版本1:第一次编辑

每一行的HEAD@{n}是最近一次HEAD移动的编号,越小的数字表示越新的操作。你要找的是Reset执行之前的那个提交哈希,也就是HEAD@{1}或更早位置记录的提交。拿到哈希后再执行:

git reset --hard def5678 git push -f origin git_demo

就能把分支恢复到被误删之前的状态。这个操作的原理是:git并没有在Reset的瞬间物理删除提交对象,只是让分支指针不再指向它,所以reflog能作为“时间机器”找回指针移动前的记录。需要提醒的是,reflog记录只存在于本地,一旦使用git gc清理或克隆新仓库,这些记录就会消失。所以误操作后第一反应是查reflog,不要先去改别的。

4.3 IDEA图形化定位:提交记录右键菜单怎么读

除了命令行,IDEA的Version Control窗口也能提供足够的定位信息。Log选项卡上方是一个分支图,实心圆点代表提交,不同分支用不同颜色线条区分。你当前分支的HEAD会被一个蓝底方框标记,远程分支则用带仓库图标的形式显示。

右键任意提交,会出现一串操作项。我平时真正常碰的就三个:Revert Commit、Reset Current Branch to Here、以及Compare with Previous。前两个我们已经用过,第三个最适合回退前确认目标版本:“Compare with Previous”会弹出一个diff视图,展示“目标提交与它的上一个提交”的差异,如果你不确定当前目标版本是不是自己记忆中的那个,先用它看一眼文件改动。

有个小细节:IDEA的Log视图默认可能折叠了过滤栏。如果你在大量提交中找不到一个比较老的版本,可以在右上角搜索框输入提交信息或作者名,然后点开过滤器的“Branch”单选为当前分支,能大幅缩小范围。定位版本这件事,宁可多花两分钟看diff,不可省这一步骤直接Reset——后者很容易让人回退后才发现目标版本选错了,还得再回退一次,属于典型的绕远路。

5. 避坑与常见问题排查:Push被拒、误回退、冲突的三类典型现场

5.1 Push被拒绝:远程领先本地或历史分叉

现象:在IDEA中执行git push,弹出告诉你“Push rejected”或者类似“failed to push some refs”的提示。

原因:Reset之后,本地分支HEAD指向目标版本,这个版本在远程分支上已经是“过去时”。远程的HEAD仍停留在旧提交上,二者之间没有直接祖先关系,所以普通的push会被git的快速前进检查拦截。

解决:先别急着git pull。很多人被这个提示吓得直接pull,结果把远程的旧提交重新拉回本地,Reset白做了,工作区还可能产生不必要的merge冲突。正确的顺序是先执行git fetch,看清远程的分支状态。如果远程确实只是落后于你回退前的提交,没有别人的新提交,再执行:

git push -f origin git_demo

如果git fetch后发现远程还有你回退之后别人推的新提交,比如origin/git_demo指向另一个你完全陌生的哈希,说明有人在你误操作之后又更新了分支。这种情况下不要强制推送,先跟那个提交的作者确认,必要时改用Revert方式把你自己的错误修改撤销掉,保留对方的提交。

5.2 Revert后冲突:不是“点一下”就能搞定

现象:右键Revert Commit后,IDEA没有直接完成回退,而是弹出一个Conflict对话框,列出好几个文件,双击后进入合并工具。

原因:Revert生成的逆向补丁需要应用到当前工作区,而目标提交之后可能又有别的提交改过同一文件,补丁无法干净地打上去,就产生冲突。这不是IDEA出问题了,而是正常提示,说明这个回退操作需要人工判断最终内容。

解决:在合并工具中,按先分析、再合并、后验证的流程走。先看左侧面板(当前分支内容)和右侧面板(应用回退补丁后的结果),理清哪些行是目标提交新增的,哪些是后续提交改的。然后逐行手动合并到中间区域。完成所有冲突文件后,点击Apply,回到Local Changes面板,检查文件列表是否只包含你预期要回退的文件。意外多出来的文件用Git diff确认一下,会不会是合并工具帮你引入了无关改动。

5.3 Reset Hard后想反悔:工作区被清空了怎么办

现象:选了Hard模式Reset之后,分支回退到目标版本,但刚才还在工作区里没提交的临时文件、未完成的新代码全部消失了。重看git status,工作区一片干净,内心瞬间空白。

原因:Hard模式会重置暂存区和工作区,对应命令是git reset --hard。这里没有进入回收站的说法,文件内容确实从工作区被清掉了。

解决:有三个补救层,按优先级从低到高尝试。第一,God step是git reflog找之前提交;如果那些消失的内容当时在某个commit里,Reset后还能重新指向。第二,如果你在清空前执行过git stash,用git stash list查看,再git stash pop恢复。第三,最容易被忽略的是IDEA自带的Local History,它不依赖git,会在本地持久化保存文件的历史快照。操作路径:右键文件或目录,选择Local History -> Show History,弹出左边栏会列出每个版本的时间、缩略信息,选一个比你Reset时间点更早的记录,点击Revert即可恢复单个文件。

这条路径的教训我记得很深:从那以后我每次Reset Hard之前,都会先执行一遍git stash push -m "before_reset_backup",确保未提交的改动有一条后路,哪怕最终用不上。

5.4 git push -f 后远程记录丢失:团队协作现场

现象:你和队友在同一个分支工作,你回退后执行了git push -f,队友pull时发现本地一堆冲突,或者打开远程提交日志,发现昨天刚推的提交不见了。

原因:强制推送直接覆盖远程分支引用,远程分支上新提交的引用被移除,但提交对象本身在服务器上可能还留存在一段时间,只是无法通过分支历史直接访问。

解决:如果你是操作方,立即停止所有新的提交操作,先确认队友的本地分支基于哪个提交,再决定是把被删的记录合并回分支,还是请队友重新推送。如果只想恢复远程被删的历史,可以用reflog找回之前的哈希,然后合并或cherry-pick回来。预防措施其实很简单:对多人共用的分支,永远只选Revert回退;只有确定是私有分支才能用Reset加-f。判断私有分支的标准不是“我感觉没人用”,而是先git log --all看是否还有别的引用指向该分支。

6. 进阶技巧:用IDEA Local History和Stash给回退上双保险

6.1 回退前先Stash:最稳妥的后悔药

在Reset Hard之前执行一次Stash,是我现在养成的必修习惯。不管当前工作区有没有未提交改动,我都会先执行:

git stash push -u -m "backup_before_reset"

-u表示包含未跟踪文件,-m是给这次stash加描述信息,便于之后识别。执行后工作区会回到干净状态,然后我再放心地Reset。如果回退后发现需要保留某些未提交改动,一条git stash pop就能原样恢复。这里要注意顺序:Reset之后立刻执行git stash pop,否则你后面又改了文件再pop,容易产生冲突。

6.2 Local History:IDEA自带的文件级时间机器

有时候你需要恢复的不是某一个commit,而是某次编辑过程中的某个中间版本,git里根本没有对应提交,reflog也帮不上忙。这时候IDEA的Local History能救命。它考察的是IDE本地记录,不依赖git,默认自动保存文件在编辑切换、关闭、执行VCS操作时的快照。

操作步骤:在Project面板里右键目标文件,选择Local History -> Show History。左侧时间轴列出历史版本,右侧显示该版本的完整文件内容。选定一个时间点,点击Revert,文件就会恢复到那个版本的内容。这个操作不会影响git的提交历史,相当于一个文件级的后悔药。我遇到过一次很尴尬的情况:回退分支后发现Readme.md中有一段说明文档是手写后忘记提交的,git里根本没有,最后就是靠Local History从一小时前的版本里找回来的。

6.3 回退后的验证:从工作区内容到提交记录

用完任何一种回退方法,都不要直接开始写新代码,先花三分钟验证结果。我的验证流程是固定的,不管Revert还是Reset都这样走一遍。

先查看当前HEAD指向和提交日志:

git log --oneline --graph --all --decorate

确认分支指向的提交哈希与你期望的目标版本一致。如果是Reset,还要确认目标版本之后的旧提交不再出现在当前分支的顶部;如果是Revert,确认多出的那条Revert提交信息清晰准确地描述了这次操作。

然后检查工作区状态:

git status

预期结果是干净的(除了可能存在的stash列表),没有意外修改的文件。最后对比文件内容,直接打开你要验证的文件,比如Readme.md,看是否与你记忆中的目标版本文本完全一致。与前一个版本用IDEA的Compare功能核对也行,但最终标准是看你自己的业务是否确认这个内容正确。

最后记得同步远程并确认远端状态:

git fetch origin git log --oneline origin/git_demo -3

如果远程HEAD与本地一致,说明回退已经真正落到了远端。

回退这个操作,说难不难,但确实经不起“我以为”三个字的考验。从那次误用Hard清空工作区、靠Local History救回文件之后,我给自己定了个死规矩:凡是Reset,前面永远接一条Stash;凡是推远程,先跑一次git fetch看看有没有人比我更晚动过这条分支。这两步不花两分钟,但能省掉跟队友解释“为什么你的提交没了”的尴尬。希望这篇笔记能帮你在IDEA里操作分支回退时更有底气。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 5:21:48

WorkBuddy指令集精选:从200条到30条的高效Prompt设计方法论

我用 WorkBuddy 有大半年&#xff0c;前前后后往自己的指令集里塞了两百多条 Skill&#xff0c;也就是大家常说的"给 AI 定的规则"。等真正跑完一轮之后发现&#xff0c;绝大部分用了一两次就不想再碰&#xff0c;能稳定出活、让我愿意反复调用的&#xff0c;翻来覆去…

作者头像 李华
网站建设 2026/9/30 5:20:22

NPU分布式训练实战:从hccl通信到监控体系全解析

1. 这不是“又一篇DDP教程”&#xff1a;为什么第十二期必须讲NPU上的分布式AI你手头那块刚到货的昇腾910B加速卡&#xff0c;插进服务器后跑npu-smi能看到设备在线&#xff0c;但一执行torchrun --nproc_per_node8 train.py就报错RuntimeError: Device backend npu is not ava…

作者头像 李华
网站建设 2026/9/30 5:20:21

计算机体系结构:从理想流水线到带伤流水线的Hazard与调度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 5:20:14

Ubuntu 20.04安装ROS Noetic全攻略:从换源到环境验证,亲测有效

开头Ubuntu 20.04装ROS Noetic这件事&#xff0c;我前前后后在不同的机器上折腾了不下二十次&#xff0c;有全新裸机、双系统、虚拟机&#xff0c;也有从ROS Melodic升级上来的老环境。说“亲测有效”不是标题党&#xff0c;而是每一步都真实跑过&#xff0c;踩过的坑比安装步骤…

作者头像 李华
网站建设 2026/9/30 5:19:00

Jenkins安装指南:JDK版本对齐与war包、容器化部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华