news 2026/9/16 3:51:44

AI生成代码时代,Git冲突手动解决最短流程:merge/rebase实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI生成代码时代,Git冲突手动解决最短流程:merge/rebase实战

今天早上我打开合并请求,红色 conflict 提示铺了 37 个文件,拉到第一个文件一看,真正的业务改动只有两行,剩下两百多行全是 AI 助手格式化、重排 import、顺手重构带来的噪音 diff。Git 冲突、merge、rebase 这几个词谁都会背,但在 AI 生成代码几乎渗透进每个功能分支的 2026 年,冲突早就不是"两个人都改了同一段代码"那么简单了。

这篇我来写一套在项目里反复验证过的 merge/rebase 冲突手动解决最短流程:从冲突类型识别、命令处理、IDEA 图形化操作,到 merge 回退和 rebase 的专属坑,全程目标是把一次冲突解决控制在 10 分钟以内。适合所有每天跟 feature 分支打交道、又用 AI 编程助手提效的开发者,尤其是被"整文件级冲突"搞到崩溃的那批人。

1. 为什么 AI 生成代码让 Git 冲突变成日常

1.1 AI 辅助开发改变的不只是速度,还有 diff 的形态

以前人工编辑代码,一个文件一次只改几行,diff 干净得像体检报告。现在让 AI 助手"优化一下这个函数",它经常直接给你重写整个方法体,甚至顺带调整参数名、补注释、改 import 顺序。你用 git diff 一拉,改动行数翻了十几倍,里面真正跟需求相关的可能就两三处。

更麻烦的是,AI 生成代码的"风格偏好"并不稳定。同一个文件,昨天让 AI A 优化了一遍,今天另一个同事让 AI B 加了个功能,两边生成出来的结构可能完全不一样。Git 合并时是按行比对的,行都变了,它就认为整个文件都是冲突区域。

典型的场景我在日常开发里见过太多次了,比如下面这个函数:

public double estimateBattery(double level) { return level * 100; }

一端让 AI"加低电量警告",它返回:

public double estimateBattery(double level) { if (level < 0.2) { return Math.round(level * 100) + "% (low)"; } return Math.round(level * 100) + "%"; }

另一端让 AI"用百分比显示电量",它可能把方法签名、返回值、注释全改一遍。两边往同一分支一合,Git 直接把整个函数区域标成冲突。这种冲突本质上不是业务逻辑打架,而是"两边生成结果的表达方式打架"。

1.2 冲突的四种真实形态

Git 冲突听起来只有一种,实际上手你会发现有四种典型形态,解决办法侧重完全不同:

冲突类型表象典型场景
内容冲突同一文件的同一行两侧都改了两边都改了同一个函数体
双向修改同一文件不同位置被同时改动,合并算法无法自动合并一端改函数 A,另一端改了函数 B,但 Git 认为改动重叠
rename/modify一端重命名文件,另一端修改原文件AI 重构时把某个工具类改名,另一端的业务代码还引用旧文件
add/add两端都新增了同名文件两个人都让 AI"生成一个 DateUtil",文件名撞车

平时我们口里的"解决冲突",绝大多数是第一种和第二种,也就是文件里的冲突标记问题。但第三种和第四种在 AI 生成代码时代特别常见——AI 重构喜欢改文件名、挪目录,AI 又特别喜欢生成各种工具类,撞名率非常高。

不管哪种类型,Git 都会在冲突文件里留下标记,长这样:

<<<<<<< HEAD public double estimateBattery(double level) { return level * 100; } ======= public String estimateBattery(double level) { double pct = Math.round(level * 100); return level < 0.2 ? pct + "% (low)" : pct + "%"; } >>>>>>> feature/ai-battery

这段东西就是 Git 给你留的"待办清单":<<<<<<< HEAD=======之间是当前分支的内容,=======>>>>>>>是正在合入分支的内容。你的工作就是把两个版本合成一个,然后把三行标记删干净。

1.3 为什么要追求最短流程,而不是遇到就硬解

冲突处理是开发里最烧脑的操作,因为它等于"代码审查 + 手工合并 + 理解双端意图"三件事叠在一起,本身已经够累了。如果每次冲突没有一个固定的处理套路,人很容易来回读代码、反复切换上下文,最后一个小冲突拖一下午。

在 AI 生成代码的背景下,这个成本还会被放大。因为噪音 diff 太多了,把"真冲突"淹在"假冲突"里。没有最短流程的话,你会在大量无意义的格式化差异上消耗精力,等真正有业务含义的冲突出现时,脑力已经被耗干了。

所以我的核心思路是:先建立一套固定动作,遇到任何冲突都按同一个路径走,把决策集中在"保留哪一侧"上,而不是浪费在"我该先看哪个文件""要不要回退""这算不算冲突"这些琐碎判断上。

2. 冲突落地前:两个配置加一次同步,挡掉一半噪音冲突

2.1 .gitignore 和 .gitattributes 是第一道防线

很多人不重视 .gitignore,觉得它只是防止把 node_modules 提交进去。实际上在团队协作里,大量冲突根本不是源代码冲突,而是 IDE 配置、本地生成文件、换行符差异造成的"伪冲突"。我接手项目时第一件事永远是检查这两个文件。

.gitignore 至少要覆盖这几类:

# IDE .idea/ .vscode/ *.iml # 构建产物 dist/ build/ target/ out/ # 依赖 node_modules/ venv/ __pycache__/ # 环境与本地配置 .env.local *.local

任何一个团队成员如果没配好这些,把本地配置提交进来,后面每次合并都可能出现.idea/workspace.xml冲突。这种冲突毫无营养,纯属浪费时间。

.gitattributes 的重要性更常被忽略。它决定了 Git 怎么处理文件属性,尤其是换行符。Windows 的 CRLF 和 macOS/Linux 的 LF 混在一个仓库里,Git 会认为每个文件的每一行都变了,一个 500 行的文件会直接变成 500 行冲突。这就是典型的"看起来冲突很严重,实际上一行代码都没冲突"。

最小配置建议:

* text=auto *.java text eol=lf *.py text eol=lf *.js text eol=lf *.ts text eol=lf *.sh text eol=lf *.bat text eol=crlf

text=auto让 Git 自动识别文本文件并统一换行;针对具体语言强制 LF,只有 Windows 批处理保留 CRLF。这套配置下去,跨平台协作产生的整文件冲突能消掉一大半。

2.2 合并前先同步远程分支,减少"时间差冲突"

大量冲突的根源其实是分支分叉太久。你基于三周前的 main 建分支,隔壁团队三周里往 main 合并了 40 个提交,你这时候合过去,不冲突才怪。这不是"别人故意改你的代码",是信息差太大。

我推荐的做法是两种同步习惯二选一,取决于分支是否共享:

分支只在自己手里、还没被其他人拉取时,用 rebase 保持线性历史:

git fetch origin git checkout main git pull --ff-only git checkout feature git rebase origin/main

分支已经推上去、团队其他人可能也在用时,用 merge 更安全:

git fetch origin git merge origin/main

关键点在于:在你开始大规模修改之前先同步,永远比改到一半再同步冲突少。你可以理解成修路时先清场再施工,和车流堵成一团再去疏导的区别。

2.3 冲突发生后的 30 秒"路口检查"

冲突已经发生了,第一反应别急着打开文件瞎改。先在终端跑三条命令:

git status git diff --name-only --diff-filter=U git log --oneline --graph --all -15

第一条看哪些文件处于未合并状态;第二条只看冲突文件列表,它跟git status里那一大坨红色提示的区别是干净、一眼看清有多少个真冲突;第三条看当前分支和目标分支的分叉图形,能帮你快速判断这次冲突的规模级别。

这个"路口检查"的意义是决策前置。如果冲突文件只有一两个,手动解;如果冲突文件大几十个,八成不是真冲突,可能是换行符或格式化问题,先查 .gitattributes;如果发现自己 rebase 错了分支,这时候 abort 还来得及,不用在错误方向上越走越远。

3. merge/rebase 冲突手动解决的最短流程:7 步走完

3.1 最短路径总览:从 fetch 到 continue

这是本文的核心。无论 merge 还是 rebase,手动解决冲突的动作几乎一模一样,只有最后一步的命令不同。我把流程收敛成 7 步,贴在终端旁边照着走就行:

步骤命令/操作目的
1git fetch origin把远程引用同步到本地,确保合并的是最新内容
2git merge origin/maingit rebase origin/main发起合并,让冲突暴露
3git status定位 U 状态文件(Unmerged)
4git diff逐个查看冲突块理解两侧各自想干什么
5手动编辑文件,或git checkout --ours/--theirs产生最终版本
6git add <file>告诉 Git"这个文件已经解决"
7git merge --continuegit rebase --continue完成合并并生成提交

为什么是这个顺序?因为它是一个"暴露—诊断—决策—提交"的闭环。第 2 步让 Git 把所有冲突一次性列出来,第 3 步和第 4 步保证你只处理真问题,第 5 步和第 6 步是唯一需要动脑的地方,第 7 步收尾。

3.2 手动编辑冲突标记:最古老也最可靠的方式

手动编辑是唯一通用做法,因为工具可能失灵,但文件里的<<<<<<<=======>>>>>>>永远不会消失。你只需要理解一件事:冲突标记是 Git 给你的"三明治",上下两片是两边的代码,你要做的就是把中间的馅合成一个合理的结果,然后把三片面包叼出去。

处理策略有三个判断优先级:

  • 如果一侧是 AI 生成的格式化噪音,另一侧是真正的业务改动,保留业务侧,删掉噪音侧。这种情况在 AI 生成代码时代占比至少一半。
  • 如果两侧是完全不同的功能,例如一端加了低电量提示、另一端改了电量计算精度,两个都要,按逻辑合进同一个函数体。
  • 如果其中一侧明显是旧逻辑、旧接口已经废弃,直接删掉旧侧。

以最前面的例子来说,合并后的结果可能是:

public String estimateBattery(double level) { double pct = Math.round(level * 100); if (level < 0.2) { return pct + "% (low)"; } return pct + "%"; }

保存文件后git add,这一步就算结束了。注意这三个标记行一个都不能剩,哪怕你把两侧内容原样保留,标记行没删,编译也会炸。

3.3 命令级半自动:checkout --ours/--theirs 怎么用不踩坑

如果一个冲突文件里 90% 都是某一侧的内容,另一侧只有个别几行改动,你可以用命令直接整文件选择一侧,再人工补回那几行:

git checkout --ours <file> git checkout --theirs <file>

这里有一个全 Git 最容易搞混的语义差异,必须说清楚:merge 的时候,ours 是当前所在分支,theirs 是要合入的那个分支;rebase 的时候,语义是反过来的,ours 是 rebase 的目标基底,theirs 才是你自己的提交。

用交叉记忆法:在 rebase 场景里,"theirs"恰恰是"你自己"的东西,因为它是在"别人的基底之上重放你的提交"。所以:

  • merge 中想保留当前分支版本:git checkout --ours
  • merge 中想保留被合并过来的版本:git checkout --theirs
  • rebase 中想保留别人的基底版本:git checkout --ours
  • rebase 中想保留你原来的改动:git checkout --theirs

选错一侧不丢人,也丢不了代码。如果发现自己选错了,可以用git checkout -m <file>重新把文件恢复到冲突状态,再走一遍手动解决流程。

3.4 解决完冲突之后的验证动作

很多人的流程走到git add就结束了,这是非常危险的。git add只代表"你已经告诉 Git 这个问题解决了",不代表"你解决的是对的"。合并过程中大脑要处理大量信息,非常容易看漏一侧的改动,或者把某个文件整个选错版本。

我每次在git add之后、--continue之前,固定做三件事:

git diff --check

这条命令检查空白错误,比如行尾空格、文件末尾缺少换行。然后编译当前分支,太重的项目至少也要跑目标模块的构建。最后如果改动涉及核心逻辑,本地跑一遍相关用例再 continue。

确认没问题后运行:

git merge --continue

或:

git rebase --continue

如果是老版本 Git 没有merge --continue,直接git commit也能完成同样的效果。rebase 过程中如果遇到反复冲突、想放弃当前这个提交的重放,可以用git rebase --skip;整个局面彻底失控,就用git rebase --abort回到 rebase 之前的干净状态,这个命令不会丢你已经提交到分支上的任何提交,只是放弃本次 rebase 操作。

4. IDEA 图形化解冲突实战:弹窗、回退 merge、abort 三类操作

4.1 用 Merge 弹窗做逐文件合并

很多同学不习惯在终端里看大段 diff,IDEA 的图形化解决窗口确实更直观。入口一般是VCS -> Git -> Resolve Conflicts,或者在提交窗口里看到红色冲突文件时点 "Resolve"。

弹出窗口是典型的三栏布局:左侧是当前分支版本(Local/HEAD),中间是结果区,右侧是合入版本(Remote)。一个个高亮块点过去,用工具栏的左右箭头把某侧内容挪到中间。对 AI 生成代码的场景,特别推荐先用中间结果区看一眼"默认合出来的样子",再决定哪些块要换成哪一侧。

几个图标的作用必须搞清楚,很多人点了半天不知道自己在干嘛:

  • >>表示采用右侧内容到结果区
  • <<表示采用左侧内容到结果区
  • 选中结果区某一行后按删除键,表示这一行两边都不要

解决完所有高亮块后点 Apply,文件会自动标记为已解决。但我不建议完全信任 IDEA 的自动标记,回到终端跑一下git status,确认没有 U 状态残留,再继续之后的 merge/rebase 流程。

4.2 回退 merge 操作:三个场景的救命流程

这个真的是高频需求,尤其当你 merge 错了分支、或者发现冲突太复杂想回到合并前状态。根据 merge 进行到哪个阶段,处理方式完全不同。

场景 A:merge 还在进行中,冲突一堆但你不想解了。直接:

git merge --abort

这个命令会把你完全带回 merge 之前的状态,工作区改动不会被保留,但所有已提交内容都在,绝对安全。

场景 B:merge 已经完成并且生成了 merge commit,你想撤销这次合并。这时候 --abort 已经没用了,用 reflog:

git reflog

reflog 记录的是 HEAD 所有移动历史,你会看到类似HEAD@{1}: merge origin/main: Merge made by the 'ort' strategy.这样的行。HEAD@{1}就是合并之前的位置,执行:

git reset --hard HEAD@{1}

就能回到合并前。注意这条命令会丢弃工作区未提交的改动,执行前先 stash。

场景 C:rebase 进行中后悔了。不区分阶段,直接:

git rebase --abort

rebase 和 merge 不一样的地方在于,rebase 在成功完成前不会改变你原来的提交,所以 abort 一定能回到 rebase 开始前的状态,不需要担心丢提交。

对应到 IDEA 里,Git 工具窗口的 Log 面板上,找到 merge commit,右键选Undo Commit或者Reset Current Branch to Here,效果和 reflog 那条命令一致,但图形界面下你能看到确切的提交节点,更安心。

4.3 让 AI 工具辅助解析,但保留人类拍板

现在不少 AI 编程助手已经能在冲突标记上直接给合并建议,你只要在编辑器里打开冲突文件,AI 会列出它认为合理的合并结果,一键替换。我的态度是:可以用,但绝不能无脑 Apply。

原因在于,AI 在生成合并建议时,依据的是代码文本语义,它不知道你们团队当前迭代的业务优先级。比如一端把旧接口废弃了、另一端还在用旧接口调用,AI 可能会把两段代码都保留,然后编译直接失败。AI 适合帮你把冲突块从"两堆代码"整理成"一段可读代码",但最终保留什么、删掉什么,必须由你基于业务上下文拍板。

我自己常用的方式是先让 AI 给出候选合并版本,然后用git diff对照两侧原始内容,确认没有丢掉任何预期逻辑后再 add。整个过程花不了两分钟,比从零手写快得多,又不会在大方向上翻车。

5. rebase 专属难题:重复冲突、stash 与远程分支合并的选择

5.1 rebase 为什么会让你反复解同一个冲突

用 rebase 解决冲突最劝退的地方在于,它可能让你觉得自己像个傻子——同一个地方的冲突,怎么解了三遍还没完?这不是幻觉,是 rebase 的工作机制决定的。

merge 是"把两边的最终结果并一下",一次合并只有一次冲突处理;rebase 则是把你当前分支上的每一个提交,从旧基底上一个一个摘下来,再一个一个放到新基底上。你的分支上有 5 个提交,且每个提交都动了同一个函数,rebase 到 origin/main 时,这个函数就可能跟主干的改动冲突 5 次,每重放一个提交就撞一次。

三个应对办法:

一是减少提交数量。先把多个小提交压成一个逻辑清晰的提交,再 rebase:

git rebase -i origin/main

交互式界面里把多个pick改成squash,合并成一个提交后,同一个冲突最多只会出现一次。

二是开启 rerere:

git config --global rerere.enabled true

rerere 全称 "reuse recorded resolution",Git 会把你在某块冲突上的处理方式记录下来,下次遇到一模一样的冲突块时自动采用上次的解决结果。对 AI 生成代码来说这招特别实用,因为 AI 产生的冲突块高度相似,rerere 能把重复劳动省掉一大半。

三是 rebase 之前先把未提交的改动 stash 起来,保证 rebase 过程中每个提交都是干净的、可重放的,避免"改动混在一起导致冲突块无法自动匹配"。

5.2 stash 储藏:切分支之前的不提交方案

AI 辅助开发时代,很多人改代码胆子变大了但也更容易半途而废——让 AI 改到一半,线上突然报了个 bug,需要切回 main 紧急修复。当前分支的改动既不想提交、也不想丢,这时候 stash 就是唯一正解。

git stash push -m "battery optimize wip" git checkout main # 修复线上 bug,提交推送 git checkout feature git stash pop

git stash push把工作区改动保存到一个暂存栈里,工作区恢复干净,可以随时切换分支。回到 feature 分支后用git stash pop把改动弹回来。

这里有一个新手容易踩的坑:pop 有可能冲突。因为 stash 保存的是改动,不是提交,弹回来时 Git 会在当前分支的最新状态上重新应用这些改动,如果当前分支状态已经变了,就会冲突。解决方式和普通 merge 冲突一模一样——用第 3 章那套流程。另外,pop 冲突时你不用担心 stash 里的改动被覆盖,它还在 stash 栈里,需要手动处理完后用git stash drop清掉。

如果怕 pop 出问题,可以先用git stash apply(不会自动 drop),确认没问题再手动 drop。稳妥优先。

5.3 远程分支合并:什么情况用 merge,什么情况用 rebase

进到这个话题就必须给结论了,很多人纠结 merge 还是 rebase,本质是没想清楚自己的分支处于什么状态。给张决策表直接抄:

场景推荐原因
本地 feature 分支,还没 push 给别人rebase保持线性历史,合并时更清爽
分支已经 push 且团队共享mergerebase 会重写提交hash,其他人拉取后会出乱子
需要保留完整合并记录和审计信息mergerebase 会改写提交者和提交时间
主干更新频繁、想减少冲突小步频繁 rebase 或 merge 主干到自己分支缩小分叉窗口

铁律只有一条:已经推送到远程、且被其他人拉取过的公共分支,永远不要 rebase。那本质上是在重写历史,所有拉过这个分支的人下次 pull 时都会遇到"两个完全不同的历史"。

6. 从源头减少 AI 代码冲突:我给协作团队定的三条纪律

6.1 纪律一:AI 生成代码走最小改动原则

AI 助手最大的特点是把事情做过头。你让它"修个 bug",它顺手把整个类的命名风格改了;你让它"加个参数",它把整个方法的重构方案都给你了。所以第一条纪律是在提示词里明确约束边界:只改指定函数,不重构整个文件,不重排方法顺序,不修改不相关的 import。

生成之后用git diff --stat检查改动范围。如果显示的改动行数已经超过几百行,而你预期的功能改动只有几十行,基本可以直接放弃这次生成结果,重新组织提示词再来一次。这个过程要养成习惯,不要觉得多跑一次浪费时间,乱序重构导致的冲突解决时间,远比重生成一次要长得多。

6.2 纪律二:格式化与业务功能分开提交

AI 生成的代码经常附带一堆格式变化:空行多了、注释风格改了、import 顺序变。这些改动的危害不在于格式本身,而在于它会把 diff 变成一团浆糊,让后续冲突处理根本分不清哪里是真业务改动、哪里是噪音。

解决办法是 .editorconfig 加统一 formatter,让 AI 输出自动兼容项目规范,格式差异在生成阶段就被抹平。同时约定每次提交只做一类事情:feat: xxx就只包含业务逻辑改动,style: format就只包含格式化改动。这样即使后期出了冲突,同类冲突文件放一起处理,效率高得多。

还有一条非常重要的操作纪律:AI 生成代码后,人工必须 review 之后再 commit,不要用 IDE 的 "Commit All" 一把梭。AI 的产出只是草稿,不是最终结果。

6.3 纪律三:短分支、小提交、每天同步

AI 让代码产出速度变快之后,分支的存活时间反而成了冲突的最大变量。一个 feature 分支超过 5 天不更新主干,冲突概率几乎是指数级上升。原因很简单:主干每更新一次,你的分支和主干的差异就大一点,等到要合的时候,差异已经大到 Git 完全看不懂了。

对应的约束是:分支只做一件事,做完立刻合;每个提交控制在 50~200 行左右,保持"一个提交一个逻辑单元"。然后每天开工第一分钟做一次同步:

git fetch origin git rebase origin/main

团队规范要求用 merge 的话,就把第二句换成git merge origin/main,效果一样,关键是"每天都做"这件事本身。

把 AI 生成代码场景下的常见冲突源和预防手段汇总一下:

冲突源预防手段
AI 全文件重写提示词声明最小改动,生成后看 diff --stat
import/格式化噪音.gitattributes + editorconfig + 统一 formatter
AI 生成同名工具类提交前 code review,提前暴露命名冲突
分支积累太久短生命周期分支,每天同步主干
换行符不一致.gitattributes 统一 eol

最后补一个我自己用了很久的私货命令,算是这个最短流程的隐藏加速器:把git config --global rerere.enabled true打开。开启之后,Git 会记住你对某个冲突块的解决方式;AI 生成代码时代,冲突块高度相似,rebase 连续多个提交时经常出现同一个冲突重复出现的情况,rerere 会自动把你已经处理过的块重放掉,你只需要人工确认有差异的部分。我实测在 5 个提交连续冲突的场景下,花在重复冲突上的时间能省掉一大半。如果非要给个经验值:一个文件冲突超过十分钟还理不清,我会直接 abort 回到干净状态,更新分支后重新合并,往往比硬刚更快。

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

Docker部署SRS:快速搭建实时流媒体服务

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

作者头像 李华
网站建设 2026/9/16 3:50:18

试卷手写擦除全流程:数据合成、U-Net训练与OCR评估

简介&#xff1a;基于深度学习的试卷手写文字擦除毕业设计资料包&#xff0c;面向计算机视觉方向学生与毕业设计开发者&#xff0c;聚焦去除图像中的手写文字并保留背景信息。整套资源共29个文件&#xff0c;以22个Python源码为核心&#xff0c;覆盖模型结构&#xff08;如SA-G…

作者头像 李华
网站建设 2026/9/16 3:49:23

UE5编译报错Could not be compiled?从日志到环境全链路排查指南

你肯定见过这个红色大边框提示&#xff1a;“UE5 Could not be compiled. Try rebuilding from source manually.” 不少朋友第一次看到时直接懵了&#xff0c;明明刚才还好好的&#xff0c;怎么突然就编译不过了呢&#xff1f;尤其当你正赶一个移动端策略游戏原型、或者刚从代…

作者头像 李华
网站建设 2026/9/16 3:48:52

Agent插件生态构建指南:从协议设计到安全分发实践

这几年做Agent开发的朋友应该都有同一种体感&#xff1a;单机版Agent已经不够玩了。你把记忆、工具调用、多步规划这些能力全塞进一个Agent里&#xff0c;折腾半天&#xff0c;场景还是那么几个&#xff0c;边界还是卡在那里。真正的分水岭&#xff0c;是当你开始琢磨“怎么让别…

作者头像 李华
网站建设 2026/9/16 3:48:22

ArcGIS栅格裁剪全攻略:从影像到DEM的实操指南

直接进入正题。搞GIS的十有八九都躲不开这活儿&#xff1a;手里拿着研究区的矢量边界&#xff0c;要一批影像或者DEM数据&#xff0c;结果下载下来是全图幅的大文件&#xff0c;动辄几个GB&#xff0c;死活加载不动。这时候就得裁剪。ArcGIS里裁剪栅格数据的方法看着不止一种&a…

作者头像 李华
网站建设 2026/9/16 3:46:47

Spring Boot 2.6.13集成Flowable 6.8.1工作流引擎实战指南

接手老项目&#xff0c;要在 Spring Boot 2.6.13 里把 Flowable 6.8.1 工作流引擎拉进来&#xff0c;做审批流和业务解耦的那套东西。老实说&#xff0c;刚拿到这个任务的时候我心里是有点底的&#xff0c;毕竟 Flowable 在 Java 生态里算老熟人&#xff0c;Spring Boot 集成它…

作者头像 李华