撤销前先做一次依赖盘点,把“同一处内容被后续改动引用过”的条目单独列出,再决定是整体回退还是只回退目标改动。判断依据不是改动时间先后,而是后续变更是否读取了被撤销内容的值、结构或标识。
值依赖指后续改动直接复制或引用了被撤销内容的具体文本、数值、链接地址。位置依赖指后续改动依赖被撤销内容所在的位置,例如它后面的段落编号、它生成的锚点、它占用的文件名。两类依赖的撤销代价不同。
如果一次修改只是调整了自己的措辞,没有产生新的标识或数值,后续改动多半只是位置依赖,回退范围可以小一些。反之,若这次修改新增了标题锚点、图片文件名或引用编号,后续引用它的改动就要一并处理。
这种情况下没有自动依赖记录,只能靠文件内容比对。实际动作是:先找出被撤销改动引入的唯一字符串,例如一个新标题或一个新文件名,然后在全部内容文件里搜索这个字符串。
搜索结果里出现同一字符串,不等于一定存在依赖。它可能是巧合的相同措辞,也可能是模板里的固定文案。区分方法是看该处是否随被撤销改动一起变化:如果被撤销改动改回后,这处内容在语义上仍然成立,就不必动它。
假设例子:某篇博文原有一句“下载地址见文末”,后来改成“下载地址见第三节”,之后另一篇文章引用了“第三节”这个说法。撤销前一次改动后,后一篇文章的引用就失去依据。此时应把后一篇文章的引用改为不依赖节号的表述,而不是整体回退后一篇文章。
这种情况下可以借助提交历史判断依赖,但仍不能只看时间顺序。实际动作是:定位被撤销改动对应的那次提交,查看它之后有哪些提交修改了同一批文件或同一段内容。
冲突提示只是信号,不是结论。冲突可能来自相邻行的无关改动,也可能来自真正的依赖。判断方法是看冲突两侧是否共享同一个被撤销的值或标识。共享,则属于依赖;不共享,则只是位置相邻。
执行回退后,不要立刻发布。先在一个隔离的本地副本里完成回退,观察三类结果,再决定是否推送到线上。
如果第二类结果无法确认,下一步不是继续回退更多内容,而是缩小回退范围,只撤销被撤销改动中产生依赖的那一小部分。一次回退越集中,后续判断越容易。
当被撤销内容已经被外部引用,例如被其他站点链接、被订阅者保存、被搜索结果缓存,回退目标改动会让这些外部引用指向失效内容。这时更稳妥的做法是保留原位置,只修正内容本身,让旧标识继续可用。
另一种例外是后续改动已经形成新的独立结构,例如围绕被撤销内容新增了一整个栏目。此时回退目标改动相当于抽掉栏目地基,应改为在栏目内替换内容,而不是删除位置。
判断是否属于例外,可以问一句:回退后,是否有任何外部或内部入口会落到空处。若有,就优先保留位置、替换内容;若没有,才执行整体回退。