ksj09406 fadc000081 10차 F-3: 폴더 비교 "주석만 다름" 을 "다름(코드는 같음)" 으로
주석 · 공백을 걷어내고 견주는 판정이라 BOM · 줄끝 · 인코딩 · 끝 공백 · 빈 줄 · 들여쓰기만
다른 파일도 "주석만 다름" 이었다. 사용자: "이름을 바꿔줘". 판정 · 수는 그대로.

- 목록 · 범례(설명 붙임) · 요약 "다름 N(코드는 같음 M)" · 비교 결과 보고서
- 웹 문서의 이름도 바꿈(지난 기록은 그대로, 발행은 E-2)
- 하네스 FolderTest +1 (78건), 22벌 1,147건 통과, 빌드 경고 0 오류 0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:05:13 +09:00

16 KiB

작업 지시 — MergeHub 10차 (두 탭이 같은 커밋을 보게 · 남은 표시 어긋남 · 누름을 놓치는지)

대상: D:\Sorce\MergeTool\MergeHub (플러그인) · D:\Sorce\MergeTool\UbisamPlatform (셸) 전제: 1~9차 지시서는 모두 끝났다(../진행상황.md).

이번 지시서가 나온 곳 — 9차 D-1 에서 병합 · rebase · cherry-pick · revert 를 새 저장소에서 MergeHub 만으로 끝까지 했다. 네 길 모두 마지막 Save 뒤 제목 · 요약 · 기준(HEAD)이 같았고, 줄끝 · BOM 바뀐 파일 · 충돌 표식 · class 이름 다른 파일이 0 이었다. 새로 걸린 것은 하나(N1) 이고, 9차 A-1 · B-1 · B-2 를 하면서 고치지 않고 적어 둔 것이 셋이다. 근거와 수치는 ../history/2026-09-17-9차.md 에 있다. 파일을 망가뜨리는 것은 없다. 모두 화면이 어긋나 보이거나, 한 번 누른 것이 남지 않는 종류다.

9차 D-1 에서 잰 것 병합 rebase cherry-pick revert
마지막 Save 뒤 제목 · 요약 · 기준 같음 같음 같음 같음
요약 N줄 = git diff 3 = 3 3 = 3 3 = 3 6 = 6
커밋 뒤 기준 새 HEAD 새 HEAD 새 HEAD 새 HEAD
줄끝 · BOM 바뀐 파일 0 / 33 0 / 31 0 / 33 0 / 36
줄 고른 로그 18줄 18줄 10줄(첫 회차) → 18줄(다시) 6줄

공통 규칙

  • A → B → C → D → E 순서로 진행한다. A 는 한 번 누른 것이 사라질 수 있다는 것이라 먼저다.
  • 항목 하나를 끝낼 때마다 빌드하고 실제로 실행해 화면을 확인한 뒤 보고한다.
  • 항목 하나가 끝나면 기록을 세 군데에 남기고 로컬 커밋한다(4차 D-2 규칙).
    1. 상세는 doc/history/YYYY-MM-DD-10차.md — 원인 · 판단 · 확인한 결과
    2. ../진행상황.md 은 대기 → 완료로 상태만
    3. ../history/changelog.md 에 한 줄 — 날짜 · 무엇을 왜 · 커밋
  • 푸쉬하지 않는다.
  • 실제 소스를 열지 않는다(2026-09-11 결정). 시험 재료는 C1Repo(병합 저장소) · FolderPerf/Corpus.cs(폴더 묶음)로 만든다. 고치기 전에 문제가 다시 나는 것부터 보이고, 고친 뒤 안 나는 것을 보인다. 다시 나지 않으면 짐작으로 고치지 않고 되풀이한 횟수와 짚은 곳을 적어 보고한다.
  • 기존 검사 하네스(22벌 1,122건)는 계속 통과해야 한다. 로직을 건드리면 테스트를 먼저 늘린다.
  • 빌드 경고 0 · 오류 0 을 유지한다. 앱이 실행 중이면 UbisamBase.Shell 을 먼저 종료한다.
  • 사용자 설정 파일(D:\UbisamConfig\Settings\MergeHubSettings.json)은 시험 전에 백업하고, 끝나면 바이트 그대로 되돌린다. 창 기억(ShellWindowPlacement.json)은 시험 뒤 "기억 없음" 으로 둔다.
  • 자동 조작으로 확인할 때는 사람이 갈 수 있는 길만 쓴다. 이름 창은 [저장], 접힌 영역은 [펴기], 파일 비교 탭은 미리 열지 않는다(D7_NO_PREOPEN=1).
  • 문서 글을 PowerShell 로 넣을 때는 작은따옴표 문자열만 쓴다(8차). PowerShell 변수 이름은 대소문자를 가리지 않는다 — 매개변수와 겹치는 이름을 쓰지 않는다(9차 A-2).
  • 앱 안에 임시 측정 코드를 넣었다면 커밋하지 않고 잰 뒤 되돌리고 다시 빌드한다(9차 B-2).
  • 결과 확인은 줄끝 · 충돌 표식 · UnitN.cs 의 class 이름까지 본다.
  • 플랫폼을 고치면 다른 소비 프로그램에 미치는 영향을 함께 적고 UbisamPlatform/doc/history/changelog.md 에 남긴다. 배포는 사용자 확인 뒤.

A. 한 번 누른 것이 남지 않는다

A-1. 네 칸에서 충돌을 차례로 고르는데 한 번이 남지 않아 "남은 충돌 1개" 로 멈췄다 (9차 D-1 N1) — 원인부터

  • 그때 순서: cherry-pick([모든 브랜치] 켬) → 같은 줄 충돌 15개 파일 단위 Accept Theirs → NewPanel Accept Both [아니오] → [3분할로 열기] 뒤 저절로 열리는 파일마다 [다음 충돌] → Take Theirs / Take Mine 번갈아(누름 사이 0.4초 · 0.7초) → [Save].
  • Motion/Unit0.cs 충돌 6개를 여섯 번 고른 뒤 요약이 "남은 충돌 1개", [Save] 꺼짐. 그 회차 줄 고른 로그는 10줄(병합 · rebase 는 같은 순서로 18줄) — Unit0 에서 한 번이 로그에 없다. 새 저장소로 같은 순서를 다시 하니 18줄 · 끝까지 갔다.
  • 비슷한 모양이 전에도 있었다: 7차 C-2 · 8차 C-1 에서 충돌 탭 목록 여러 개 고르기가 앱에 닿지 않아 파일 단위 Accept 가 일부만 풀렸다(그때는 스크립트를 되풀이하게 바꿔 넘겼다).
  • 가릴 것 — 둘 중 어느 쪽인가.
    1. 자동 조작의 누름(UI 자동화 Invoke)이 앱에 닿지 않았다 → 시험 도구 문제.
    2. 앱이 누름을 받았는데 처리하지 않았다 — 예: [다음 충돌] 이동이 끝나기 전에 Take 가 눌려 선택 줄이 아직 이전 충돌(이미 정한 줄)이었거나, 단추가 잠깐 꺼져 있었다 → 사람이 빠르게 눌러도 날 수 있는 제품 문제.
  • 방향:
    1. 앱에 임시 로그를 넣어(되돌릴 것) [다음 충돌] · Take 가 불렸는지 · 어느 줄에 · 무엇을 했는지 · 그때 단추가 켜져 있었는지를 남긴다.
    2. 같은 순서(네 칸 여섯 충돌 번갈아 고르기)를 스무 번 이상 되풀이한다. 누름 간격을 9차와 같게 한 번, 더 짧게(0.1초) 한 번.
    3. 다시 나면 로그로 1 · 2 를 가른다. 2 면 고친다 — 누른 것이 처리되거나, 처리되지 않았으면 알린다(조용히 사라지지 않는다).
    4. 다시 나지 않으면 되풀이 횟수 · 간격 · 짚은 곳을 적고 사용자에게 보고한 뒤 닫는다.
  • 판정 기준: 원인이 1 · 2 중 무엇인지 로그 근거로 적는다. 2 였다면 짧은 간격으로 스무 번 되풀이해 줄 고른 로그가 매번 누른 수와 같다. 하네스로 "이동 중에 들어온 Take" 를 만든다.

B. 두 탭이 같은 커밋을 보게

B-1. Git 탭 이력에서 커밋을 고르면 파일 비교 탭은 새로고침 전까지 따라오지 않는다 (9차 A-1 에서 적어 둠) — 먼저 정한다

  • 두 탭은 같은 "고른 커밋"(_workspace.SelectedCommit)을 쓴다. 그런데 Git 탭은 값만 바꾸고, 파일 비교 탭은 새로고침 알림(Refreshed)으로만 다시 읽는다. 그래서 Git 탭에서 상대 쪽 작업 을 골라도 파일 비교 탭 위 줄 "Selected Commit" · 왼쪽 이력 선택 · 두 칸 기준은 옛 커밋 그대로다(9차 A-1 · 곁 확인에서 봄). [새로고침] 을 누르면 따라온다.
  • 파일 비교 탭 쪽 이력에서 고르면 바로 바뀌고, 저장 안 한 편집이 있으면 "다른 커밋을 봅니다" 를 먼저 묻는다(5차 A-2).
  • 고치기 전에 사용자에게 보이고 정한다.
    1. 바로 따라온다 — Git 탭에서 고르면 파일 비교 탭도 그 커밋으로. 파일 비교 탭에 저장 안 한 편집이 있으면 Git 탭에서 고르는 순간 묻는다(또는 편집이 있으면 따라가지 않고 알린다 — 둘 중 무엇인지도 정한다).
    2. 따로 둔다 — 두 탭의 고른 커밋을 나눈다. Git 탭 선택은 Git 탭 일(Revert · Cherry-pick · Reset · Blame 기준)에만 쓰고, 파일 비교 탭은 자기 이력으로만 바뀐다.
  • 판정 기준: 정한 대로 두 탭의 "고른 커밋" 표시가 서로 다른 말을 하는 때가 없다(또는 따로라는 것이 화면에 드러난다). 저장 안 한 편집이 말없이 사라지지 않는다(5차 A-2 · 4차 A 회귀 없음). 9차 A-1 · A-2 의 규칙(작업 중 충돌이 막 0 이 되면 HEAD · 새로고침 뒤 해시로 · HEAD 를 보다 커밋하면 새 HEAD)은 그대로.

C. 남은 표시 어긋남

C-1. "머지 주석 무시" 를 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 간다 (9차 B-1 에서 적어 둠)

  • 다시 내는 순서(9차 d9-b1-extra.ps1): 설정 IgnoreMergeNotes 끔 → 병합 → Weld/Unit1.cs 를 [3분할로 열기] → 첫 충돌 Take Theirs → 비교 규칙 [Aa] 두 번(다시 정렬). Take 직후 범례 "머지 반영함 1 · 추가 1" → 다시 정렬 뒤 "머지 반영함 1 · 직접 수정 1". 화면에서 초록(반영함)이 주석 줄에, 보라(직접 수정)가 반영한 코드 줄(Power100 => 0.9)에 붙는다.
  • 짚이는 곳: 다시 정렬하면 주석 줄이 BASE 의 코드 줄(Power93)과 한 행으로 짝지어진다(규칙이 꺼져 있어 NoteRows 로 떼지 않는다). 반영 표시는 BASE 줄 번호(_appliedBaseNumbers)로 붙들어 두어, 그 번호를 가진 행(= 주석 행)에 붙는다.
  • 기본값(켬)에서는 나지 않는다. 범례 수 · 저장 내용은 같다.
  • 방향: 반영 표시가 반영한 코드 줄에 남게 한다. 우리가 넣은 주석 줄은 규칙과 상관없이 코드 줄과 한 행으로 짝짓지 않게 하는 것이 한 길이다 — 비교 결과(차이 수)가 바뀌는지 먼저 잰다.
  • 판정 기준: 규칙을 끈 채 다시 정렬해도 반영 색이 반영한 코드 줄에 있다(스크린샷 · 범례). 규칙 켬 · 끔 모두 차이 수 · 남은 충돌 · MERGED 번호 · 저장 내용이 고치기 전과 같다. 9차 B-1(규칙 켬: 처음부터 무시 색)은 그대로.

D. 처음 한 번이 느리다

D-1. 그날 첫 큰 폴더 비교가 9.2초 (9차 B-2 에서 적어 둠) — 재고 정한다

  • 4,500개 묶음에서 데운 뒤 비교는 0.7초인데 그날 첫 비교는 9.2초였다(한 번 잰 값). 트리 · 그리기는 0.14초로 상관없다. 파일을 디스크에서 처음 읽는 값으로 보이지만(디스크 캐시 · 백신 검사) 가려 보지 않았다.
  • 사람이 아침에 처음 비교할 때 겪는 시간은 이쪽이다.
  • 방향:
    1. 다시 낸다 — 캐시를 비운 상태를 만든다(재부팅 없이: 묶음을 새 이름으로 다시 만들어 복사 직후가 아닌 상태, 또는 대기 메모리 비우기 도구를 쓰지 않는 방법으로). 세 번 잰다.
    2. 나눠 잰다 — 훑기(폴더 목록) · 가리기(파일 읽기) · 세기. 빠른 비교(크기 · 수정일)도 같이 잰다 — 파일을 안 읽으니 차이가 줄면 읽기 값이다.
    3. 백신 검사 몫은 바꿀 수 없으므로 잰 값만 적는다(백신 설정은 건드리지 않는다 — 보안 설정).
    4. 줄일 길(예: 크기가 다르면 읽지 않고 "다름", 진행 표시 · 몇 개 남았는지 알림)이 있으면 효과와 위험을 적어 사용자에게 보이고 정한다. 결과가 바뀌는 길(빠른 비교를 기본으로 등)은 하지 않는다.
  • 판정 기준: 차가운 첫 비교가 다시 나는지와 단계별 값을 적는다. 고쳤다면 같은 조건으로 전후를 견주고 결과 요약이 글자 하나까지 같다(5차 B-2 기준). 안 고치기로 하면 까닭을 적고 매뉴얼 "알아 둘 한계" 를 잰 값으로 고친다.

E. 확인 · 문서

E-1. 다섯 길(+ pull)을 다시 끝까지, 누름 간격은 사람 손 빠르기로

  • A ~ D 를 고친 뒤 저장소를 새로 만들어 병합 · pull · rebase · cherry-pick · revert 를 끝까지 한다(9차 D-1 은 pull 을 돌리지 않았다).
  • 파일 비교 탭은 미리 열지 않는다. cherry-pick · revert 는 [모든 브랜치] 켬 · 마지막 파일 네 칸. B-1 에서 정한 대로 Git 탭에서 커밋을 고른 뒤 파일 비교 탭이 무엇을 보이는지도 적는다.
  • 9차 D-1 과 같은 표(기준 대조 · 커밋 뒤 기준 포함)로 적는다. 줄 고른 로그 수가 누른 수와 같은지 길마다 적는다. 새로 걸린 것은 고치지 말고 적는다 — 그 목록이 11차가 된다.
  • 판정 기준: 다섯 길 모두 MergeHub 만으로 끝까지. 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 다른 Unit 파일 0. 마지막 Save 뒤 제목 · 요약 · 기준이 같다. 줄 고른 로그 = 누른 수. 8차 A-1 · B-1 · B-2 · F-1 과 9차 A-1 · A-2 · B-1 이 다시 나지 않는다.

E-2. 웹 문서를 10차에 맞게

  • 고친 것 · 정한 것을 매뉴얼("알아 둘 한계" 의 9차에 더한 넷 중 고친 것은 빼고) · 남은 일 · 지금까지 만든 것에 반영하고 같은 주소로 발행한다.
  • 판정 기준: 문서의 단추 이름 · 흐름이 지금 화면과 같다(grep 대조). "알아 둘 한계" 가 10차 끝 기준. 태그 짝 맞음. 발행본을 먼저 읽고 합쳐 올린다.

F. 추가 요청

F-1 · F-2. 폴더 비교 "같은 것만" 에 내용이 다른 것처럼 보이는 줄이 섞인다 (2026-09-17, 사용자)

사용자: "방금 폴더비교에서 같은것만 보기를 눌렀을때 내용이 다른파일들이 보이던데" — 9차 B-2 · 10차 D-1 에서 4,500개 시험 묶음으로 필터를 바꿔 가며 잴 때 본 화면.

  • F-1 폴더 줄 — "같은 것만" 은 같은 파일을 품은 폴더를 남기는데, 폴더 줄은 폴더 자신의 상태(안에 다른 것이 하나라도 있으면 "다름", 주황)로 보였다. 방향: "같은 것만 · 왼쪽에만 · 오른쪽에만" 으로 걸러 볼 때 폴더 줄은 걸린 파일 수("같음 122개")와 그 갈래 색으로 적는다. "전체 · 다른 것만 · 코드가 다른 것만" 은 그대로.
  • F-2 설정으로 같음이 된 파일 — 설정 [C# 코드 스타일 맞춤](사용자 설정 Allman) · 비교 · 병합에서 머지 주석 무시 때문에 중괄호 자리 · 머지 주석 줄만 다른 파일은 크기가 달라도 "같음" 이다. 사용자 결정: 같음으로 두고 따로 표시 — "같음(스타일만 다름)" · "같음(머지 주석만 다름)" · "같음(스타일 · 머지 주석만 다름)". 필터 · 요약 수는 그대로.
  • 판정 기준: 시험 묶음 "같은 것만" 에 주황 "다름" 줄이 없다. 작은 짝(같음 · 중괄호만 · 머지 주석만 · 코드 값 등)에서 까닭이 맞게 붙고 코드 값이 다른 파일은 어느 설정에서도 "다름". 요약 수 · 결과 글자 그대로.

F-3. "주석만 다름" 이름을 바꾼다 (2026-09-17, 사용자)

  • F-1 · F-2 를 가리다 보니 BOM · 줄끝 · 인코딩 · 끝 공백 · 빈 줄 · 들여쓰기만 다른 파일도 "주석만 다름" 이었다(주석 · 공백을 걷어내고 글자로 견주는 판정). 사용자: "이름을 바꿔줘".
  • 방향: 판정은 그대로 두고 이름만 사실대로 — "다름(이진)" 과 같은 꼴로 "다름(코드는 같음)", 요약은 "다름 N(코드는 같음 M)". 범례 · 목록 · 보고서 · 웹 문서 모두.
  • 판정 기준: 화면 · 요약 · 보고서에 "주석만 다름" 이 없다(머지 주석 쪽 "같음(머지 주석만 다름)" 은 다른 말). 상태 판정 · 수는 그대로.

이번 지시서에서 하지 않는 것

  • 실제 소스로 병합해 보기 — 실제 소스는 열지 않는다(2026-09-11 결정).
  • 빈 cherry-pick 을 커밋으로 남기는 길 — 두지 않기로 했다(2026-09-16 사용자 결정).
  • 비교할 때만 C# 스타일을 맞추는 선택지 — 만들지 않기로 했다(2026-09-17 사용자 결정).
  • MergeHub 밖에서 푼 충돌을 병합 본문에 적기 — 알 길이 없다(8차 F-1).
  • 셸 창 반쪽 스냅 · 1px 테두리 · 화면 잠금 확인 창 자동 재기 — 8차 C-3 결정 그대로.
  • 백신 · 디스크 설정 바꾸기 — 보안 설정이라 건드리지 않는다(D-1 은 재기만).
  • 빠른 비교가 내용만 바뀐 파일을 놓치는 것 — 알려진 한계로 둔다.
  • 같은 줄 접기(4차 B-2) · 외부 편집기(4차 B-4) · 로그인·권한 · Gitea PR 코멘트 · 멀티 레포 · Roslyn · 변경분 ZIP — 미룬 그대로 둔다.
  • 사내 베타 배포 · 푸시 — 기획 4단계(09.29 ~ 10.02)와 사내 Gitea 저장소가 정해지면 따로 지시한다.

보고 형식

항목마다 이렇게 적는다.

  • 고치기 전에 문제가 다시 나는 것을 어떻게 보였는지 (만든 저장소 · 묶음의 어느 파일로, 몇 번 되풀이해서)
  • 무엇이 원인이었는지 한두 줄 (로그 근거)
  • 어떤 파일을 어떻게 고쳤는지
  • 실제로 실행해 확인한 결과 (줄 수 · 해시 · 줄끝 · 충돌 수 · 로그 줄 수 · ms 처럼 눈이 아닌 값으로)
  • 커밋 해시