news 2026/9/20 16:00:00

Git撤销提交完全指南:reset、revert与amend实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git撤销提交完全指南:reset、revert与amend实战

1. 撤销提交这件事,远比你想的复杂

刚接触 Git 那会儿,我最怕的就是手滑。明明只想提交一个文件,结果git add .把一堆临时文件、调试代码全塞进去了;或者 commit message 写错了一个字,强迫症发作想改掉;更惨的是,代码已经 push 到远程仓库了,突然发现有个致命 bug 混在里面。这时候脑子里只有一个念头:能不能撤销?怎么撤销?撤销完会不会把别人的代码搞乱?

如果你也有过这种经历,那这篇内容就是写给你的。我会把git resetgit revertgit commit --amend这几个命令掰开揉碎讲清楚,包括它们各自适合什么场景、背后的原理是什么、操作时有哪些坑、以及撤销 push 之后的补救措施。不管你是刚学会git addgit commit的新手,还是已经用了几年 Git 但每次遇到回退都心里没底的老手,都能从这里找到可以直接抄作业的方案。

先明确一个核心原则:Git 里没有真正意义上的“删除历史”,只有“移动指针”和“追加新提交”两种操作。理解这句话,后面所有的命令你都能自己推导出来。git reset是移动分支指针,git revert是追加一个反向提交,git commit --amend是替换最后一次提交。三种方式对应三种不同的安全级别和适用场景,选错了轻则本地混乱,重则影响整个团队。

我见过太多人因为不敢用 reset 和 revert,每次提交错了就重新 clone 一遍仓库,或者手动复制粘贴代码,效率低得令人发指。也见过有人上来就git reset --hard,结果把没提交的改动全弄丢了,在工位上欲哭无泪。这些坑我都踩过,所以接下来我会把每个命令的边界条件、危险操作、恢复方法都讲透,让你用得放心。

2. 三种撤销方式的核心逻辑与选型指南

2.1 先搞懂 Git 的三区模型,不然永远学不会撤销

很多人学 Git 命令是死记硬背的,git reset --soft--hard有什么区别?git revertgit reset到底该用哪个?背了忘、忘了背。根本原因是没有理解 Git 的三区模型。我用一个生活化的类比来解释:把 Git 想象成一个办公室,你桌上有一份正在修改的文档,这是工作区;你改完后把文档放进一个“待提交”的文件夹,这是暂存区;最后你把文件夹里的内容正式归档到档案柜,这是版本库

git add就是把文档从桌上放进待提交文件夹,git commit就是把文件夹里的内容归档。而git reset的本质,就是移动档案柜里的一个标签——这个标签叫HEAD,它指向当前分支的最新提交。当你执行git reset --soft HEAD~1,相当于把标签往前挪了一个位置,但档案柜里的文件没动,待提交文件夹里的内容也没动。所以你的改动还在暂存区里,可以直接重新 commit。

git reset --mixed(默认模式)则是把标签往前挪的同时,把待提交文件夹里的内容倒回桌上。也就是说,改动还在工作区,但需要重新git addgit reset --hard最狠,标签往前挪,文件夹清空,桌上的文档也扔掉——所有未提交的改动全部消失。这就是为什么--hard被称为“危险操作”,因为它真的会丢代码。

理解了这三层,你就能明白:reset 是“时间倒流”,它修改了历史记录。而git revert完全不同,它是“将功补过”——不修改历史,而是新增一个提交,这个提交的内容正好和你要撤销的那个提交相反。比如你提交了“添加了功能 A”,revert 就会生成一个“删除了功能 A”的新提交。历史记录里两个提交都在,只是效果抵消了。

2.2 一张表看懂 reset、revert、amend 的适用场景

选哪个命令,取决于三个问题:提交有没有 push?需不需要保留历史记录?有没有其他人在这个分支上工作?

场景推荐命令是否修改历史安全性适用条件
本地提交,未 push,想重新提交git reset --soft HEAD~1个人分支,无他人协作
本地提交,未 push,想丢弃所有改动git reset --hard HEAD~1确认改动不需要保留
已 push,但只有自己在用这个分支git reset+git push --force-with-lease确认无人基于此分支工作
已 push,团队协作分支git revert <commit>任何情况都安全
只改 commit message 或补漏文件git commit --amend仅限最后一次提交且未 push
已 push,但想修改 messagegit commit --amend+ force push仅限个人分支

这张表建议你存下来,每次遇到撤销需求先对照一下。我自己的习惯是:只要提交已经 push 到共享分支,一律用 revert。虽然会多出一条提交记录,但绝对不会影响别人。如果是个人分支,怎么折腾都行,reset 更干净。

2.3 为什么 git reset 能“撤销”提交,而 revert 是“抵消”提交

从底层原理来看,Git 的每次提交都是一个快照,每个快照有一个唯一的 SHA-1 哈希值。分支名(比如 main)其实就是一个指针,指向最新的那个快照。HEAD是一个特殊的指针,通常指向当前分支的最新提交。

当你执行git reset HEAD~1,Git 做了一件事:把当前分支的指针从最新提交移动到它的父提交。原来那个最新提交并没有被删除,只是没有任何引用指向它了。Git 会在一定时间后通过垃圾回收机制清理掉这些“悬空提交”。如果你后悔了,还可以通过git reflog找到那个哈希值,把指针移回去。这就是 reset 可以“反悔”的原因。

git revert的逻辑完全不同。它接受一个提交作为参数,然后计算这个提交的“反向补丁”——原来添加的行变成删除,原来删除的行变成添加。然后把这个反向补丁应用在当前分支上,生成一个新的提交。原来的提交还在历史里,新的提交记录了“撤销操作”。这种方式对团队最友好,因为每个人的本地历史都能对得上。

git commit --amend则是另一种思路:它不移动指针,而是直接替换掉最后一次提交。Git 会把暂存区的内容和原来的提交信息合并,生成一个新的提交对象,然后让分支指针指向这个新对象。旧提交同样变成悬空状态。所以 amend 之后,提交的哈希值会变,这也是为什么 amend 过的提交不能直接 push 到远程——远程的提交哈希和本地不一致,会被拒绝。

3. git reset 实战:从软回退到硬回退的完整操作

3.1 三种 reset 模式的参数选择与操作演示

假设你刚刚提交了一次,commit message 是“临时保存”,现在想撤销这次提交但保留代码改动。先看当前状态:

git log --oneline -3 # a1b2c3d (HEAD -> main) 临时保存 # e4f5g6h 上一个正常提交 # i7j8k9l 更早的提交

现在执行软回退:

git reset --soft HEAD~1

执行后,git log里“临时保存”这条记录消失了,但git status会显示所有改动都在暂存区(绿色)。你可以直接重新 commit,或者调整后再提交。这是最安全的 reset 模式,因为它不碰工作区和暂存区的内容。

如果你想把改动从暂存区拿出来,重新选择要提交的文件,用默认的 mixed 模式:

git reset HEAD~1 # 等同于 git reset --mixed HEAD~1

这时候git status会显示改动在工作区(红色),需要重新git add。这个模式适合“提交早了,想重新组织提交内容”的场景。

最危险的是 hard 模式:

git reset --hard HEAD~1

执行后,工作区、暂存区、版本库全部回到上一个提交的状态。你刚才写的所有代码、修改的所有文件,全部消失。除非你之前 stash 过或者有 IDE 的本地历史,否则无法恢复。我个人的经验是:执行 hard reset 之前,先执行git stash或者复制一份代码到临时目录。多花十秒钟,能避免几个小时的返工。

注意:HEAD~1表示当前提交的父提交,HEAD~2表示祖父提交,以此类推。也可以直接用提交哈希值,比如git reset --hard e4f5g6h。如果只想移动指针不改变工作区,用--soft;想保留工作区但清空暂存区,用--mixed;想彻底丢弃所有改动,才用--hard

3.2 撤销已 push 的提交:force push 的正确姿势

本地 reset 之后,如果这个分支已经 push 过,直接git push会被拒绝,因为本地的历史比远程“落后”了。这时候需要强制推送:

git push --force-with-lease origin main

为什么我推荐--force-with-lease而不是--force?因为--force是无条件覆盖远程分支,如果在你 reset 期间有同事推送了新提交,这些提交会被你直接抹掉。而--force-with-lease会先检查远程分支的当前状态是否和你本地记录的一致,如果不一致就拒绝推送。这相当于一个安全锁,防止误伤他人的工作。

但即便如此,强制推送仍然是一个需要谨慎对待的操作。我的建议是:在共享分支上永远不要 force push。如果确实需要撤销已 push 的提交,用 revert。只有在个人分支上,并且确认没有其他人基于这个分支工作时,才考虑 force push。

如果你已经 force push 了,但发现撤销错了,想恢复怎么办?别慌,git reflog能救你。reflog 记录了 HEAD 的所有移动历史,包括 reset 操作。执行:

git reflog # a1b2c3d HEAD@{0}: reset: moving to HEAD~1 # b2c3d4e HEAD@{1}: commit: 临时保存 # ...

找到你想恢复的那个提交哈希(比如 b2c3d4e),然后:

git reset --hard b2c3d4e git push --force-with-lease origin main

这样就能回到 force push 之前的状态。reflog 默认保留 90 天,所以你有充足的时间反悔。但前提是你得记得这个命令的存在。

3.3 reset 的边界条件:哪些情况不能用 reset

reset 虽然强大,但有几个场景绝对不能碰。第一,共享分支上的公共提交。如果某个提交已经被其他人拉取并基于它开发,你 reset 掉它,别人的历史就会和你产生分叉,后续合并时会出现各种诡异问题。第二,已经打上 tag 的提交。tag 通常用于标记发布版本,reset 掉 tag 指向的提交会导致版本记录混乱。第三,受保护的分支。很多代码托管平台(如 GitHub、GitLab)对 main 分支开启了保护,禁止 force push,这时候 reset 后根本推不上去。

还有一种情况容易被忽略:子模块或 worktree。如果你在项目里使用了git worktree创建了多个工作目录,reset 主分支可能会影响其他工作目录的状态。操作前最好确认一下git worktree list的输出。

我自己的习惯是:每次执行 reset 之前,先跑一遍git status确认工作区干净,再跑git log --oneline -5确认要回退的位置,最后才执行命令。如果是 hard reset,还会额外执行git stash做一层保险。这套流程看起来繁琐,但能避免 99% 的误操作。

4. git revert 实战:团队协作中最安全的撤销方案

4.1 revert 单个提交与连续提交的操作方法

git revert的基本用法很简单:

git revert <commit-hash>

执行后,Git 会自动生成一个反向提交,并打开编辑器让你填写 commit message。默认的 message 是Revert "原来的提交信息",你可以直接保存退出。如果不想编辑,加--no-edit参数:

git revert --no-edit a1b2c3d

如果要撤销连续的多个提交,比如最近三次提交都有问题,可以指定一个范围:

git revert --no-edit HEAD~3..HEAD

注意这个范围是左开右闭的,HEAD~3..HEAD表示从 HEAD~3 之后到 HEAD 之间的提交,也就是最近三次。Git 会按照从新到旧的顺序依次 revert,每撤销一个就生成一个提交。如果中间某个提交 revert 时发生冲突,Git 会暂停并提示你解决冲突,解决完后执行git revert --continue继续,或者git revert --abort放弃。

这里有一个容易踩的坑:revert 一个合并提交(merge commit)时,需要指定-m参数。因为合并提交有两个父提交,Git 不知道你要保留哪一边的改动。比如:

git revert -m 1 <merge-commit-hash>

-m 1表示保留第一个父提交(通常是主分支)的内容,撤销合并进来的改动。这个参数选错了,revert 的结果会完全相反,所以操作前一定要用git show <merge-commit-hash>确认两个父提交分别是什么。

4.2 revert 之后想再恢复:revert 的 revert

有时候你 revert 了一个提交,过了一阵子发现那个功能其实还需要,想把它加回来。这时候不能直接再 revert 一次那个原始提交,因为原始提交的改动已经被抵消了,再 revert 一次等于什么都没做。正确的做法是revert 那个 revert 提交

假设历史是这样的:

git log --oneline -4 # d4e5f6g Revert "添加功能 A" # c3d4e5f 添加功能 A # b2c3d4e 其他提交 # a1b2c3d 更早的提交

现在想恢复功能 A,执行:

git revert --no-edit d4e5f6g

这会生成一个新的提交,内容就是重新添加功能 A。历史记录里会有“添加 A → 撤销 A → 重新添加 A”三条记录,虽然看起来有点绕,但逻辑是清晰的,而且对团队完全透明。

这种“revert 的 revert”在团队协作中非常常见。比如某个功能上线后发现 bug 被紧急 revert,修复后又重新 revert 回来。比起 force push 修改历史,这种方式虽然多几条记录,但每个人都能看懂发生了什么,也不会造成历史分叉。

4.3 revert 与 reset 的选型决策树

每次遇到撤销需求,我会在脑子里跑一遍这个决策树:

  1. 提交 push 了吗?没 push → 优先考虑 reset 或 amend;已 push → 进入下一步。
  2. 是共享分支吗?是 → 必须用 revert;不是 → 进入下一步。
  3. 有其他人基于这个分支工作吗?有 → 必须用 revert;没有 → 可以用 reset + force push。
  4. 需要保留完整的操作记录吗?需要 → 用 revert;不需要 → 可以用 reset。

这个决策树的核心逻辑是:只要涉及多人协作,就选最保守的方案。revert 虽然会多出提交记录,但它不会改变已有历史,不会导致别人的本地仓库和远程仓库产生分叉。而 reset + force push 本质上是在“重写历史”,只适合个人分支。

我见过一个真实的案例:一个团队在开发分支上用了 reset + force push 撤销了一个提交,结果另一个同事本地有基于那个提交的改动,push 时被拒绝,pull 时产生了一堆冲突,最后花了半天时间才把代码理顺。如果当初用 revert,这个问题根本不会发生。

5. git commit --amend 与撤销 push 的进阶技巧

5.1 amend 的三种典型用法:改信息、补文件、合并提交

git commit --amend是我日常用得最多的命令之一。它的核心作用是替换最后一次提交,有三种典型用法。

第一种,修改 commit message。刚提交完发现 message 写错了,或者想补充更详细的说明:

git commit --amend -m "新的提交信息"

第二种,补充遗漏的文件。提交后发现有个文件忘了加进去:

git add forgotten-file.js git commit --amend --no-edit

--no-edit表示沿用原来的 commit message,不打开编辑器。这样就把遗漏的文件合并到了上一次提交里,历史记录看起来更干净。

第三种,合并多个提交。如果你连续提交了好几次琐碎的改动,想合并成一次提交,可以用交互式 rebase:

git rebase -i HEAD~3

在打开的编辑器里,把后两行的pick改成squashfixup,保存退出后 Git 会把它们合并到第一个提交里。squash会保留所有 commit message 让你编辑,fixup则直接丢弃后面的 message。这个操作比 amend 更灵活,但同样只适合未 push 的本地提交。

注意:amend 之后提交的哈希值会变,所以如果已经 push 过,需要 force push 才能更新远程。在共享分支上,这同样是一个危险操作。我的原则是:amend 只用于本地未 push 的提交,push 之后就用 revert。

5.2 撤销 push 的完整流程与团队协作注意事项

撤销 push 分两种情况:个人分支和共享分支。个人分支相对简单:

git reset --soft HEAD~1 git commit -m "重新整理后的提交" git push --force-with-lease origin feature-branch

共享分支则必须用 revert:

git revert --no-edit <bad-commit-hash> git push origin main

这里有一个细节:如果被撤销的提交是一个合并提交,revert 时需要加-m参数。而且 revert 之后,如果后续想重新合并那个分支,Git 会认为那个分支的改动已经被合并过了,可能会忽略新的改动。这时候需要 revert 那个 revert 提交,或者使用git rebase --reapply-cherry-picks等高级技巧。这个问题比较绕,我一般会避免 revert 合并提交,而是 revert 合并提交里的具体改动。

团队协作中,撤销 push 之后一定要在群里同步一声。告诉同事你撤销了哪个提交、为什么撤销、他们需不需要做额外操作。如果同事本地有基于那个提交的改动,他们需要先 pull 最新的 revert 提交,再 rebase 自己的改动。沟通到位,能省掉很多排查冲突的时间。

5.3 reflog:你的最后一道后悔药

不管你是 reset 错了、amend 错了、还是 force push 错了,git reflog都是最后的救命稻草。它记录了 HEAD 指针的所有移动,包括 commit、reset、rebase、merge 等操作。默认保留 90 天,足够你找回任何“丢失”的提交。

git reflog --date=relative # a1b2c3d HEAD@{2 hours ago}: reset: moving to HEAD~1 # b2c3d4e HEAD@{3 hours ago}: commit: 重要功能 # c3d4e5f HEAD@{5 hours ago}: commit: 临时保存

找到你想恢复的提交哈希后,有几种恢复方式。如果只是想看看那个提交的内容,用git show b2c3d4e。如果想基于那个提交新建一个分支,用git branch recover-branch b2c3d4e。如果想直接把当前分支移回去,用git reset --hard b2c3d4e

我自己的经验是:每次执行危险操作之前,先跑一遍git reflog -5记下当前的哈希值。这样即使操作失误,也能快速定位到操作前的状态。这个习惯让我在无数次“手滑”中全身而退。

还有一个更极端的恢复场景:如果你不小心删除了一个分支,可以用git reflog找到那个分支最后的提交,然后重新创建分支。如果连 reflog 都找不到(比如超过了 90 天),还可以尝试git fsck --lost-found查找悬空对象。不过这种情况非常罕见,一般用不到。

6. 常见问题与排查技巧实录

6.1 reset 之后代码丢了怎么办

这是新手最容易遇到的问题:执行了git reset --hard,发现刚才写的代码全没了。别慌,按以下顺序尝试恢复。

第一步,检查git reflog。找到 reset 之前的提交哈希,然后git reset --hard <哈希>回去。这是最直接有效的方法,90% 的情况都能解决。

第二步,如果 reflog 里找不到(比如你 reset 之后又做了很多操作),检查 IDE 的本地历史。IntelliJ IDEA、VS Code 等编辑器都有 Local History 功能,可以找回最近修改的文件内容。

第三步,检查git stash list。如果你之前 stash 过,改动可能还在 stash 里。

第四步,检查操作系统的临时文件或回收站。有些编辑器会在保存时生成备份文件,比如 Vim 的.swp文件、Emacs 的~备份文件。

如果以上都找不到,那只能接受现实了。这也是为什么我反复强调:执行 hard reset 之前,先 stash 或者复制一份代码。十秒钟的预防,胜过一小时的抢救。

6.2 revert 时冲突不断怎么处理

revert 一个较老的提交时,很容易遇到冲突,因为那个提交修改的代码可能已经被后续提交改得面目全非了。处理冲突的流程和普通 merge 冲突一样:

git revert <commit-hash> # 遇到冲突,Git 会提示哪些文件有冲突 # 手动编辑冲突文件,保留需要的内容 git add <解决冲突的文件> git revert --continue

如果冲突太复杂,不想继续了,可以git revert --abort放弃这次 revert,回到操作前的状态。

减少 revert 冲突的技巧:尽量 revert 最近的提交。越近的提交,和当前代码的差异越小,冲突的概率越低。如果必须 revert 一个很老的提交,可以考虑先用git cherry-pick把那个提交的改动单独拿出来看看,确认影响范围后再操作。

还有一个技巧:如果 revert 的提交和当前代码差异太大,可以手动创建一个新提交来抵消旧提交的改动,而不是用git revert命令。虽然麻烦一点,但可控性更强。

6.3 force push 被拒绝的几种原因

git push --force-with-lease被拒绝,通常有以下几个原因:

错误提示原因解决方法
stale info远程分支有你不知道的新提交git pull --rebase,再重新 force push
protected branch分支受保护,禁止 force push联系管理员临时解除保护,或用 revert
non-fast-forward用了--force但远程有更新改用--force-with-lease,或先 pull
remote rejected权限不足确认你有该分支的推送权限

其中stale info最常见。它的意思是:你本地记录的远程分支状态已经过时了,远程有你没拉取的新提交。这时候应该先git fetch看看远程有什么变化,再决定是 rebase 还是 merge。直接--force会覆盖别人的提交,非常危险。

我自己的习惯是:force push 之前一定先git fetch origin,然后git log --oneline origin/main -3看看远程的最新提交。确认没有别人的新提交后,再执行git push --force-with-lease。这个流程能避免 99% 的误覆盖。

6.4 常见问题速查表

问题原因解决方案
reset 后代码丢失hard reset 清空了工作区git reflog找回,或 IDE 本地历史
revert 后想恢复功能revert 抵消了原提交revert 那个 revert 提交
amend 后 push 被拒提交哈希变了git push --force-with-lease
force push 覆盖了别人代码用了--force而非--force-with-leasegit reflog找回,重新 push
revert 合并提交报错没指定-m参数git revert -m 1 <merge-hash>
reset 后无法 push本地历史落后于远程git push --force-with-lease
撤销错了提交选错了哈希值git reflog回到操作前状态
共享分支被 reset误操作立即 revert 那个 reset 提交,通知团队

这张表建议打印出来贴在显示器旁边,遇到问题先查表,再操作。很多“疑难杂症”其实都是常见问题,有标准解法。

7. 我的个人经验与避坑清单

用了这么多年 Git,我总结了几条铁律,每次操作前都会在脑子里过一遍。

第一条:push 之前,先看git loggit status确认要提交的内容、提交信息、分支名称都正确。很多撤销需求其实在 push 之前就能避免。

第二条:共享分支上永远用 revert,不用 reset。这条规则帮我避免了无数次团队冲突。revert 虽然多几条记录,但安全、透明、可追溯。

第三条:hard reset 之前,先 stash 或复制代码。这个习惯让我在无数次手滑中保住了工作成果。多花十秒钟,省下几小时。

第四条:force push 只用--force-with-lease,不用--force这个参数能在覆盖远程之前检查是否有别人的新提交,是一道重要的安全锁。

第五条:遇到问题先查 reflog。90% 的“代码丢了”都能通过 reflog 找回。记住这个命令,关键时刻能救命。

第六条:不确定的操作,先在测试分支上练一遍。创建一个临时分支,模拟一遍操作流程,确认没问题再在主分支上执行。这个习惯对新手尤其重要。

最后分享一个我最近发现的技巧:如果你经常需要撤销提交,可以在.gitconfig里配置一些别名,简化常用命令。比如:

git config --global alias.undo "reset --soft HEAD~1" git config --global alias.unstage "reset HEAD --" git config --global alias.last "log -1 HEAD --stat"

这样git undo就等于git reset --soft HEAD~1git unstage就等于把暂存区的文件拿出来。虽然只是省了几个字符,但在高频操作时能明显提升效率。

Git 的撤销操作看起来复杂,但核心逻辑就那么几条:reset 是移动指针,revert 是追加反向提交,amend 是替换最后一次提交。理解了三区模型和指针原理,你就能根据场景灵活选择,而不是死记硬背命令。希望这篇内容能帮你摆脱“提交错了就重新 clone”的原始阶段,真正把 Git 用成顺手的工具。

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

电路设计中如何减少ESD:从原理到落地的完整思路拆解

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

作者头像 李华
网站建设 2026/9/20 15:58:54

Mathcad教程PDF怎么选?从阅读到导出计算书的全流程实操指南

简介&#xff1a;PDF 版 MathCAD 教程面向工程研究人员、学生等具备应用数学知识、但无需深厚计算机背景的读者&#xff0c;系统讲解这款交互式数值系统的核心用法。内容覆盖文件操作、ASCII 数据读写&#xff08;READPRN、WRITEPRN、READ、WRITE 等函数&#xff09;、编辑与对…

作者头像 李华
网站建设 2026/9/20 15:58:41

401 频繁掉线?TaoToken + Cursor 这样验证

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

作者头像 李华
网站建设 2026/9/20 15:53:47

微信小程序民宿预订系统毕业设计全流程实战指南

简介&#xff1a;一份针对计算机专业毕业设计的论文资料&#xff0c;围绕基于微信小程序的民宿预订系统展开&#xff0c;面向需要完成同类课题的本专科生、研究生及开发者。论文以springboot为后端框架&#xff0c;系统阐述了研究背景、目的意义、开发技术以及系统设计等内容&a…

作者头像 李华
网站建设 2026/9/20 15:53:45

BrewUI评测:Homebrew可视化面板,让Mac软件安装与依赖管理一目了然

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

作者头像 李华
网站建设 2026/9/20 15:53:44

官方渠道连不上,OpenClaw 改走 TaoToken 行不行?

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

作者头像 李华