두 탭이 같은 고른 커밋 값을 쓰는데 표시는 새로고침 전까지 안 따라왔다. 파일 비교 탭에서 '바탕' 을 고르면 Git 탭은 '내 쪽 작업' 에 선택 표시가 남은 채 [Revert] 가 '바탕' 을 되돌렸다. 사용자 결정: 바로 따라간다(양방향) · 저장 안 한 편집이 있으면 고르는 순간 묻는다. - GitWorkspace: CommitChosen 알림, ConfirmLeaveCommit(null 안 물음 / true 계속 / false 취소) - CommitSelection.IsOtherCommit (하네스 +4, MergeSaveTest 210) - HomeViewModel: 다른 쪽이 고르면 게이트가 빈 뒤 목록 · 두 칸을 다시 세움, WillAskBeforeDiscard - GitViewModel: 파일 비교 탭이 고르면 선택 표시 · 단추 따라감, 커밋 내용은 탭이 다시 보일 때 - GitView: 이력 목록이 선택을 바꾸기 전에(마우스 · 방향키) 묻고 [취소] 면 누름을 막음, 물은 뒤 [계속] 이면 직접 고름 확인: 두 방향 · BASE 까지 따라감, 편집 있음 [취소] 두 탭 제자리 · 창 한 번, [계속] 따라감 · 편집 버려짐, 방향키 같음, [Revert] 는 보이는 커밋, 9차 A-2 흐름 그대로. 22벌 1,126건 통과, 빌드 경고 0 오류 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9.9 KiB
9.9 KiB
10차 진행 기록 (2026-09-17 ~)
지시서: ../작업지시/10차.md
A-1. 네 칸에서 충돌을 차례로 고르는데 한 번이 남지 않아 "남은 충돌 1개" 로 멈췄다 (2026-09-17, 완료 · 고치지 않음)
61번 되풀이해도 다시 나지 않았다. 앱은 누른 것을 모두 받아 처리했다. 짚이는 원인은 시험 도구 쪽이라 제품 코드는 바꾸지 않았고, 시험 도구를 고쳤다.
무엇으로 쟀나
- 앱에 임시 로그를 넣었다(
[A1측정], 잰 뒤git checkout으로 되돌리고 다시 빌드 — 남은 줄 0 · 경고 0 · 오류 0). [다음 충돌] 이 불릴 때 캐럿 · 고른 줄 · 옮겨 간 줄, Take Mine / Theirs 가 불릴 때 고른 줄(충돌인지 · 정할 필요가 있는지 · 주석 줄인지) · 남은 충돌 수(전 · 후), 그리고 Take 단추가 꺼지는 순간(CanExecute 가 거짓)의 고른 줄. - 되풀이 스크립트(
d10-a1.ps1): 새 저장소 → 병합 또는 cherry-pick([모든 브랜치]) →Motion/Unit0.cs와Weld/Unit1.cs(둘 다 충돌 6개)를 편집을 버리고 번갈아 다시 열며 [다음 충돌] → Take Theirs / Take Mine 번갈아 여섯 번. 누르기 직전에 단추가 켜져 있었는지를 적고(꺼져 있으면 누르지 않고 "꺼짐"), 앱 로그로 Take 가 몇 번 불렸는지 센다. - 누름 간격 두 가지: 9차와 같은 간격(다음 충돌 뒤 1.0초 · Take 뒤 1.3초 — 9차
Click의 0.6초 대기 포함) · 0.1초(사람이 빠르게 누르는 쪽).
결과
| 묶음 | 되풀이 | 누름(다음 충돌 · Take) | 앱이 받은 Take | 끝나지 않은 회차 | 꺼져 있던 누름 |
|---|---|---|---|---|---|
| 병합 · 9차 간격 | 7 + 14 = 21 | 126 · 126 | 126 | 0 | 0 |
| 병합 · 0.1초 | 20 | 120 · 120 | 120 | 0 | 0 |
| cherry-pick · 9차 간격 | 10 | 60 · 60 | 60 | 0 | 0 |
| cherry-pick · 0.1초 | 10 | 60 · 60 | 60 | 0 | 0 |
| 합계 | 61 | 366 · 366 | 366 | 0 | 0 |
앱 로그 전체(시작 표시 62개 · 첫 병합 묶음 8회차는 고르기 뒤 자동 조작 오류로 끊김 — 아래):
| 확인 | 값 |
|---|---|
| Take 시작 · 끝 | 372 · 372 |
| 충돌이 아닌 줄(정할 필요 없음 · 주석 줄)에서 시작한 Take — 헛돈 Take | 0 |
| Take 한 번에 남은 충돌이 정확히 하나 줄지 않은 것 | 0 / 372 |
| [다음 충돌] 이 정할 필요가 없는 줄로 간 것 | 0 / 372 |
알게 된 것
- Take 처리 중에 고른 줄이 잠깐 바뀐다. Take Theirs 는 주석 줄을 끼워 넣고 편집기 글을 다시 채우는데, 그 사이 고른 줄이 다음 행 → 0행 → 끼워 넣은 주석 줄로 옮겨 가며 Take 단추가 꺼진다(로그 "CanTakeTheirs=false sel=0"). 모두 한 번의 명령 실행 안에서 일어나서(시작 · 끝 기록 사이) 다른 누름이 끼어들 틈은 없다. 끝나면 고른 줄은 주석 줄이라 Take 두 단추가 꺼진 채로 있고, [다음 충돌] 을 눌러야 다시 켜진다.
- 그래서 Take 뒤 [다음 충돌] 이 처리되기 전에 Take 단추를 보면 꺼져 있다. 9차 시험 도구의
Click은 단추가 그 순간 꺼져 있으면 누르지 않고 False 를 돌려주는데, 9차 스크립트(ResolveAll)는 그 값을 버렸다. 기계가 바빠 [다음 충돌] 처리가 늦으면 고르기 한 번이 말없이 빠진다 — 9차 D-1 N1 의 "로그 10줄 · 남은 충돌 1개" 와 모양이 같다. 사람이 누르면 흐린 단추를 누른 것이라 아무 일도 안 일어난 것이 보이고, "남은 충돌 1개" 와 [다음 충돌] 로 남은 곳을 찾는다. - 9차 첫 회차는 앱 로그가 없어 이것이 원인이었다고 확정하지는 못했다. 다만 앱 쪽에서는 61회 동안 누름을 놓치거나 헛돈 적이 없다.
고친 것 (시험 도구)
d7lib.ps1ResolveAll— Take 누름이 꺼져 있어 안 눌리면 1.2초 기다렸다 한 번 더 누르고, 그래도 안 되면 결과에 "(못 누름)" 을 남긴다. 말없이 빠지지 않는다.- 제품 코드 변경 없음. 하네스는 그대로(22벌 1,122건).
시험 도구 쪽 (제품 결함 아님)
- 첫 병합 · 9차 간격 묶음이 8회차에서 UI 자동화 조회 오류(
ElementNotAvailableException, 화면 요소 훑기 중)로 끊겼다. 모자란 만큼 14회를 더 돌렸다. - 되풀이 스크립트 매개변수
$Tag가WithSettings의$tag와 겹쳐(PowerShell 은 대소문자를 가리지 않는다)$Label로 바꿨다 — 9차 A-2 와 같은 실수.
B-1. Git 탭 이력에서 고른 커밋을 파일 비교 탭이 새로고침 전까지 따라오지 않는다 (2026-09-17, 완료)
사용자 결정(2026-09-17): 바로 따라간다(양방향) · 파일 비교 탭에 저장 안 한 편집이 있으면 고르는 순간 묻는다. ("두 탭을 따로 둔다" · "따라가지 않고 알린다" 는 고르지 않음.)
고치기 전에 다시 났다 (새로 만든 저장소)
| 순서 | 결과 |
|---|---|
Git 탭 이력에서 바탕 을 고름 |
Git 탭은 바탕. 파일 비교 탭은 위 줄 Selected Commit · 왼쪽 이력 선택 · BASE 제목 모두 내 쪽 작업 그대로 |
| 파일 비교 탭 [새로고침] | 그제야 바탕 으로 따라옴 |
반대로 파일 비교 탭 이력에서 바탕 을 고름 |
Git 탭 이력은 내 쪽 작업 에 선택 표시가 남음 |
| 그 상태에서 Git 탭 [Revert] | 로그 "revert 시작: 바탕" — 화면에 선택돼 보이는 내 쪽 작업 이 아니라 바탕 을 되돌림, 충돌 34건(시험 저장소, 뒤에 버림) |
반대 방향이 더 위험했다 — 화면에 보이는 것과 다른 커밋에 Git 작업(Revert · Cherry-pick · Reset)이 걸린다.
원인
- 두 탭은 같은 값(
GitWorkspace.SelectedCommit)을 쓰지만, 고른 쪽 뷰모델만 화면을 바꾸고 다른 쪽은 새로고침 알림(Refreshed) 으로만 다시 읽었다.
고친 것
GitWorkspace—CommitChosen알림(고른 쪽을 인자로)과ConfirmLeaveCommit(파일 비교 화면이 앉히는 확인. 답: null 물을 편집 없음 · true 물었고 계속 · false [취소]).CommitSelection.IsOtherCommit— 사람이 다른 커밋을 고른 것인지(목록이 비워지며 들어온 null · 같은 해시의 새 객체는 아님). 하네스MergeSaveTest4건(210건).HomeViewModel— 파일 비교 탭에서 고르면CommitChosen을 내고, 다른 쪽이 고르면 왼쪽 이력 · Selected Commit · 두 칸을 게이트가 빈 뒤에 다시 세운다(RebuildListAfterRefreshAsync). 확인 창을 띄울지(WillAskBeforeDiscard)를ConfirmDiscard에서 떼어 둘이 같은 조건을 쓴다.GitViewModel— 고르면CommitChosen. 파일 비교 탭이 고르면 이력 선택 표시 · 단추가 따라가고, 커밋 내용(diff)은 Git 탭이 다시 보일 때 그린다(ShowPendingDiff).GitView— 이력 목록(HistoryList)이 선택을 바꾸기 전에(마우스 누름 · ↑↓ Home End PageUp PageDown) 묻는다. [취소] 면 그 누름을 막고, 물은 뒤 [계속] 이면 화면이 그 커밋을 직접 고른다.
고치며 걸린 것 (최종 모양에 이른 까닭)
| 해 본 것 | 걸린 것 |
|---|---|
다른 쪽이 고르면 바로 LoadCommitAsync |
Git 탭이 커밋 내용을 그리느라 작업 게이트를 쥐고 있어 파일 비교 탭 읽기가 건너뛰어짐 — Selected Commit 만 바뀌고 BASE 는 옛 커밋 |
| 선택 바인딩 setter 안에서 확인 창 | 창이 닫힌 뒤 목록이 선택을 다시 밀어 넣어 [취소] 해도 창이 한 번 더 뜸 |
setter 에서 미뤄 묻고 [취소] 면 변경 알림 · SelectedItem 다시 넣기 · SetCurrentValue(ContextIdle) |
코드상 SelectedItem 은 돌아오는데 목록은 바탕 을 선택으로 남김(UI 자동화 SelectionPattern · 화면 모두). SelectedItem = … 은 바인딩을 떼어 내기까지 함 |
| 선택이 바뀌기 전에 묻고 누름을 막음 | [취소] 는 맞음. 그런데 [계속] 이어도 창이 누름을 끊어 목록이 고르지 않음 → 물었으면 화면이 직접 고르게 해서 끝 |
확인한 것 (고친 앱, 사람 길 — 목록은 마우스 누름 · 방향키, d10-b1-after.ps1 · d10-b1-cancel.ps1 · d10-b1-diff.ps1)
| 경우 | 결과 |
|---|---|
Git 탭에서 바탕 |
파일 비교 탭 Selected Commit · 왼쪽 이력 · BASE 제목까지 바탕 |
파일 비교 탭에서 내 쪽 작업 |
Git 탭 이력 선택 내 쪽 작업 |
편집 있음 · Git 탭에서 바탕 누름 → [취소] |
창 한 번(“Common/Util/Unit103.cs 에 저장하지 않은 편집이 있습니다. 다른 커밋을 봅니다.”) · 두 탭 · 목록 자체(SelectionPattern) 모두 내 쪽 작업 · 다시 뜨는 창 없음 |
편집 있음 · 바탕 누름 → [저장하지 않고 계속] |
두 탭 바탕 · 워킹트리 바뀐 파일 0(편집 버려짐) |
| 편집 있음 · 같은 커밋 누름 | 창 안 뜸 |
| 편집 있음 · ↑ → [취소] / ↑ → [계속] | 그대로 바탕 / 두 탭 내 쪽 작업 |
파일 비교 탭에서 내 쪽 작업 → Git 탭 [Revert] |
로그 "revert 시작: 내 쪽 작업" — 보이는 커밋 |
파일 비교 탭에서 바탕 → Git 탭으로 옴 |
Git 탭 커밋 내용 머리 … 바탕 |
9차 A-2 흐름(cherry-pick 1회, d9-a2.ps1) |
시작 · 파일 단위 = 고른 커밋 · Save 뒤 = HEAD · 커밋 뒤 = 새 HEAD — 맞음 |
- 하네스 22벌 1,126건 통과(+4) · 빌드 경고 0 · 오류 0. 임시 로그(
[B1측정])는 모두 걷어냄(남은 줄 0).
남긴 것
- UI 자동화의
SelectionItemPattern.Select()처럼 마우스 · 키보드를 거치지 않고 목록 선택을 바꾸면 묻지 않고 따라간다(사람 길이 아님). - 처음 켰을 때 Git 탭 커밋 내용 칸이 비어 있는 것은 전부터 그렇다(이력에서 고르면 그려진다).