문제
정기 점검에서 브랜치 상태를 보고할 때, 이전에 기록해 둔 해시와 지금 보이는 해시가 다르면 ‘앞으로 나갔다’고 결론 내리기 쉽다. 하지만 해시가 다르다는 사실은 방향을 알려주지 않는다. 지금 보고 있는 커밋이 이전 커밋의 조상일 수도 있고, 서로 갈라진 다른 줄기일 수도 있다. 한 번 잘못 쓴 문장이 라운드마다 복사되면, 실제로는 한 번도 움직이지 않은 브랜치가 수십 번 ‘전진’한 것으로 기록된다.
해시 비교는 순서 비교가 아니다
두 해시가 다르다는 것은 ‘같지 않다’는 뜻일 뿐이다. 앞섬과 뒤처짐은 커밋 그래프의 관계에서만 나온다. 보고에 쓰는 표현이 전진·후퇴·동기화처럼 방향을 담고 있다면, 그 방향을 만들어 낸 관계를 먼저 확인해야 한다. 날짜도 근거가 되지 못한다. 커밋 날짜가 더 이른 커밋이 그래프에서는 더 앞에 있을 수 있다.
방향을 만드는 최소 확인
1. 이전 해시와 현재 해시의 관계를 조상 여부로 확인한다. 한쪽이 다른 쪽의 조상이면 방향이 정해지고, 아니면 분기다.
2. 두 지점 사이의 ahead/behind 개수를 함께 읽는다. ahead 0 / behind 0이면 같은 지점이고, 양쪽이 모두 0이 아니면 갈라진 것이다.
3. 브랜치 이름이 아니라 확인한 해시를 보고에 남긴다. 이름은 언제든 다른 커밋을 가리키게 된다.
복사된 문장이 오류를 증식시킨다
반복 점검의 가장 큰 위험은 첫 오판이 아니라 그 문장이 템플릿이 되는 것이다. 지난 보고를 붙여 넣고 숫자만 바꾸면 검증되지 않은 주장이 매 라운드 새로운 증거처럼 보인다. 보고 문장은 이번 라운드에 실제로 실행한 확인에서 다시 만들어야 하고, 이전 라운드와 동일한 결론이라면 ‘변동 없음’이라고 쓰는 편이 정확하다.
정정도 같은 자리에 남긴다
잘못된 상태 보고를 발견하면 조용히 다음 보고만 고치지 말고, 같은 지면에 이전 주장이 틀렸다는 사실과 실제 관계를 함께 남긴다. 반복된 오보는 그 수만큼 신뢰를 깎았기 때문에, 정정 역시 같은 가시성을 가져야 한다.
완료 기준
브랜치 상태 보고는 방향을 주장하는 모든 문장이 이번 라운드에 실행한 조상·ahead/behind 확인에 연결되고, 인용한 해시가 실제로 확인한 해시이며, 이전 라운드의 문장을 복사하지 않았을 때 완료다.
The trap
When a recurring check reports branch state, seeing a hash different from the one recorded last time makes ‘it moved forward’ feel obvious. But difference carries no direction. The commit in front of you may be an ancestor of the one you recorded, or it may sit on a diverged line. Once that sentence is written, later rounds copy it, and a branch that never moved gets reported as advancing again and again.
Different hashes are not ordered hashes
Two hashes being different means exactly that: not equal. Ahead and behind exist only in the commit graph. If your report uses directional words — advanced, moved, caught up, in sync — the relation behind that direction has to be checked first. Commit dates do not settle it either; an older-dated commit can sit later in the graph.
The minimum check that produces a direction
1. Ask whether one hash is an ancestor of the other. If it is, the direction is fixed; if neither is, the lines diverged.
2. Read the ahead/behind counts between the two points in the same pass. Zero on both sides means the same point; non-zero on both sides means divergence.
3. Quote the hashes you verified, not the branch name. A name will point at a different commit tomorrow.
Copied sentences multiply the error
The real damage in a recurring check is not the first wrong call — it is that the wrong sentence becomes a template. Paste the previous report, change a number, and an unverified claim looks like fresh evidence every round. Rebuild the sentence from the check you actually ran this round, and when the conclusion is the same as before, write ‘unchanged’, which is the accurate statement.
Put the correction where the claim lived
When you find that a status line was wrong, do not quietly fix only the next report. Record, in the same place and with the same visibility, that the earlier claim was false and what the real relation is. Repeated misreporting spent trust repeatedly, so the correction has to be equally visible.
Completion bar
A branch-state report is done when every directional sentence traces to an ancestry and ahead/behind check performed in this round, the hashes quoted are the hashes verified, and no sentence was copied from the previous round.
陷阱
在周期性巡检里汇报分支状态时,只要看到的哈希和上次记录的不同,就很容易得出“已经前进”的结论。可是“不同”并不包含方向。眼前这个提交可能是上次那个提交的祖先,也可能落在一条已经分叉的线上。这句话一旦写下,后面的巡检就会照抄,于是一条从未移动过的分支被反复记成“持续前进”。
哈希不同不等于先后有序
两个哈希不同,只说明它们不相等。领先与落后只存在于提交图的关系之中。如果汇报里用了前进、追平、同步这类带方向的词,就必须先确认支撑这个方向的关系。提交日期同样不能作为依据:日期更早的提交,在图里完全可能位于更后面。
得出方向所需的最小确认
1. 先判断两个哈希之间是否存在祖先关系。存在,方向就确定;都不是对方的祖先,就是分叉。
2. 同一次操作里读出两点之间的 ahead/behind 数量。两边都是 0 表示同一个位置,两边都不是 0 表示已经分叉。
3. 汇报里引用你亲自确认过的哈希,而不是分支名。名字明天就会指向另一个提交。
复制来的句子会放大错误
周期性巡检真正的伤害不是第一次判断错误,而是那句错话变成了模板。把上一份汇报粘过来、只改数字,未经验证的说法每一轮都像是新证据。汇报句子必须由本轮真正执行过的确认重新写出;如果结论与上轮相同,写“无变化”才是准确的。
更正要留在原来的位置
发现状态描述错了,不要只是悄悄改好下一份汇报。要在同一个位置、以同样的可见度写明先前的说法不成立以及真实关系是什么。重复的错报重复消耗了信任,更正也必须同样醒目。
完成标准
分支状态汇报的完成标准是:每一句带方向的话都能追溯到本轮执行的祖先与 ahead/behind 确认,引用的哈希就是验证过的哈希,并且没有任何句子是从上一轮复制来的。
罠
定期点検でブランチの状態を報告するとき、前回記録したハッシュと違う値が見えると「前進した」と結論づけたくなる。しかし、違うという事実に方向は含まれていない。目の前のコミットは前回のコミットの祖先かもしれないし、分岐した別の線上にあるかもしれない。その一文がいったん書かれると次の周回でコピーされ、一度も動いていないブランチが何度も「前進」したことになる。
ハッシュの相違は前後関係ではない
二つのハッシュが違うのは、等しくないという意味でしかない。先行と遅れはコミットグラフの関係からしか出てこない。報告に前進・追いつき・同期といった方向を含む語を使うなら、その方向を支える関係を先に確認する。コミット日時も根拠にならない。日付が古いコミットがグラフ上では後ろにあることもある。
方向を生む最小限の確認
1. 一方が他方の祖先かどうかを確かめる。祖先関係があれば方向は決まり、どちらでもなければ分岐である。
2. 同じ操作で二点間の ahead/behind の数も読む。両方 0 なら同じ地点、両方 0 でなければ分岐している。
3. ブランチ名ではなく、自分で確認したハッシュを報告に残す。名前は翌日には別のコミットを指す。
コピーされた文章が誤りを増やす
繰り返す点検で本当に痛いのは最初の誤判定ではなく、その一文がテンプレートになることだ。前回の報告を貼り付けて数字だけ変えると、検証していない主張が毎回新しい証拠のように見える。報告文は今回実際に行った確認から作り直し、結論が前回と同じなら「変化なし」と書くほうが正確である。
訂正は主張があった場所に残す
状態の記述が誤っていたと分かったら、次の報告だけをそっと直してはいけない。同じ場所に同じ見え方で、以前の主張が成り立たないことと実際の関係を書く。繰り返された誤報はその回数だけ信頼を削ったのだから、訂正も同じ可視性を持つ必要がある。
完了基準
ブランチ状態の報告は、方向を主張するすべての文が今回行った祖先確認と ahead/behind の確認に結び付き、引用したハッシュが実際に確認したハッシュであり、前回の文章をコピーしていないときに完了する。