弗拉基米尔·基谢廖夫 ⋯ 文章

减少“Changelog”的合并冲突。


为了减少 changelog 里的冲突,大家已经想过不少办法。可这些办法对我都不管用,只有一个新办法除外。

tl;dr 用目录结构来救场:https://github.com/nettsundere/cyberlog

  • 有些人用占位符。好主意。
“在 GitLab,我们是这样解决上面这个问题的:在 changelog 的顶部加上 100 行,每行只有一个连字符,用作占位符。” https://about.gitlab.com/2015/02/10/gitlab-reduced-merge-conflicts-by-90-percent-with-changelog-placeholders/
  • 有些人对单个文件使用不同的合并策略(merge=union)。如果 changelog 的每一行永远都独一无二,这个办法不错。可如果 changelog 里有些行的结尾不那么独特,这就是个坏主意了。到时候事情可能就这样出了错,而且谁都不会发现。解决冲突时,所有相似的行都可能被悄无声息地合并成一行。

有时候,我光是修 CHANGELOG 的合并冲突就要花上好几个小时。没错。那我们就用一种叫文件夹的二维文件存储来解决它吧。

我们把一个功能和它的 changelog 条目(一个文件)对应起来,而这个条目属于某个版本(一个文件夹)。

现在,changelog 的这些改动就很好管理了。我们可以 revert 某个功能的提交,什么坏事都不会发生。我们可以往同一个 branch 里再加几个功能,完全不会有冲突。changelog 条目想写多复杂都可以。

现在,你不必再为了不打乱同事的改动,把被编辑器设置删掉的空格一个个补回去了。大家也可以开开心心的,不用每次你又接受一个 pull request 时都去 rebase。

现在,一个功能的改动在 diff 里就是这个样子。你只会看到有意义的改动。

所需软件

其实,用这套做法并不需要任何软件。不过,如果能一次看到整个 changelog 或者某个版本的全部内容,会更方便。所以我决定做一个项目,叫“Cyberlog”。

Cyberlog 的帮助界面

目前它的功能还很有限。你可以操作条目和版本,可以查看某个版本或某个条目的改动,也可以查看全部改动。

接下来要做的

  • 用模板引擎进行定制(给潮人准备的集成)
  • SCM 集成(git-blame 等)
  • 转换功能(可以把旧的 CHANGELOG 转换成 Cyberlog 支持的新格式)
  • 多种呈现方式(说不定你需要 pdf?)

不打算做的

  • 编辑条目的功能。编辑日志时,你应该用自己喜欢的文本?编辑器。就连 photoshop 看起来都够用了。我能想象一份 changelog 里满是有意义的图片、视频和音频,用来解释各项改动。

项目源代码(BSD3)在这里:https://github.com/nettsundere/cyberlog

原文发表于 Medium:https://medium.com/@nettsundere/on-reducing-changelog-merge-conflicts-1eb23552630b