Ubisam-MergeTool/doc/진행상황.md
ksj09406 101deb2627 12차 E-1 - 저장하지 않은 편집이 껐다 켜도 남는다 (notepad++ 식)
E-2 가 만든 보관함(탭이 사라져도 고친 글이 짝 이름으로 남는 자리)을 그대로 파일로
옮겨 적는 일이다. 새로 정할 것은 언제 쓰고 언제 되살리는가뿐이었다.

어디에 · 어떤 모양으로

  {설정 폴더}\Session\MergeHub\
      목록.txt        차례 · 짝 경로 · 캐럿 · 스크롤 · 저장 형식 · 보고 있던 탭 · 그때 파일의 자취
      01-오른쪽.txt    저장하지 않은 오른쪽 글(있을 때만)
      01-왼쪽.txt      저장하지 않은 왼쪽 글(12차 B-1, 있을 때만)

11차 F-9 백업과 다른 자리다 - 백업은 "저장하기 전 파일", 이것은 "저장하지 않은 편집" 이라
뜻도 수명도 다르다.

- JSON 을 쓰지 않는다(최근 목록과 같은 까닭). 사람이 열어 보고 고칠 수 있고, 무엇보다
  글 안에 무엇이 들었든(따옴표 · 줄바꿈 · 제어 문자) 본문을 따로 파일로 두면 탈이 없다
- 원본 글은 담지 않는다. 파일에서 다시 읽으면 되고, 담아 두면 그 사이 파일이 바뀌었을 때
  낡은 것을 보여 준다. 대신 그때 파일의 길이 · 마지막으로 쓴 때(FileStamp)만 적어 둔다
- 목록은 맨 나중에 쓴다 - 목록이 있다는 것이 곧 글 파일이 다 있다는 뜻이다
- 못 읽거나 못 써도 조용히 넘어간다. 보관 때문에 프로그램이 안 켜지면 안 된다

언제 쓰나

- 글자가 멈춘 뒤 2초에 한 번(DispatcherTimer)
- 탭을 옮길 때 · 닫을 때 · 새 짝을 열 때는 그 자리에서 바로 - 그 순간이 곧 끄기 직전일 수 있다
- 쓰는 일은 다른 실로 넘긴다(Task.Run). 화면 상태를 뜰 때 ParkCurrentTab 을 쓰지 않는다 -
  그쪽은 되돌리기 목록을 글 단위로 눌러 담는데, 2초마다 이력을 주무를 까닭이 없다.
  보관할 것은 글과 자리뿐이고 되돌리기 이력은 되살리지 않기로 정했다(사용자 결정)

언제 되살리나

켤 때 묻지 않고 그대로(사용자 결정). 다만 사용자가 지금 열라고 한 것이 먼저다 -
충돌 파일 열기 · git mergetool · 폴더 비교에서 고른 파일. 설정의 기본 저장소 · 기본 짝보다는 앞선다.
원본 글은 파일에서 다시 읽고 그 위에 편집을 얹는다(E-2 의 ResumePendingTab 그대로).
원본이 그 사이 바뀌었으면 되살리고 알린다 - "연 시점" 은 새로 읽은 글로 두어
[전체 되돌리기] 가 지금 파일로 가고, 고친 글은 편집으로 남는다.
두 파일이 다 없어진 짝은 되살릴 자리가 없으므로 버린다.

확인

하네스 SessionTest 65건 새로 만듦(글로 옮기고 되읽기 · 빈칸/한글/UNC 경로 ·
알아볼 수 없는 줄 건너뛰기 · 보관할 것 없으면 치우기 · 옛 글 파일 치우기 ·
글 파일이 없어져도 넘어가기 · FileStamp · 보관함 주고받기). 전체 28벌 1,852건 · 실패 0.

화면 24건: 두 짝을 고치고 작업 관리자로 끄듯 강제로 끝낸 뒤 다시 켜면 묻지 않고
탭 2개가 이름 · 차례 · 글 그대로 되살아나고, 한쪽을 저장하면 가운뎃점이 2->1,
둘 다 저장하면 보관본이 사라지고, 다시 켜면 되살릴 것이 없다.
원본이 그 사이 바뀌면 되살리고 "저장하면 바뀐 파일을 덮어씁니다" 를 알린다.

빠르기에 대해: 5,003줄(113KB) 짝에서 글자당 31ms 로 4줄짜리와 같았다(앱이 입력에 밀리지 않는다).
다만 "친 뒤 화면에 보이기까지" 는 값으로 확정하지 못했다 - 그것을 재려면 편집기 글을
UIA 로 읽어야 하는데 5,003줄 창에서는 그 읽기가 타이핑보다 훨씬 오래 걸려 값이 오염된다.
재는 법을 따로 마련해야 한다.

시험 도구: E-1 이 도니 지난 시험이 남긴 편집이 다음 시험에서 되살아나 화면이 달라졌다
(e3-verify 가 왼쪽 7줄 대신 14줄을 봤다). 시험마다 보관 자리를 치우고 시작해 끝에
되돌리도록 고쳤다 - 기능이 제대로 도는 증거이기도 하다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 14:53:23 +09:00

465 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MergeHub 진행 상황
**지금 무엇이 남았는지만** 적는다. 끝난 것의 상세는 [history/](history/) 로 옮겼다.
항목을 끝내면 이렇게 한다.
1. 상세는 `history/YYYY-MM-DD-주제.md` 에 적는다.
2. 이 파일은 **대기 → 완료로 상태만** 고친다.
3. [history/changelog.md](history/changelog.md) 에 한 줄을 더한다 (날짜 · 무엇을 왜 · 커밋).
푸시는 하지 않는다 — 사내 Gitea 저장소가 만들어지면 그때 한 번에 올린다.
상태 표기: `대기` · `진행` · `완료`
---
## 4차 — 로컬 머지툴 사용성 (2026-09-10) — **전부 끝**
진행 기록: [history/2026-09-10-4차.md](history/2026-09-10-4차.md)
지시서: [작업지시/4차.md](작업지시/4차.md). 기능을 늘리는 것이 아니라 매일 쓰는 사람의 걸림돌을 없애는 것이 목적이다.
### A. 작업한 것이 사라지는 문제
| 상태 | 항목 |
|---|---|
| **완료** | A-1 저장하지 않은 편집이 말없이 사라진다 |
| **완료** | A-2 내보낸 보고서에 만든 사람이 없다 |
### B. 매일 쓰는 마찰 줄이기
| 상태 | 항목 |
|---|---|
| **완료** | B-1 최근 비교 목록 |
| ~~취소~~ | ~~B-2 같은 줄 접기~~ (2026-09-10 사용자 판단으로 뺌) |
| **완료** | B-3 폴더 비교에서 다음 다른 파일로 |
| ~~취소~~ | ~~B-4 외부 편집기로 열기~~ (2026-09-10 사용자 판단으로 뺌) |
### C. 화면 구성 정리
| 상태 | 항목 |
|---|---|
| **완료** | C-1 같은 경로가 세 군데 나온다 |
| **완료** | C-2 아래쪽 정보가 세 군데로 흩어져 있다 |
| **완료** | C-3 Git 탭의 원격 블록을 접는다 |
| **완료** | C-4 색 구분 범례를 이동 도구로 |
| **완료** | C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다 |
### D. 변경 이력을 전용 폴더로
| 상태 | 항목 |
|---|---|
| **완료** | D-1 `doc/history/` 를 만들고 진행상황을 나눈다 |
| **완료** | D-2 앞으로의 기록 규칙을 정한다 |
---
## 5차 — 실제 소스에 맞추기 (2026-09-10 ~)
진행 기록: [history/2026-09-11-5차.md](history/2026-09-11-5차.md)
지시서: [작업지시/5차.md](작업지시/5차.md). 지금까지는 시험용 파일로만 확인했다.
5차는 실제 소스(2,115개 · 426,723줄)를 한 번 재 보고 나온 것들이다.
2026-09-11 부터는 실제 소스를 더 보지 않는다 - 여기는 머지툴을 만드는 자리이고,
시험 재료는 우리가 만들어 쓴다. 이미 받아 둔 숫자는 그대로 쓴다.
### A. 남의 소스를 망가뜨릴 수 있는 것
| 상태 | 항목 |
|---|---|
| **완료** | A-1 CP949 파일 67개를 잘못 읽으면 한글이 깨진다 |
| **완료** | A-2 커밋·체크아웃 뒤에 저장 안 한 편집이 조용히 사라진다 |
### B. 실제 소스에 맞추기
| 상태 | 항목 |
|---|---|
| **완료** | B-1 XAML 색칠이 사실상 없다 (400개 · 42,477줄) |
| **완료** | B-2 폴더 비교가 오래 걸린다 — 전체 비교 3.4배 · 빠른 비교 4.7배 |
### C. 실전 투입
| 상태 | 항목 |
|---|---|
| **완료** | C-1 병합을 한 번 끝까지 해 본다 — 커밋까지 갔다. 걸린 것 23가지(심각 5)가 6차 재료 |
---
## 6차 — 병합을 끝까지 믿고 쓸 수 있게 (2026-09-14 ~)
진행 기록: [history/2026-09-14-6차.md](history/2026-09-14-6차.md)
지시서: [작업지시/6차.md](작업지시/6차.md). 5차 C-1 에서 만든 저장소로 병합을 끝까지 해 보고 걸린 23가지다.
확인은 같은 저장소(`C1Repo`)로 한다. 실제 소스는 열지 않는다.
### A. 파일이나 이력을 망가뜨리는 것
| 상태 | 항목 |
|---|---|
| **완료** | A-1 3분할로 푼 파일을 저장하면 CRLF 가 LF 로 바뀐다 — 내 쪽(ours) 파일의 줄끝·인코딩을 따른다 |
| **완료** | A-2 Save & Commit 이 "실패" 라는데 파일은 이미 써지고 스테이징됐다 — [해결로 저장] 을 따로 둠 |
| **완료** | A-3 충돌 파일을 고르면 상대(Theirs) 칸이 안 나온다 — 콤보를 안 건드려도 네 칸, REMOTE 제목에 상대 브랜치 |
| **완료** | A-4 상대가 지운 파일을 3분할이 다룰 줄 모른다 — 남은 파일을 두 칸으로, [파일 남기기] · [파일 지우기] 띠 |
| **완료** | A-5 양쪽 새 파일에 Accept Both 를 누르면 빌드가 깨진다 — 누르기 전에 묻고, 글로 이어 붙여 BOM 한 번 · 줄끝 한 가지 |
### B. 헷갈리거나 막히는 것
| 상태 | 항목 |
|---|---|
| **완료** | B-1 충돌 목록에서 3분할 화면까지 가는 길이 끊겨 있다 — 병합 뒤 목록이 바로 서고, 두 번 누르기·Enter·[3분할로 열기] |
| **완료** | B-2 확인 창이 엉뚱한 파일 이름을 댄다 — 이름·[저장하고 계속] 모두 실린 파일 기준, [취소] 뒤 콤보도 돌아온다 |
| **완료** | B-3 커밋 메시지가 엉뚱하게 남는다 — 기본값 `Merge branch '상대' into 내 브랜치`, `#` 줄 뺌, 병합이 끝나면 칸을 비움 |
| **완료** | B-4 MERGED 칸 줄 번호가 네 자리에서 잘린다 — 네 칸 여백을 66px 로, MERGED 번호 자리 20 → 36px(다섯 자리) |
| **완료** | B-4 확인 중 발견 두 건 — 멀리 건너뛰면 네 칸이 위로 밀려 아래가 빔 · `git mergetool` 세 벌이 두 칸으로 열림 |
| **완료** | B-5 머지 주석은 소스에 넣고, 병합 뒤에는 그 줄을 무시한다 — 비교(두 칸 · 네 칸 · 폴더)에서 가리고, 주석만 다른 git 충돌은 양쪽 주석을 남겨 자동으로 푼다. 설정에서 끔 |
| **완료** | B-6 충돌 탭에서 하나씩 누를 때마다 오래 기다린다 — 여러 개 골라 Accept 한 번, 다시 읽기는 끝에 한 번. 15개 22.0초 → 1.2초 |
| **완료** | B-7 상태바가 병합 중에 믿을 수 없는 값을 보인다 — 인코딩 · 줄바꿈을 내 쪽(ours) 파일로, 요약에 "남은 충돌 N개 · 받을 변경 M줄" |
| **완료** | B-8 병합 커밋 뒤 파일 비교 탭이 어정쩡하게 남는다 — 다시 나지 않음(두 흐름 확인, B-1 · A-3 에서 없어짐). 코드 변경 없음 |
### E. 추가 요청 (2026-09-14)
| 상태 | 항목 |
|---|---|
| **완료** | E-1 C# 코드 스타일 맞춤 (AURORA · Allman) — 비교 전에 중괄호 줄바꿈을 맞춤. 두 칸 · 네 칸 · 폴더 비교, 설정. 스타일만 다른 파일 남은 차이 39줄 → 1줄 |
| **완료** | E-2 발표 시연 재료 `demo\` — `make-demo.ps1` 한 번으로 폴더 비교 · 스타일 · mergetool · 큰 파일 · 병합 저장소 |
| **완료** | E-3 웹 문서 — 사용자 매뉴얼 · 발표 자료 · 남은 일 · 개발 현황 · 기획안 최신화 · 시연 대본 · WinMerge 비교 |
### C. 사소한 것
| 상태 | 항목 |
|---|---|
| **완료** | C-1 로그와 목록 다듬기 — 결과 로그 한 번, 목록에 충돌 종류 네 가지, "남은 충돌 N개 · 푼 것 M개 (M/전체)". CP949 로그 이름은 이미 고쳐져 있었음 |
### D. 확인
| 상태 | 항목 |
|---|---|
| **완료** | D-1 병합을 처음부터 다시 끝까지 해 본다 — 충돌 26(자동 2)을 MergeHub 만으로 풀어 병합 커밋. 줄끝 · BOM 이 바뀐 파일 0/33, A 다섯 가지 다시 안 남. 23가지 중 사라짐 18 · 정해서 남음 1(머지 주석) |
**6차 전부 끝.** D-1 에서 새로 걸린 세 가지는 7차 재료다(고치지 않음).
- N1 3분할에서 고른 줄 로그가 "N행 (3-Way 안 씀) 반영"
- N2 마지막 [Save](옛 이름 해결로 저장) 뒤 병합 중인데 두 칸 · "남은 차이 3줄" 로 떨어짐
- N3 병합 커밋 뒤 `.git/MERGEHUB_CONFLICTS` 가 남음
---
## 7차 — 병합 화면이 사실대로 말하게 · 병합 말고 다른 충돌 길 (2026-09-14 ~)
진행 기록: [history/2026-09-14-7차.md](history/2026-09-14-7차.md)
지시서: [작업지시/7차.md](작업지시/7차.md). 6차 D-1 에서 새로 걸린 세 가지와, 6차에서 뺀 pull · rebase · cherry-pick 충돌.
### A. 병합 화면이 사실과 다르게 말하는 것
| 상태 | 항목 |
|---|---|
| **완료** | A-1 마지막 충돌을 저장하면 "남은 차이" 가 뜬다 — 병합 중 충돌 0 이면 "충돌 정리 끝 · 병합 커밋을 할 수 있습니다 · 내 쪽 대비 받은 변경 N줄", 제목에 "병합 전 내 쪽" |
| **완료** | A-2 3분할에서 줄을 골라도 로그는 "3-Way 안 씀" 이라고 한다 — 로그 "10행 Theirs(feature/theirs) 반영" · "Mine(feature/mine) 으로 정함", 충돌 네 칸 머리는 콤보 대신 "병합 충돌 · REMOTE = 상대" |
### B. 치우기
| 상태 | 항목 |
|---|---|
| **완료** | B-1 병합 커밋 뒤에도 `.git/MERGEHUB_CONFLICTS` 가 남는다 — 병합 커밋 · 작업 취소 직후와 새로고침마다 쓸모없어진 목록을 지움(터미널에서 끝낸 병합 포함). 병합 중에는 그대로 |
### C. 병합 말고 다른 충돌 길
| 상태 | 항목 |
|---|---|
| **완료** | C-1 pull 이 낸 충돌에는 머지 주석 자동 풀기가 안 걸린다 — pull 도 [Merge] 와 같은 뒷일(주석 자동 풀기 · 알림 · 진행 줄), 커밋 메시지 "Merge remote-tracking branch 'origin/…' into …" |
| **완료** | C-2 rebase · cherry-pick 충돌을 네 칸으로 끝까지 — 작업별 칸 제목(올릴 자리 · 다시 올리는 내 커밋 · 가져오는 커밋) · 진행 표시 · 끝내기 단추(병합 커밋 · 계속 · 커밋) · 원래 메시지, 이력 [모든 브랜치]. 두 길 모두 줄끝 바뀐 파일 0 |
### D. 확인
| 상태 | 항목 |
|---|---|
| **완료** | D-1 네 길(병합 · pull · rebase · cherry-pick)을 처음부터 다시 끝까지 — 모두 MergeHub 만으로 커밋(rebase 끝)까지, 줄끝 · BOM 바뀐 파일 0. A-2 · B-1 다시 안 남, A-1 은 rebase · cherry-pick 에서 다시 남. MERGED 줄 번호 안 잘림. 새로 걸린 넷(N1 **고른 파일 대신 다른 파일 내용이 저장됨** · N2 · N3 · N4)은 8차 재료(고치지 않음) |
### E. 추가 요청
| 상태 | 항목 |
|---|---|
| **완료** | E-1 [해결로 저장] 이름을 [Save] 로 — 하는 일은 그대로, 알림 · 안내 · 웹 문서 이름도 |
| **완료** | E-2 폴더 비교 탭에 폴더를 하나씩 끌어다 놓으면 첫 칸 → 둘째 칸 차례로 (경로 칸 위가 아니어도) — 양쪽이 차면 바로 비교, 칸 위에 놓은 것도 차례에 침 |
| **완료** | E-3 사용자 이름을 저장하기 전에는 화면을 쓸 수 없게 — 이름 창이 끌어도 안 움직이고 저장 없이 닫히지 않음(플랫폼, 배포함) |
| **완료** | E-4 창 크기를 마음대로 조절할 수 있게 — 끌어 크기 조절(최소 1280×720) · 두 번 누르기 최대화 ↔ 복원 · 화면 이동이 크기를 지킴 · 크기 · 모니터 기억. 최대화는 작업 표시줄까지 덮고(사용자 결정) 크기를 바꿀 때 깜빡이지 않음(검은 칠 99.7% → 3%). 플랫폼, 배포함. MergeHub 네 탭 최소 크기에서 안 잘림 |
**7차 전부 끝.** D-1 에서 새로 걸린 넷은 8차 재료다(고치지 않음). 웹 문서 갱신도 8차로 넘겼다.
- N1 파일 비교 탭을 처음 여는 것이 [3분할로 열기] 면 첫 충돌 파일이 보이고, 그 화면을 [Save] 하면 **고른 파일에 그 내용이 써짐**
- N2 rebase · cherry-pick 마지막 [Save] 뒤 "남은 차이 3줄"(A-1 은 병합만)
- N3 MERGED 칸 번호가 결과 파일 번호가 아님(3363 · 상태바 3366)
- N4 바뀌는 것 없는 cherry-pick 에서 [커밋] 이 켜지고 누르면 실패
---
## 8차 — 고른 파일에 고른 내용을 · 작업마다 화면이 사실대로 (2026-09-15 ~)
진행 기록: [history/2026-09-16-8차.md](history/2026-09-16-8차.md)
지시서: [작업지시/8차.md](작업지시/8차.md). 7차 D-1 에서 새로 걸린 넷과 7차에서 남긴 것(revert · 원래 작성자 · 창 크기의 안 본 곳) · 웹 문서.
### A. 사용자의 파일을 망가뜨리는 것
| 상태 | 항목 |
|---|---|
| **완료** | A-1 고른 충돌 파일 대신 다른 파일이 보이고, 그 화면을 저장하면 고른 파일에 써진다 — 늦게 끝난 읽기를 버리고 다시 읽음, 화면에 실린 파일과 저장할 파일이 다르면 쓰지 않음. 네 길 모두 고른 파일이 열리고 저장이 그 파일에만 감 |
### B. 작업마다 화면이 사실대로 말하게
| 상태 | 항목 |
|---|---|
| **완료** | B-1 rebase · cherry-pick 에서 마지막 저장 뒤 "남은 차이" 가 뜬다 — 요약 · BASE 제목이 작업(병합 · rebase · cherry-pick · revert)을 따른다. rebase 는 "충돌 정리 끝 · [계속] 으로 rebase 를 이어 갑니다 · 올릴 자리 대비 올린 변경 N줄" · 제목 "올릴 자리". 병합 글은 그대로 |
| **완료** | B-2 바뀌는 것 없는 cherry-pick 에서 [커밋] 이 켜지고 누르면 실패한다 — 커밋할 것이 없으면 [커밋] 이 꺼지고 진행 줄 · 로그가 "가져올 변경이 없습니다 - [작업 취소] 로 끝냅니다". 병합 커밋은 그대로(트리가 같아도 정상). `--allow-empty` 는 사용자와 정한 뒤 |
| **완료** | B-3 MERGED 칸 줄 번호가 결과 파일 번호가 아니다 — 사용자가 "결과 파일 번호로" 를 고름(2026-09-16). 결과에 들어가는 줄만 1부터 다시 매긴다. 끝 번호 3363 → 3369 로 상태바 · [이동] 칸 · 저장된 파일(3369줄)과 같아짐 |
### C. 7차에서 남긴 것
| 상태 | 항목 |
|---|---|
| **완료** | C-1 revert 충돌을 화면으로 끝까지 — 생성기에 `feature/revert` 갈래를 더해 충돌 16개를 만들고, MergeHub 만으로 [Revert] → 네 칸("되돌리는 커밋 …") → [커밋] 까지. 원래 메시지 `Revert "내 쪽 작업"`, 줄끝 · BOM 바뀐 파일 0, 제품 코드 변경 없음 |
| **완료** | C-2 cherry-pick 이 원래 작성자를 남기는지 눈으로 — 생성기에서 상대 쪽 커밋만 작성자를 박지훈으로 두고 확인. MergeHub cherry-pick 은 작성자 박지훈 · 커밋한 사람 시험, revert 는 둘 다 시험 — git 과 같음. 제품 코드 변경 없음 |
| **완료** | C-3 창 크기 조절에서 안 본 것 — 실제 픽셀로 재고 사용자와 정함. 첫 Win+↓ 를 두 번 누르기 복원과 같게(작업 영역 80% · 가운데, 화면 밖 16px 없어짐), 덮는 창을 창 가운데로(최대화에서 36px 어긋남 → 0). 스냅은 최소 크기 때문에 반쪽이 안 됨(적어 둠), 1px 테두리는 그대로. 플랫폼, 배포함 |
### D. 문서
| 상태 | 항목 |
|---|---|
| **완료** | D-1 웹 문서를 7차 · 8차에 맞게 — 매뉴얼(창 크기 · 폴더 끌어놓기 차례 · 작업별 네 칸 제목 · MERGED 번호 · 다른 충돌 길) · "알아 둘 한계" 다시 씀 · 남은 일 표 · 숫자(22벌 1,073건 · 커밋 94). 아티팩트 버전 7 로 발행 |
### E. 확인
| 상태 | 항목 |
|---|---|
| **완료** | E-1 다섯 길(병합 · pull · rebase · cherry-pick · revert)을 사람 순서 그대로 다시 끝까지 — 파일 비교 탭을 미리 열지 않고 모두 MergeHub 만으로 커밋(rebase 끝)까지. 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 검사 0. 7차 A-1 · A-2 · B-1 · 8차 A-1 · B-1 · B-2 다시 안 남, F-1 본문 26개. 새로 걸린 것 N1(cherry-pick 요약의 "내 쪽 대비" 가 틀린 기준)은 9차 재료(고치지 않음) |
### F. 추가 요청
| 상태 | 항목 |
|---|---|
| **완료** | F-1 병합 커밋 메시지 본문에 충돌 해결 내역을 자동으로 적기 (2026-09-17 사용자 요청) — 병합 · pull 중 푼 방법(줄 단위 · Accept Mine/Theirs/Both · 남기기 · 지우기 · 머지 주석 자동)을 `.git` 에 적고 [병합 커밋] 본문에 "충돌 해결 N개 · 이름" + 파일 목록. 메시지 칸에 미리 보임, 커밋 · 취소 때 기록 치움. 스타일 맞춤 선택지는 만들지 않기로 |
**8차 전부 끝.** E-1 에서 새로 걸린 것은 9차 재료다(고치지 않음).
- N1 cherry-pick 마지막 [Save] 뒤 두 칸의 BASE 는 이력에서 고른 커밋인데 요약이 "내 쪽 대비 가져온 변경 N줄" 이라고 한다. 한 번은 다른 브랜치 커밋(`f310f49`)이 기준으로 잡혔다(다시 재니 안 남)
---
## 9차 — 두 칸이 무엇과 견주는지 사실대로 · 8차에서 남긴 것 (2026-09-17 ~)
진행 기록: [history/2026-09-17-9차.md](history/2026-09-17-9차.md)
지시서: [작업지시/9차.md](작업지시/9차.md). 8차 E-1 에서 새로 걸린 N1(cherry-pick 요약의 기준)과 그 곁가지 · 전에 남겨 둔 작은 것 둘 · 웹 문서.
### A. 두 칸이 무엇과 견주는지 사실대로
| 상태 | 항목 |
|---|---|
| **완료** | A-1 cherry-pick 마지막 저장 뒤 "내 쪽 대비" 라고 하지만 실제 기준은 이력에서 고른 커밋이다 — 사용자가 "HEAD 로 옮긴다" 를 고름(2026-09-17). 새로고침이 고른 커밋을 놓치면 목록 맨 위(모든 브랜치에서는 다른 브랜치 커밋)로 채우던 것을 해시로 되찾고 없으면 HEAD, 작업 중 충돌이 막 0 이 되면 HEAD 로. 요약은 기준이 HEAD 일 때만 작업 글. cherry-pick · revert 마지막 Save 뒤 제목 · 요약 · 기준이 같음(6줄 = git 대조) |
| **완료** | A-2 한 번은 기준이 다른 브랜치 커밋이었다 — 원인은 A-1 과 같음(선택을 놓치면 목록 맨 위로 채움). 해시만 지키자 cherry-pick [커밋] 뒤 옛 HEAD 에 남아 "남은 차이 6줄" 이 떠서, HEAD 를 보고 있었으면 새 HEAD 를 따라가게 함께 고침. 8차 E-1 순서 여섯 번 모두 시작 · 파일 단위 = 고른 커밋, Save 뒤 = HEAD, 커밋 뒤 = 새 HEAD |
### B. 전에 남겨 둔 작은 것
| 상태 | 항목 |
|---|---|
| **완료** | B-1 MERGED 칸에서 넣은 주석 줄이 다시 정렬하면 "무시" 색이 된다 — 사용자가 "처음부터 무시 색" 을 고름(2026-09-17). 넣는 순간 "추가"(파랑)였고 LOCAL(Mine) 칸에 주석 글이 보였는데, 다시 정렬했을 때와 같은 모양(무시 · Mine 빈 자리)으로 넣는다. Undo · Redo · 저장 내용 그대로, 규칙을 끄면 지금처럼 추가. 규칙을 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 가는 것은 적어 둠 |
| **완료** | B-2 폴더 비교 뒤 화면 트리를 세우는 데 1초 남짓 — 고치지 않음. 앱 안에서 단계를 나눠 재니 트리 만들기 5~17ms · 첫 화면까지 0.13초(필터 전체 0.24초)이고 기다림의 대부분은 비교(데운 뒤 0.7초). 5차의 "1초" 는 자동 조작 대기가 섞인 값. 그날 첫 비교는 9.2초(디스크 첫 읽기로 보임)를 적어 둠 |
### C. 문서
| 상태 | 항목 |
|---|---|
| **완료** | C-1 웹 문서를 8차 끝 · 9차에 맞게 — 개요 숫자(22벌 1,122건 · 커밋 104 · 8차 끝 · 9차 진행), 매뉴얼에 병합 커밋 본문 · 해결 기록이 남는 곳 · 마지막 저장 뒤 기준 HEAD · 알아 둘 한계 넷 더함, 남은 일에 8차 D-1 · F-1 · E-1 · 9차 표 · 정해서 두지 않는 것, 지금까지 만든 것 7~9차. 화면 문구 grep 대조 · 태그 짝 맞음. 아티팩트 버전 9 |
### D. 확인
| 상태 | 항목 |
|---|---|
| **완료** | D-1 cherry-pick · revert 를 마지막 파일까지 네 칸으로 끝까지 (+ 병합 · rebase 회귀) — 네 길 모두 MergeHub 만으로 끝까지(cherry-pick · revert 는 [모든 브랜치] 켬). 마지막 Save 뒤 제목 · 요약 · 기준(HEAD)이 같고 요약 N줄 = git diff, 커밋 뒤 기준 새 HEAD. 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 검사 0 · 병합 본문 26개 · 빈 cherry-pick [커밋] 꺼짐. 새로 걸린 것 N1(cherry-pick 첫 회차에서 고르기 한 번이 안 남아 멈춤, 다시 하니 끝까지)은 적어 둠 |
**9차 전부 끝.** D-1 에서 새로 걸린 것은 10차 재료다(고치지 않음).
- N1 cherry-pick 첫 회차에서 `Motion/Unit0.cs` 충돌 6개를 고른 뒤 "남은 충돌 1개" 로 남아 [Save] 가 꺼짐. 고르기 한 번이 로그에 안 남음(10줄 · 다른 길 18줄). 새 저장소로 다시 하니 끝까지 — 자동 조작 쪽으로 보이나 원인 미확인
---
## 10차 — 두 탭이 같은 커밋을 보게 · 남은 표시 어긋남 · 누름을 놓치는지 (2026-09-17 ~)
진행 기록: [history/2026-09-17-10차.md](history/2026-09-17-10차.md)
지시서: [작업지시/10차.md](작업지시/10차.md). 9차 D-1 에서 새로 걸린 N1 과 9차에서 적어 둔 셋(두 탭 고른 커밋 · 규칙 끈 채 반영 색 · 첫 폴더 비교 9.2초) · 다섯 길(+ pull) · 웹 문서.
### A. 한 번 누른 것이 남지 않는다
| 상태 | 항목 |
|---|---|
| **완료** | A-1 네 칸에서 충돌을 차례로 고르는데 한 번이 남지 않아 "남은 충돌 1개" 로 멈췄다 — 고치지 않음. 앱에 임시 로그를 넣고 61회(누름 366번, 9차 간격 31회 · 0.1초 30회, 병합 · cherry-pick) 되풀이 — 다시 안 남. 앱은 Take 를 모두 충돌 줄에서 받아 하나씩 줄임(헛돈 0). Take 뒤 [다음 충돌] 처리 전에는 Take 단추가 꺼져 있고, 9차 시험 도구가 "꺼져서 안 누름" 을 버린 것으로 보임 → 시험 도구가 다시 누르고 못 누르면 적게 고침 |
### B. 두 탭이 같은 커밋을 보게
| 상태 | 항목 |
|---|---|
| **완료** | B-1 Git 탭 이력에서 고른 커밋을 파일 비교 탭이 새로고침 전까지 따라오지 않는다 — 사용자가 "바로 따라간다 · 편집 있으면 고르는 순간 묻는다" 를 고름. 반대 방향(파일 비교 탭에서 고름)은 Git 탭 선택 표시가 남아 [Revert] 가 보이지 않는 커밋에 걸렸다. 양쪽이 고른 것을 알리고 다른 쪽이 따라감(파일 비교는 게이트가 빈 뒤 다시 세움, Git 탭 커밋 내용은 다시 보일 때). 목록이 선택을 바꾸기 전에 묻고 [취소] 면 누름을 막음. 마우스 · 방향키 · [취소] · [계속] · [Revert] 대상 확인 |
### C. 남은 표시 어긋남
| 상태 | 항목 |
|---|---|
| **완료** | C-1 "머지 주석 무시" 를 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 간다 — 네 칸은 규칙과 상관없이 주석 줄과 코드 줄을 떼어 놓고, 다시 정렬한 주석 줄을 "반영함" 으로 칠하지 않음. 규칙 끔 넣은 직후 = 다시 정렬 뒤(반영함 6 · 추가 6), 요약 · 줄 수 · 저장 해시 그대로. 두 칸도 떼어 보니 차이 수가 4 → 5줄로 늘어 두 칸은 그대로 둠 |
### D. 처음 한 번이 느리다
| 상태 | 항목 |
|---|---|
| **완료** | D-1 그날 첫 큰 폴더 비교가 9.2초 — 고치지 않음. 파일마다 버퍼 없이 열어 캐시를 비운 뒤 재도(한 갈래 읽기 0.4 → 1.8초로 먹는 것 확인) 전체 비교 0.46~0.54초로 데운 상태(0.48초)와 같음 — 여러 갈래로 읽어서. 앱 새로 켠 첫 비교도 느리지 않음. 9.2초는 다시 안 남(디스크 정보 캐시 · 백신 짐작, 재부팅 · 보안 설정 없이 못 만듦). 매뉴얼 한계 문장을 잰 값으로. HDD 는 재 보지 않음 |
### E. 확인 · 문서
| 상태 | 항목 |
|---|---|
| **완료** | E-1 다섯 길(+ pull)을 다시 끝까지 — 고치지 않음. 병합 · pull · rebase · cherry-pick · revert 모두 첫 회차에 끝까지. 누른 Take = 줄 고른 로그(18 · 18 · 18 · 18 · 6), 마지막 Save 뒤 제목 · 요약 · 기준 = git, 줄끝 · BOM 바뀐 파일 · 충돌 표식 · class 이름 0. Git 탭에서 고른 커밋을 파일 비교 탭이 바로 따라옴(다섯 길). 8차 A-1 · B-1 · B-2 · F-1 · 9차 A-1 · A-2 · B-1 안 남. 새로 걸린 것 없음 |
| **완료** | E-2 웹 문서를 10차에 맞게 — 발행본(버전 10)이 9차 D-1 파일과 같음을 확인하고 고침. 개요 숫자(1,147건 · 커밋 114 · 10차 끝) · 매뉴얼 "두 탭은 같은 커밋을 본다" · 알아 둘 한계에서 고친 둘(B-1 · C-1) 뺌 · 남은 일에 10차 표와 남은 것(HDD) · 지금까지 만든 것 10차 · 기획안 v2 일정 · WinMerge 숫자. 화면 문구 grep 대조 · 태그 짝 맞음 · 아티팩트 버전 11 |
### F. 추가 요청
| 상태 | 항목 |
|---|---|
| **완료** | F-1 · F-2 폴더 비교 "같은 것만" 에 내용이 다른 것처럼 보이는 줄이 섞인다 (2026-09-17 사용자) — 폴더 줄이 폴더 자신의 "다름"(주황)으로 보이던 것을 걸러 본 갈래의 개수("같음 122개")로. 설정(스타일 맞춤 · 머지 주석 무시)으로 같음이 된 파일은 사용자 결정대로 "같음(스타일만 다름)" · "같음(머지 주석만 다름)" 으로 따로 표시. 요약 수 그대로 |
| **완료** | F-3 "주석만 다름" 이름을 바꾼다 (2026-09-17 사용자) — BOM · 줄끝 · 인코딩 · 공백만 달라도 들어오던 상태를 "다름(코드는 같음)" 으로. 요약 "다름 N(코드는 같음 M)" · 범례 · 보고서 · 웹 문서. 판정 · 수 그대로 |
**10차 전부 끝.** E-1 에서 새로 걸린 것은 없다. 11차는 기획안 v1.2 에서 "일부" 로 남은 것(변경분 추출 · 커밋 메시지 수정)과 사내 베타 전 확인에서 나왔다.
- 같은 날 기획안 문서(잠금)도 v1.2 로 고쳐 올림 — 제품 코드 아님
---
## 11차 — 변경분 추출을 믿고 들고 가게 · 베타 전에 깨지는 것 · 커밋 메시지 수정 (2026-09-17 ~)
진행 기록: [history/2026-09-18-11차.md](history/2026-09-18-11차.md)
지시서: [작업지시/11차.md](작업지시/11차.md). 코드를 읽고 적은 짐작이라 항목마다 먼저 다시 내고 시작한다.
### A. 변경분 추출을 믿고 들고 가게
| 상태 | 항목 |
|---|---|
| **완료** | A-1 먼저 뽑아 보고 적는다 — 고치지 않음. 아홉 경우를 화면에서 뽑아 git 과 대조: 파일 고르기 · 바이트 보존(이진 · 한글 · 깊은 경로) · 범위 표시는 맞음. 확정된 문제 넷 — 지운 파일 · 이름 바뀐 옛 경로가 안 남음, 무엇과 무엇 사이인지 안 남음(병합은 첫 부모 · 거꾸로 범위도 말없이), 비어 있지 않은 폴더에 묻지 않고 덮어써 옛 파일이 섞임, 쓰다 막히면 반쯤 뽑힌 채 멈춤 |
| **완료** | A-2 뽑은 폴더 **옆**에 안내 파일(`…_변경분안내.txt`) — 사용자 결정대로 폴더 밖에 두고 지울 파일은 목록으로만. 범위(커밋 제목 · 날짜) · 뽑은 파일(추가 · 수정 · 이름 바뀜은 옛 이름) · 장비에서 지워야 할 파일(지워짐 · 옛 경로). 화면에서 뽑아 git 과 대조 · 하네스 ReportTest +14(45건) |
| **완료** | A-3 고른 폴더 아래 **새 폴더**(`변경분_4eb9ece..cbcad8a_2026-09-18`, 같은 이름이면 `_2`)를 만들어 뽑는다 · 뽑기 전에 쓸 수 있는지 **먼저 보고** 하나라도 막히면 아무것도 쓰지 않는다(사용자 결정). 화면에서 두 번 뽑아 기존 파일이 섞이지 않는 것 확인 · 하네스 ReportTest +12(57건) |
| **완료** | A-4 ZIP 으로 뽑기 — 사용자 결정 "폴더에 더해 ZIP 도". 폴더 옆 같은 이름 `.zip`(폴더 · 안내 파일 나란히, 바이트 그대로, 한글 이름 UTF-8 표시). 아홉 경우 다시 — ZIP 8/8 을 tar 로 풀어 폴더와 경로 · 해시 같음. 하네스 ReportTest +13(70건) |
### B. 사내 베타 전에 깨지는 것
| 상태 | 항목 |
|---|---|
| **완료** | B-1 배포 묶음 — 옛 Release(09-07)는 본 탭 3개 · 지금 형식 142개 중 74개가 없었다. Release 다시 빌드(경고 0 · 오류 0) · 참조를 따라가 **65개 97MB → 41개 43.5MB**(안 닿는 dll 7개 · 맥/리눅스/ARM 용 · pdb · 빈 Lang 뺌, 플랫폼 Core 가 참조하는 차트 몫은 사용자 결정대로 남김) · `scripts\make-bundle.ps1` 이 묶음과 `배포묶음.txt`(파일 · 크기 · 까닭) 를 만든다 · 빈 폴더(`%TEMP%\mergehub-beta`)에서 켜 네 탭 · 병합 한 길 끝까지(`647f1f8`, 줄끝 · BOM 바뀐 파일 0) · 매뉴얼 실행 위치 문장 고침 |
| **완료** | B-2 D 드라이브가 없는 PC · 설정 없는 첫 실행 — 첫 실행은 오류 없이 되고 기본값이 매뉴얼 표와 같다. D 를 못 쓰면 `UiSettingsService.cs:86` 에서 실패해 "계속 쓸 수 있습니다" 창 뒤 **창 없는 프로세스가 남는 것**을 같은 줄에서 재현. 플랫폼에서 고침(`377ffd3`, 사용자 결정): D 를 못 쓰면 `%LOCALAPPDATA%\UbisamConfig` · 켜는 중 실패는 "켜지 못했습니다" 뒤 끝냄. 세 경우 화면 확인 · 플랫폼 하네스 24건 · 사용자 확인 뒤 플랫폼 배포(바뀐 것 Core · Shell · README 셋) · 배포 묶음 다시 만듦 · 시험 흔적 지움 |
### C. 커밋 메시지 수정
| 상태 | 항목 |
|---|---|
| **완료** | C-1 있는 [커밋 수정] 바로잡기 — 여덟 가지를 화면에서 재현한 뒤 **1 · 3 · 4 · 7 고침**([마지막 메시지]가 HEAD 것 · 작성자와 작성 시각 보존 · 작업 중 단추 끔 · 알림에 "옛 → 새 해시 · 파일 N개 포함"), 이어서 **2 · 6 은 "먼저 묻기"**(사용자 결정) — 스테이징해 둔 파일이 있거나 이미 올린 커밋이면 확인 창을 띄우고 [아니오] 면 아무것도 안 바뀐다. 하네스 MergeSaveTest +22(232건). 8(여러 줄 메시지 못 침)만 범위 밖. 옛 항목: — [마지막 메시지] 가 목록 맨 위(다른 브랜치일 수 있음) · 스테이징 파일이 말없이 들어감 · 원래 작성자 · 시각이 바뀜 · 작업 중에도 켜짐 · 병합 커밋 · 올린 커밋 · 옛 해시 · `#` 줄 |
| **완료** | C-2 마지막 커밋이 아닌 커밋의 메시지 수정 (기획안 "커밋 우클릭 → 이름 변경") — 사용자 결정 **좁은 범위**. 이력 줄 우클릭 [메시지 바꾸기...] → 여러 줄 창 → 확인 창 → 고른 커밋 메시지만 갈고 그 뒤를 같은 트리 · 작성자 · 작성 시각으로 다시 씀(`RewriteHistory`), 되돌릴 자리 `refs/original/…`, 선택이 새 해시를 따라감. 올린 커밋 · 사이에 병합 · 다른 브랜치도 품음 · 태그 · 작업 중 · 커밋 안 한 변경 · 다른 브랜치에만 · 저장 안 한 편집 여덟 자리가 화면에서 막힘. 새 메시지 끝 줄바꿈을 git 처럼 다듬음(화면에서 찾음). 하네스 MergeSaveTest +40(272건) |
### D. 시험 도구 정리
| 상태 | 항목 |
|---|---|
| **완료** | D-1 줄끝 검사 스크립트의 부모 하나 커밋 오류 · 요약 읽는 함수의 "차이 없음" (10차 E-1 에서 남김) — 부모 하나면 첫 부모와만 견준다고 적고 merge-base 를 부르지 않음 · `FileState` 가 "차이 없음" 을 읽음. rebase 한 길 다시: 오류 줄 0 · 커밋 뒤 요약 "차이 없음". 제품 코드 변경 없음 |
### E. 확인 · 문서
| 상태 | 항목 |
|---|---|
| **완료** | E-1 바꾼 길을 다시 끝까지 — A-1 아홉 경우(지운 파일 · 옛 이름 · 범위가 안내에, 두 번 뽑아도 새 폴더 둘, 막힌 파일 없이 끝) · C-1 여덟 경우(HEAD 메시지 · 작성자 보존 · 묻는 창 · 작업 중 꺼짐 · 병합 커밋 부모 둘) · C-2 로 다시 쓴 저장소에서 병합 · 다섯 길 + pull 모두 끝까지. 누른 수 = 로그, 줄끝 · BOM · 충돌 표식 · class 0, 두 탭 같은 커밋. **새로 걸린 것 없음**. 시험 도구가 창 최대화를 풀던 것을 고침 |
| **완료** | E-2 웹 문서 · 기획안을 11차에 맞게 — MergeHub 문서 버전 13(커밋 메시지 고치기 · 변경분 추출 두 절 · 한계 셋 · 11차 표 · 숫자, 단추 이름 91개 소스 대조로 "C# 스타일 끔" 바로잡음) · 기획안 버전 17(커밋 메시지 수정 완료 · 4단계 준비 중, 8쪽 A4 높이 같음, 잠금은 사용자) |
### F. 추가 요청 (2026-09-18 사용자)
| 상태 | 항목 |
|---|---|
| **완료** | F-1 칸 이름 `LOCAL(Mine)` · `REMOTE(Theirs)` 로 맞추고 칸마다 "어느 쪽 · 어느 파일"(MERGED · 두 칸 LOCAL 은 "저장할 파일", mergetool 은 임시 파일 이름 — Mine 칸이 MERGED 이름을 보이던 것 고침), 한 줄 · 가운데 줄이기 · 툴팁 전체 · **덧**: 머지 주석 `[사람] 날짜 출처 설명`, 출처는 로그와 같은 말(Theirs(…) · Mine(…) · REMOTE(…) · BASE(해시)), Take Mine 도 주석. 무시 조건은 원래 출처를 받는 모양이라 코드 그대로, 옛 · 새 · 출처만 다른 주석을 하네스로 굳힘. 네 길 화면 확인 · E-1 병합 길 회귀 없음 · 1,312건 |
| **완료** | F-2 메서드 단위로 골라 반영 — [이 메서드 반영](C# + C/C++, 클래스 멤버 전부 · 사용자 결정), 캐럿이 놓인 멤버를 반영해 올 쪽에서 중괄호 짝으로 잡음(`MemberRanges` — 문자열 · 주석 · raw · `#if` 갈래에 안 속음, 못 잡으면 단추 끄고 까닭 한 줄). 덩어리 · 메서드 반영은 주석 한 줄(메서드 이름 위) · 로그 한 줄 · Undo 한 번 — 덩어리가 줄마다 주석을 달던 것도 고침. 메서드 반영 = 같은 줄 줄 단위 반영 바이트 같음. MemberTest 83건(C# 29 · C++ 13 멤버) · 1,395건 |
| **완료** | F-3 탐색기 [보내기] 로 폴더 두 개 바로 비교 — 탐색기는 여러 개를 프로세스 하나에 인자로 모두 넘김(일곱 경우 값으로 잼), 폴더 둘은 창 하나에서 폴더 비교까지. 사용자 결정대로 3개 이상은 앞의 둘 + 알림, 260자 넘는 경로(탐색기가 8.3 이름으로 넘김 · net48 이 못 찾음)는 열지 않고 알림, 옮긴 배포 묶음은 켤 때 보내기 바로가기를 저절로 고침(바로가기 파일만 · 레지스트리 안 씀), 떠 있을 때는 새 창 그대로. 설치 파일 필요 없음. ArgsTest +16 · 1,411건. **사용자가 실제 탐색기에서 찾은 것**: 보낸 왼쪽 폴더를 기본 저장소가 덮어써 "왼쪽만" 투성이 → 기본값을 먼저 두고 요청을 나중에 받게 고침, 켤 때 받은 인자를 파일 로그에 남김 |
| **완료** | F-4 ACTIONS 칸 감추기(단추 · F9, 끌어 둔 폭 기억, 감춰도 Ctrl+S · Alt+←/→ 그대로) + **덧: 아래 탭 줄 접기**(사용자 요청 — 플랫폼 [탭 접기] · 16 DIP 띠 · F11, 그 항목만 기억, 다른 소비 프로그램도 쓰되 기본 펼침). 1440p 150% 에서 코드 칸 폭 +163px · 높이 +71px. 플랫폼 배포함(09-22 16:22) |
| **완료** | F-5 코드 글자 크기(8~24, 기본 12) — 한 값을 모든 모니터에(모니터 배율은 플랫폼), 코드 칸만, Ctrl+휠 · Ctrl++/- · Ctrl+0 + 설정 "보기 > 코드 글자 크기"(사용자 결정). 줄 높이 · 번호 칸 · 여백 단추가 같은 비율로(`CodeFontMetrics`, 12 에서 지금 값 그대로), 줄 번호 기준선을 코드와 맞춤. 8 · 12 · 24 에서 네 칸 행 높이 같음 · 단추 행 안. FontTest 110 · 1,538건. Ctrl+휠 · 키 · 껐다 켜도 남음 확인. 켜자마자는 포커스가 없어 단축키가 모두 안 듣던 것(원래 있던 것)도 고침 — 포커스가 비었거나 화면 밖이면 편집기로 |
| **완료** | F-6 글자를 되도록 많이 보이게 — 방법마다 1920×1080 줄 수를 재 드린 뒤 사용자 결정 "줄 간격 줄여주고 선택 사항은 만들지 마": 줄 높이 글자의 1.67배 → 1.33배(12 → 16). 두 칸 40 → 50줄(탭 줄 접으면 53), 네 칸 17 · 18 → 22 · 23줄. 한글 잘림 · 겹침 없음, E-1 회귀 없음. FontTest 144 · 1,572건 |
| **완료** | F-7 대형 모니터에서 오른쪽(종료 · ACTIONS)이 잘림 — 창이 모니터 밖으로 나간 것. 켤 때 창 모드로 기억한 자리를 모니터에 조금만 걸쳐도 그대로 놓던 것을 가장 많이 겹치는 모니터 안으로 밀게(플랫폼 `FitToMonitors`). 재현 840px 넘침 → 0. 좁은 창 × 화면 배율 80~133% 는 원래 넘친 것 없음. PlacementTest +8. 플랫폼 배포함(09-22) |
| **완료** | F-8 저장한 뒤에도 되돌리기 — 저장 · 저장 후 커밋 뒤 Undo/Redo 유지(저장할 것 있음은 "마지막 저장과 다른가" 로), 줄을 다시 세울 때(커밋 뒤 새 HEAD · 규칙 바꾸기 · 친 뒤 재정렬) 이력을 글 단위로 옮겨 지킴, 친 것도 한 걸음. 전체 되돌리기는 파일을 연 시점. Git 탭 "푼 파일" + [다시 충돌로](이 단추만 git.exe, 사용자 결정). MergeSaveTest +21 |
| **완료** | F-9 저장할 때 백업 — 설정(기본 끔)을 켜면 모든 저장(두 파일 · mergetool · Save & Commit · 병합 중 Save · 파일 단위 Accept · 폴더 복사) 직전에 지금 파일을 바이트 그대로 `{설정 폴더}\Backup\MergeHub\날짜\…` 에 모음(목록.txt, 저절로 안 지움). 못 만들면 저장 안 함. ACTIONS [백업 폴더 열기]. 하네스 +25 |
| **완료** | F-10 칸마다 자기 줄 · 바뀐 덩어리를 잇는 선(Araxis 식, 사용자 요청으로 넓힘) — 빈 줄로 맞추지 않고 칸마다 자기 줄만, 틈에 사다리꼴 선 · 옮김 점선, 가운데 기준 스크롤, 차이 이동은 가운데로, 지운 줄 [>] 는 BASE 칸 끝. 3분할은 위 세 칸 사이. 편집기 빈 줄(StripFillers) 없앰. PaneLinkTest 17 새로 · EditorTest 14 → 18 |
| **완료** | F-11 Git 계정 · URL · 토큰 저장 — 확인해 보니 껐다 켜면 셋 다 비었다. URL · 계정은 적으면 설정에 남기고, 토큰은 fetch/pull/push/클론이 성공하면 윈도 자격 증명 관리자에 저장(평문 아님 · 설정 파일에 글자 없음), 켤 때 그 서버 것만 가져옴. [토큰 지우기] · "저장됨" 표시 · 인증 실패 한글 안내. MergeSaveTest +15 |
| **완료** | F-12 C# 코드 스타일 맞춤 기본값을 AURORA 로 (2026-09-18 사용자 결정) — 설정 없는 첫 실행에서 AURORA, 중괄호만 다른 C# 짝 "차이 없음" · 같은 모양의 C++ 짝은 "남은 차이 4줄"(원본 그대로). 저장 동작은 그대로. 하네스 StyleTest +12(90건) |
---
### G. 11차 뒤 추가 (2026-09-23 사용자 증상)
| 상태 | 항목 |
|---|---|
| **완료** | G-1 배율이 크게 다른 새 모니터(3840×2160 · 300%)에서 최대화하면 오른쪽 1280px · 아래 170px 이 화면 밖으로 — 셸이 모니터별 V1 이라 최대화 크기를 윈도가 더 크게 잡았다. 최대화된 뒤 그 모니터 크기와 다르면 한 번 다시 놓게 고침(플랫폼 `FitMaximizedToMonitor`). 넘침 0 · 모니터 밖 요소 0개. PlacementTest +6(51건). **플랫폼 배포함**(2026-09-23) |
| **완료** | G-2 새 플랫폼(`D:\Sorce\ubsrepo`)으로 옮겨 태움 — 우리가 옛 플랫폼에 넣었던 여덟 가지(세 갈래로 묻는 창 · 덮는 창 가운데 맞춤 · D 드라이브 없는 PC · 켤 때 터지면 안내창 · 셸 창 자리 기억 · 모니터 안으로 · 최대화 크기 맞춤 · 탭 줄 접기 F11)와 **트레이(최소화하면 트레이로)** 를 새 플랫폼에 넣고, MergeHub 를 그 위에서 뜨게 맞춤(플랫폼에서 없어진 사용자 이름 서비스 대신 설정 "머지 주석 > 작성자", 여백은 `PlatformChrome.FullBleed`, 실행은 `UbisamBase.Launcher.exe`). 하네스 34건 · 화면 확인(탭 접기 · F11 · 트레이 왕복 · 창 자리 기억 · 화면 밖 자리 · 두 모니터 최대화). **커밋 안 함**(사용자 지시) |
---
## 12차 — 폴더 비교를 읽기 쉽게 · 양방향 머지 · 화면 안내 (2026-09-23 ~)
진행 기록: [history/2026-09-23-12차.md](history/2026-09-23-12차.md)
지시서: [작업지시/12차.md](작업지시/12차.md)
### A. 폴더 비교를 읽기 쉽게
| 상태 | 항목 |
|---|---|
| **완료** | A-1 폴더 줄의 크기가 늘 0B — 폴더 줄에 **안에 든 파일 크기 합계**를 적는다(하위 폴더까지, 양쪽 따로). 크기 글자도 사람이 읽는 단위로(`490.2KB` · `2.4MB`). 걸러 낸 파일은 합계에서도 빠지고, 한쪽에만 있는 폴더는 그쪽만. 탐색기 속성과 같은 값 7곳 확인. 4,608 줄 묶음에서 합계 채우기 **0ms**. FolderTest +23(111건) |
| **완료** | A-2 좌우로 나눠 보이기 — 한 줄을 **왼쪽 목록 · 가운데 상태 · 오른쪽 목록** 세 칸으로. 칸마다 자기 쪽 이름 · 크기를 적고 그쪽에 없으면 칸을 비운다. 트리가 깊이만큼 줄을 미는 것을 되돌리고 이름만 다시 들여써(`TreeDepthMarginConverter`) 칸 경계 · 구분선이 줄마다 같은 자리. 접기 · 복사 · 걸러 보기 그대로. FolderTest +7(118건) |
### B. 파일 비교 화면
| 상태 | 항목 |
|---|---|
| **완료** | B-1 2-Way 에서 양쪽으로 머지 — **두 파일 비교에서만**(사용자 결정 2026-09-27, Git 모드의 왼쪽은 지난 커밋이라 제외). 줄마다 `[<]` 로 왼쪽에 반영(왼쪽에 없는 줄은 LOCAL 여백의 `[<]`), ACTIONS 에 `◀ 왼쪽 저장` · `오른쪽 저장 ▶` - 고친 것이 없는 쪽은 꺼짐. 두 방향이 같은 규칙(`PaneText`), 되돌리기는 편집마다 어느 칸인지 들고 한 스택에서, 저장 기준점 · 백업은 양쪽 따로. TwoWayTest 29건 새로 |
| **완료** | B-2 프로그램 정보 창 — [단축키] 옆 **[정보]** 단추. 프로그램 이름 · 버전 · 빌드 날짜 · 만든 사람 · 사내 문의처(사용자 결정) + [정보 복사]. 버전은 csproj `<Version>`(12차 = 0.12.0)을 실행 파일에서 읽고, 빌드 날짜는 빌드할 때 어셈블리에 박는다(결정적 빌드라 PE 시각은 날짜가 아님). 만든 사람 · 문의처는 설정에서 적는다(비워 둠). AboutTest 28건 새로 |
| **완료** | B-3 칸 아래에 무엇이 달라졌는지 — 칸마다 `6줄 · 추가 1 · 삭제 1 · 수정 1`(칸을 기준으로 읽는다, 무시 · 머지 주석 줄은 차이로 안 셈), 가운데 틈 아래에 `3 / 7` · `남은 2`. 3분할은 네 칸 모두 BASE 와 견주고 BASE 는 `기준`. 반영 · 되돌리기 · 저장마다 따라감. 5만 줄 × 두 칸 × 네 번 22ms. SummaryTest 25건 새로 |
### C. 플랫폼
| 상태 | 항목 |
|---|---|
| **완료** | C-1 트레이 아이콘 — 최소화하면 알림 영역으로, 왼쪽 단추로 되살리기 · 우클릭 [열기]/[종료]. 새 플랫폼(`D:\Sorce\ubsrepo`) 에 넣음(11차 뒤 G-2 와 같은 작업) |
| **완료** | C-2 탭 줄 크기 줄이기 — 하단 탭 줄 항목을 74 → 61 DIP 로(여백 13/14→9/10 · 아이콘 22→20 · 틈 7→5 · 글자 13.5→12.5). 실측 133 → 109px(−18%), 파일 비교 코드 칸 47 → 48줄. **배포됨** — 새 플랫폼을 빌드하면서 함께 나갔고, 2026-09-28 배포본 해시 · 화면 실측(111px · 항목 109px)으로 확인 |
### E. 저장하지 않아도 남는 편집
| 상태 | 항목 |
|---|---|
| **완료** | E-2 여러 짝을 동시에(문서 탭) — 파일 비교 맨 위에 문서 탭 줄(둘 이상일 때만 보임). 탭 이름은 파일 이름 · 다르면 `왼 ↔ 오` · 겹치면 위 폴더를 덧붙임 · 저장 안 한 탭은 `•`. 짝을 바꿀 때 **묻지 않는다**(탭이 편집을 맡는다). 탭이 사라져도 고친 글은 보관함에 남아 다시 열면 되살아남(◀ ▶ 로 훑다 돌아와도). Ctrl+Tab · Ctrl+Shift+Tab · Ctrl+W · 가운데 단추 닫기. 탭마다 되돌리기 · 캐럿 · 스크롤 · 저장 형식. 상한 20(고친 탭은 안 닫음). 탭 이름은 **양쪽이 같은 부분을 한 번만** 적는다(`WeldController_기준 ↔ 내작업.cs` — 421 → 288px). 점은 **사람이 손댄 것만**(스타일 맞춤으로만 바뀐 것은 빼고 센다 — 묻는 자리와 같은 기준). 하네스 `DocTabTest` 106건, 화면 34건 · 회귀 19건 확인 |
| **완료** | E-1 꺼도 작업 내용이 남아 있게(notepad++ 식) — E-2 보관함을 `{설정 폴더}\Session\MergeHub\` 에 옮겨 적는다(차례는 `목록.txt`, 글은 짝마다 따로 파일, 원본 글은 담지 않고 파일 자취만). 글자가 멈춘 뒤 2초 · 탭을 옮기거나 닫을 때는 바로, 쓰는 일은 다른 실로. 켤 때 묻지 않고 되살리되 사용자가 지금 열라고 한 것이 먼저. 원본이 그 사이 바뀌면 되살리고 알린다. 다 저장하면 보관본을 치운다. 하네스 `SessionTest` 65건, 화면 24건(강제 종료 뒤 되살아남 포함) |
### 쓰다 나온 것
| 상태 | 항목 |
|---|---|
| **완료** | `[<]` 단추가 있는 줄만 글이 밀린다(사용자 보고, 그림으로 짚어 줌) — 단추 칸 폭이 `Auto` 라 단추가 보이는 줄만 뒤 칸이 밀렸다(BASE 는 번호까지, LOCAL 은 코드가). `GutterBothWaysWidth` 로 두 칸이 같은 자리를 늘 잡아 두고, 모드에 따라 0 ↔ 단추 폭으로 갈아 끼운다. 편집기 여백도 같이 민다. 값으로 확인: 한 칸의 모든 줄이 같은 x(BASE 137 · LOCAL 1283), 글자 크기 · Git 모드도 그대로 |
| **완료** | 왼쪽 줄 번호가 밀린다(위를 쫓다 따로 찾음) — 12차 B-1 로 왼쪽에도 반영할 수 있게 됐는데 왼쪽 번호를 다시 매기는 자리가 없었다. 줄을 넣으면 그 줄은 번호가 비고 뒤 줄은 옛 번호(`01 02 · 03 04 05 · 06`), 저장하면 8줄인데 번호는 6까지. `RenumberBase` 를 두어 두 파일 비교에서만 왼쪽 줄을 1부터 다시 맨다. "머지 반영함" 표시가 BASE 번호를 열쇠로 쓰므로 그 열쇠도 함께 옮긴다. Git · 네 칸은 손대지 않는다 |
| 볼 것 | 왼쪽에만 있는 줄을 `[<]` 로 뺄 때 줄 수가 실제로 주는지 — 따로 열면 되는데 다른 반영 뒤에는 시험 도구가 낡은 줄 칸을 집어 값이 흔들렸다. 번호 불변식은 지켜짐 |
### 시험 도구
| 상태 | 항목 |
|---|---|
| **완료** | 화면 시험 도구를 런처에 맞춤 — 새 플랫폼은 `UbisamBase.Launcher.exe` 가 창 주인이라 예전 이름만 찾던 시험이 전부 "창이 안 뜬다" 로 멈춰 있었다. `a2lib.ps1` 에 `Shell-Procs` · `Shell-Proc` · `Stop-App` 을 두고 스크립트 76개 · 156곳을 함께 고침. 문법 187개 통과 · 끄고 켜고 탭 넘기기까지 실제 확인. 제품 코드 변경 없음 |
## 3~4주차로 미룬 것
디테일이라 지금 붙잡을 일이 아니다.
- 로그인·권한
- ~~대용량 파일 성능~~ — 잴 필요가 없어졌다(2026-09-10). 실제 소스의 가장 큰 파일이 7,479줄이고 편집·이동·재정렬이 모두 빠르다
- 같은 줄 접기 (4차 B-2) — 차이 이동만으로 부족하다고 느끼는 순간이 오면 그때
- 외부 편집기로 열기 (4차 B-4) — 설정 값 두 개를 채우는 수고가 얻는 것보다 컸다
드래그&드롭(D-7)과 비교 결과 내보내기(D-6)는 3차에서 앞당겨 끝냈다.
---
## 지난 기록
| 날짜 | 문서 |
|---|---|
| 2026-09-10 | [4차 — 로컬 머지툴 사용성](history/2026-09-10-4차.md) — 열세 항목, 열하나 완료 · 둘 취소 |
| 2026-09-09 | [3차 — 버그 정리 + 기능 확장](history/2026-09-09-3차.md) — 스물세 항목, 전부 끝 |
| 2026-09-08 | [2주차 — 폭 넓히기](history/2026-09-08-2주차.md) — 기능 덩어리 ①~⑤ |
한 줄 요약은 [history/changelog.md](history/changelog.md) 에 있다.