Ubisam-MergeTool/doc/history/2026-09-17-9차.md
ksj09406 f02c3e8049 9차 B-1: 반영하며 넣은 머지 주석 줄을 처음부터 다시 정렬한 모양으로
네 칸에서 Take 하면 넣는 주석 줄이 "추가"(파랑)였다가 다시 정렬하면 "무시"(회색)가 됐고,
LOCAL(Mine) 칸에 내 파일에 없는 주석 글이 번호 없이 보였다. 사용자 결정 "처음부터 무시 색".

- InsertNoteAbove: IsIgnored = Rules.IsFiltered(주석), 네 칸이면 SetThreeWay(null...) 로 Mine 빈 자리
- 규칙 "머지 주석 무시" 를 끄면 지금처럼 추가
- 하네스 NoteTest +5 (69건), 22벌 1,122건 통과, 빌드 경고 0 오류 0

확인: Weld/Unit1.cs Take Theirs 직후 무시 1 · 추가 0, [Aa] 로 두 번 다시 정렬해도 같음,
Undo · Redo 가 주석 줄을 걷고 다시 넣음, 저장 내용(주석 1줄 · 3788줄) 그대로.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 11:46:24 +09:00

157 lines
13 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.

# 9차 진행 기록 (2026-09-17 ~)
지시서: [../작업지시/9차.md](../작업지시/9차.md)
## A-1. cherry-pick 마지막 저장 뒤 "내 쪽 대비" 라고 하지만 실제 기준은 이력에서 고른 커밋이다 (2026-09-17, 완료)
사용자 결정(2026-09-17): **작업 중 충돌을 다 풀면 두 칸의 기준을 HEAD 로 옮긴다.**
("기준은 고른 커밋 그대로 두고 글을 맞춘다" 는 고르지 않음.)
### 고치기 전에 다시 났다 (길마다 저장소를 새로 만들어, 파일 비교 탭을 미리 열지 않고)
8차 E-1 순서 그대로 — 이력에서 커밋을 골라 시작 → 한 파일만 남기고 파일 단위 Accept Theirs → 남은 파일을 [3분할로 열기] → 충돌마다 Take Theirs → [Save].
| | cherry-pick ([모든 브랜치] 켬) | revert ([모든 브랜치] 끔) |
|---|---|---|
| 이력에서 고른 커밋 | `상대 쪽 작업` | `내 쪽 작업` |
| 마지막 Save 뒤 두 칸 기준(Selected Commit) | **`뒤이은 수정`** — HEAD(`내 쪽 작업`)도 고른 커밋도 아닌 다른 브랜치 커밋 | `뒤이은 수정` = HEAD |
| BASE 제목 | `ace42e3 · Weld/Unit1.cs` (꼬리 없음) | `… · Motion/Unit0.cs · 되돌리기 전 내 쪽` |
| 요약 | 충돌 정리 끝 · [커밋] 으로 cherry-pick 을 끝냅니다 · **내 쪽 대비** 가져온 변경 6줄 | … · 내 쪽 대비 되돌린 변경 6줄 |
- 8차 E-1 에서 따로 잰 한 번은 기준이 **고른 커밋**이었다. 이번 cherry-pick 은 **목록 맨 위(다른 브랜치 커밋)**, revert 는 **HEAD**.
같은 순서인데 기준이 셋 중 하나로 그때그때 달랐다 — N1 과 N1-덧(9차 A-2)은 뿌리가 같다.
- 파일 비교 탭 왼쪽 이력에서 선택된 줄이 맨 위 `뒤이은 수정` 이었다(스크린샷 `d9-a1-pick-before-1`).
### 원인
- 새로고침은 이력 목록(`Commits`)을 **비웠다가 다시 채운다.** 그때 Git 탭 이력 목록(`SelectedItem` 바인딩)이 선택을 놓치면 **null 을 밀어 넣어** 고른 커밋이 빈다.
놓치는지는 그때 화면 상태에 따라 달랐다.
- 비었으면 `SelectedCommit = Commits[0]` — **목록 맨 위**로 채웠다. [모든 브랜치] 를 끄면 맨 위가 HEAD 라 티가 안 났고,
켜면 맨 위는 가장 최근의 다른 브랜치 커밋이다.
- 안 비었으면 이력에서 고른 커밋(cherry-pick 할 커밋)이 그대로 기준으로 남았다.
- 요약(`OperationLabels.ResolvedSummary`)은 기준이 HEAD 인지 보지 않고 "내 쪽 대비" 를 붙였다. BASE 제목은 HEAD 일 때만 작업 글을 붙여서 둘이 다른 말을 했다.
### 고친 것
- `Services/CommitSelection.cs`(새로) — 새로고침 뒤 고를 자리:
작업 중 충돌이 **막 0 이 된** 새로고침이면 HEAD, 아니면 새로고침 전에 고른 커밋을 **해시로** 되찾고, 없으면 맨 위가 아니라 HEAD(HEAD 도 목록에 없을 때만 맨 위).
"막 0 이 된" 때만 옮긴다 — 그 상태에서 사람이 다른 커밋을 골라 보면 스테이징 · 새로고침마다 HEAD 로 끌어오지 않는다.
- `GitWorkspace.ReadState` — 목록을 갈아 끼우기 **전에** 고른 커밋의 해시를 적어 두고, 채운 뒤 `CommitSelection.Choose` 로 새 목록의 같은 커밋 객체를 고른다.
- `OperationLabels.ResolvedSummary(…, baseIsHead)` — 기준이 HEAD 가 아니면 작업 글을 쓰지 않는다(보통 요약). `HomeViewModel` 은 BASE 제목과 같은 조건(`SelectedCommit.ShortSha == HeadSha`)을 넘긴다.
- 하네스 `MergeSaveTest` 18건 추가(201건): 해시로 되찾기 · 순서가 바뀐 목록 · 비었을 때 HEAD · 사라졌을 때 HEAD · 막 0 이 되면 HEAD · 머무는 동안 안 끌어옴 · 기준이 HEAD 가 아니면 보통 요약.
### 확인한 것 (고친 앱, 같은 순서)
| | cherry-pick ([모든 브랜치] 켬) | revert |
|---|---|---|
| 마지막 Save 뒤 Selected Commit | **`내 쪽 작업` = HEAD** | `뒤이은 수정` = HEAD |
| BASE 제목 | `e039373 · Weld/Unit1.cs · 가져오기 전 내 쪽` | `6dde274 · Motion/Unit0.cs · 되돌리기 전 내 쪽` |
| 요약 | 충돌 정리 끝 · [커밋] 으로 cherry-pick 을 끝냅니다 · 내 쪽 대비 가져온 변경 6줄 | … · 내 쪽 대비 되돌린 변경 6줄 |
| git 과 대조 | `git diff -U0 HEAD -- Weld/Unit1.cs` = 바뀐 줄 6 + 머지 주석 줄 6. 주석 줄은 규칙(무시: 머지 주석)대로 안 셈 → **6 이 맞다** | 같은 구성(+12 −6) |
곁 확인(`d9-a1-keep.ps1`):
| 경우 | 결과 |
|---|---|
| 충돌을 다 푼 cherry-pick 저장소를 다시 열기 | 기준 HEAD · 요약 작업 글 |
| 그 상태에서 파일 비교 탭 이력으로 `바탕` 을 고름 → [새로고침] 세 번 | 세 번 모두 `바탕` 그대로(HEAD 로 안 끌려감) · 제목 꼬리 없음 · 요약 "차이 없음"("내 쪽 대비" 안 함) |
| 작업 없음 · [모든 브랜치] 켬 | 맨 위 `뒤이은 수정` 이 아니라 HEAD `내 쪽 작업` 그대로 |
| Git 탭 이력에서 `상대 쪽 작업` 을 고름 → [새로고침] 세 번 | 세 번 모두 `상대 쪽 작업` 그대로 |
| [모든 브랜치] 를 꺼 고른 커밋이 목록에서 빠짐 | HEAD 로 |
- 하네스 22벌 1,112건 통과(+18) · 빌드 경고 0 · 오류 0.
- 병합 · pull · rebase 의 요약 · 제목은 기본값(`baseIsHead` 참)으로 8차 B-1 검사가 그대로 통과한다. 화면으로는 9차 D-1 에서 다시 본다.
### 알게 된 것 · 남긴 것
- **Git 탭 이력에서 커밋을 고르면 파일 비교 탭의 Selected Commit 은 새로고침 전까지 따라오지 않는다**(Git 탭은 `_workspace.SelectedCommit` 만 바꾸고, 파일 비교 탭은 새로고침 알림으로만 다시 읽는다).
이번에 바꾼 것이 아니라 전부터 그랬다. 고치지 않고 적어 둔다.
- A-2(한 번은 다른 브랜치 커밋이 기준)는 이번에 원인(목록 맨 위로 채움)이 드러나 함께 고쳐졌다. 지시서대로 A-2 에서 같은 순서를 다섯 번 넘게 되풀이해 확인한다.
- 자동 조작 쪽: 첫 확인 스크립트는 Git 탭에서 HEAD 를 골라 파일 비교 탭을 봤는데 위의 까닭으로 안 바뀌어, 파일 비교 탭 이력에서 고르게 고쳤다.
## A-2. 한 번은 기준이 HEAD 도 가져온 커밋도 아닌 다른 브랜치 커밋이었다 (2026-09-17, 완료)
### 원인 (A-1 에서 드러남)
- 8차 E-1 N1-덧의 `f310f49`(다른 브랜치의 `뒤이은 수정`)는 **목록 맨 위**였다. 새로고침이 이력 목록을 갈아 끼울 때 Git 탭 목록이 선택을 놓치면
고른 커밋이 비고, 비면 `Commits[0]` 으로 채웠다. [모든 브랜치] 를 켜면 맨 위는 가장 최근의 다른 브랜치 커밋이다.
- 놓치는지는 그때 화면 상태에 따라 달라 "같은 순서로 다시 재니 안 났다". 9차 A-1 의 고치기 전 확인에서 **다시 났다**(기준 `ace42e3 "뒤이은 수정"`).
- A-1 에서 해시로 되찾고 없으면 HEAD 로 채우게 고쳤다(`CommitSelection`).
### 고치며 새로 걸린 것 → 함께 고침
- A-1 대로 해시만 지키자 **cherry-pick [커밋] 뒤에도 선택이 옛 HEAD(`내 쪽 작업`)에 남아** 파일 비교가 방금 커밋한 줄을 **"남은 차이 6줄"** 이라고 했다
(되풀이 확인 첫 회차에서 남). 예전에는 선택을 놓치면 맨 위(새 커밋)로 가서 우연히 "차이 없음" 이었다.
- `CommitSelection.Choose(…, previousHeadSha)` — **HEAD 를 보고 있다가 HEAD 가 움직이면**(커밋 · 체크아웃) 새 HEAD 를 따라간다.
다른 커밋을 보고 있었으면 그대로 둔다. `GitWorkspace` 가 지난 새로고침의 HEAD(`_lastHeadSha`)를 들고 있다.
- 하네스 `MergeSaveTest` 5건 추가(206건): HEAD 를 보다 커밋하면 새 HEAD · 다른 커밋을 보고 있었으면 그대로 · HEAD 가 안 움직이면 그대로 · 처음 열기 · 새 HEAD 가 목록에 없음.
### 확인한 것 — 8차 E-1 순서를 여섯 번 (`d9-a2.ps1`)
회차마다 저장소를 새로 만들고, 파일 비교 탭을 미리 열지 않고, [모든 브랜치] 를 켜고 이력에서 `상대 쪽 작업` → [Cherry-pick] →
`Weld/Unit1.cs` 만 남기고 파일 단위 Accept Theirs → [3분할로 열기] · Take Theirs · [Save] → 충돌 탭 [커밋]. 새로고침이 일어나는 곳마다 Git 탭 이력의 선택 줄과 파일 비교 탭 Selected Commit 을 적었다.
| 지점 | 기대(규칙) | 6회 결과 |
|---|---|---|
| [Cherry-pick] 뒤(충돌 24) | 고른 커밋 `상대 쪽 작업` | 6/6 |
| 파일 단위 Accept 뒤(충돌 1) | 고른 커밋 | 6/6 |
| 마지막 [Save] 뒤(충돌 0) | HEAD `내 쪽 작업` · 제목 "가져오기 전 내 쪽" · 요약 "내 쪽 대비 가져온 변경 6줄" | 6/6 (Git 탭 · 파일 비교 탭 둘 다) |
| [커밋] 뒤 | 새 HEAD(cherry-pick 커밋) · "차이 없음" · Working Tree Clean | 6/6 (첫 회차는 고친 뒤 되풀이 스크립트의 1회) |
- 다른 브랜치 커밋(`뒤이은 수정`)이 기준으로 잡힌 회차 0.
- 하네스 22벌 1,117건 통과(+5) · 빌드 경고 0 · 오류 0.
### 남긴 것
- 자동 조작 쪽: 되풀이 스크립트가 처음에 한 회차만 돌았다. PowerShell 변수 이름은 대소문자를 가리지 않아 안쪽 반복 횟수 `$rounds` 가 회차 수 `$Rounds` 를 덮었다. 이름을 바꿔 다시 돌렸다.
- Git 탭에서 고른 커밋을 파일 비교 탭이 새로고침 전까지 안 따라오는 것(A-1 에 적음)은 그대로다.
## B-1. MERGED 칸에서 반영하며 넣은 주석 줄이 다시 정렬하면 "무시" 색이 된다 (2026-09-17, 완료)
사용자 결정(2026-09-17): **처음부터 "무시" 색.** ("머지 반영함" 색으로 계속 · 그대로 둔다는 고르지 않음.)
### 고치기 전에 다시 났다 (새로 만든 저장소, MergeHub 로 병합 → `Weld/Unit1.cs` 를 [3분할로 열기])
첫 충돌(101행 `Power100`)에서 Take Theirs → 규칙 [Aa 구분] 을 눌러 다시 정렬 → 한 번 더 눌러 되돌림.
| 때 | 범례 | 101행 주석 줄 | LOCAL(Mine) 칸 |
|---|---|---|---|
| 연 뒤 | 무시 0 · 추가 0 · Conflict 6 · 총 3787줄 | - | - |
| Take Theirs 직후 | 머지 반영함 1 · **추가 1** · 무시 0 · Conflict 5 · 총 3788줄 | **추가(파랑)** | 번호 없이 **주석 글이 보임**(내 파일에 없는 줄) |
| 다시 정렬 뒤 | 머지 반영함 1 · 추가 0 · **무시 1** · Conflict 5 | **무시(회색)** | 빈 자리 |
- 6차 기록의 "처음 넣었을 때 색" 은 "머지 반영함" 이 아니라 **"추가"** 였다. 지시서도 그 말을 옮겨 적었다.
- 요약 · 차이 수 · 총 줄 수 · 저장된 파일(주석 1줄 · 3788줄)은 다시 정렬 전후가 같았다 — 색과 범례만 달랐다.
### 원인
- 주석 줄을 넣을 때(`InsertNoteAbove`) `IsApplied = true` 로 만들지만, 곧바로 반영 표시를 다시 계산하는 `RefreshAppliedFlags` 가 되돌리기 스택에 없는 그 줄을 **반영 아님**으로 되돌린다.
BASE 에 없는 줄이라 "추가" 가 된다. 무시 규칙은 정렬할 때만 매겨서 넣는 순간에는 빠져 있었다.
- 다시 정렬하면 줄을 새로 만들며 규칙 "머지 주석 무시" 에 걸려 `IsIgnored` → "무시"(색은 무시가 먼저). 파일에 원래 있던 주석 줄과 같은 모양이다.
- 네 칸에서는 `SetRemote(null, null)` 이 MINE 칸에 LocalText(주석)를 넣어 LOCAL(Mine) 칸에 글이 보였다. 다시 정렬한 행은 MINE 이 빈 자리다.
### 고친 것
- `HomeViewModel.InsertNoteAbove` — 넣는 줄을 **다시 정렬했을 때와 같은 모양**으로 만든다.
`IsIgnored = Rules.IsFiltered(주석)`(규칙이 꺼져 있으면 지금처럼 추가), 네 칸이면 `SetThreeWay(null, null, null, null)`(MINE · REMOTE 빈 자리).
- 하네스 `NoteTest` 5건 추가(69건): 주석 줄이 끼어든 MERGED 를 다시 정렬하면 주석 행 하나가 서고 BASE · MINE · REMOTE 가 비며, 규칙이 켜져 있으면 무시 줄 · 끄면 아님 — 넣는 순간 모양의 기준.
### 확인한 것 (같은 순서로 다시, `d9-b1.ps1` · `d9-b1-extra.ps1`)
| 때 | 범례 | 101행 주석 줄 | LOCAL(Mine) 칸 |
|---|---|---|---|
| Take Theirs 직후 | 머지 반영함 1 · 추가 0 · **무시 1** · Conflict 5 · 총 3788줄 | 무시(회색) | 빈 자리 |
| [Aa] 한 번 · 두 번 다시 정렬 | 같음 | 같음 | 같음 |
| [Undo] | 머지 반영함 0 · 무시 0 · Conflict 6 · 총 3787줄 | 걷어냄 | - |
| [Redo] | 머지 반영함 1 · 무시 1 · Conflict 5 · 총 3788줄 | 다시 무시 | 빈 자리 |
| Save 뒤 | git `M` · 주석 1줄 · 3788줄 (고치기 전과 같음) | | |
| 규칙 "머지 주석 무시" 끔 · Take Theirs 직후 | 머지 반영함 1 · **추가 1** · 무시 0 (지금처럼) | 추가 | |
- 하네스 22벌 1,122건 통과(+5) · 빌드 경고 0 · 오류 0. 설정은 시험마다 백업 → 되돌림(해시 같음).
### 알게 된 것 · 남긴 것 (고치지 않음)
- **규칙 "머지 주석 무시" 를 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 간다.** 주석 줄이 BASE 의 코드 줄(`Power93`)과 한 행으로 짝지어져,
초록(머지 반영함)이 주석 줄에 · 보라(직접 수정)가 반영한 코드 줄(`Power100 => 0.9`)에 붙는다. 반영 표시가 BASE 줄 번호로 붙들려 있어서다.
이번에 바꾼 것이 아니고 기본값(켬)에서는 나지 않는다. 범례 수 · 저장 내용은 같다.