본문을 다시 읽는 열한 군데를 조사해 여덟 군데를 막았다. 비교 규칙 변경은 편집을 지키므로 손대지 않았고, 커밋 새로고침은 일부러 두었다. 파일을 새로 열어도 HasChanges 가 안 꺼지던 것을 함께 고쳤다.
129 lines
7.9 KiB
Markdown
129 lines
7.9 KiB
Markdown
# 4차 — 로컬 머지툴 사용성 (2026-09-10 ~)
|
|
|
|
지시서: [작업지시/4차.md](../작업지시/4차.md)
|
|
|
|
---
|
|
|
|
## D-1. `doc/history/` 를 만들고 진행상황을 나눴다 — **완료** (2026-09-10)
|
|
|
|
**왜** - `진행상황.md` 가 721줄이었고 한 파일에 다섯 가지가 섞여 있었다.
|
|
주차 목표 · 차수별 상태 표 · 항목별 상세 · 미룬 것 · 완료 기록.
|
|
"3차 D-3 에서 무슨 판단을 했더라" 를 찾으려면 스크롤로 뒤져야 했다.
|
|
|
|
이렇게 나눴다.
|
|
|
|
```
|
|
doc/
|
|
진행상황.md 73줄. 지금 대기·진행 중인 것만
|
|
작업지시/
|
|
3차.md · 4차.md · 머지툴보강.md · 사용성보강.md
|
|
history/
|
|
changelog.md 한 줄 요약 + 날짜별 문서 목록
|
|
2026-09-08-2주차.md 90줄
|
|
2026-09-09-3차.md 565줄
|
|
2026-09-10-4차.md 이 파일
|
|
```
|
|
|
|
**옮기기만 하고 내용은 고치지 않았다.** 지시서가 그렇게 시켰다 - 다시 쓰면 그때 무슨 판단을
|
|
했는지가 흐려진다. 옮긴 자리에 날짜와 제목만 얹었다.
|
|
|
|
**지시서를 `doc/작업지시/` 로 옮긴 것은 `git mv` 로 했다.** 새로 쓰고 지우면 이력이 끊긴다.
|
|
`git log --follow` 로 옛 이력을 그대로 따라갈 수 있다.
|
|
|
|
**링크는 열다섯 개가 전부 살아 있다.** 옮기면서 다섯 군데를 고쳤다.
|
|
`doc/작업지시-3차.md` → `작업지시/3차.md`, 지시서 안의 `doc/진행상황.md` → `../진행상황.md`,
|
|
`작업지시-머지툴보강.md` → `머지툴보강.md`. 문서 전체를 훑어 남은 옛 경로가 없는 것을 확인했다.
|
|
|
|
**곁들여 하나** - 미룬 것 목록에 `최근 파일 목록` 이 남아 있었다. 4차 B-1 로 올라온 항목이라
|
|
두 자리에 다르게 적혀 있었다. 미룬 것 쪽에서 뺐다.
|
|
|
|
**판정 기준 확인**
|
|
|
|
| 기준 | 결과 |
|
|
|---|---|
|
|
| 진행상황.md 200줄 아래 | 721 → **73줄** |
|
|
| 대기·진행 중인 것이 한 화면에 | 4차 열세 항목이 한 화면에 들어온다 |
|
|
| 끝난 차수 상세를 링크 한 번으로 | changelog 한 줄 → 날짜별 파일 |
|
|
| 링크가 깨지지 않음 | 15개 전부 정상 (스크립트로 확인) |
|
|
---
|
|
|
|
## D-2. 앞으로의 기록 규칙을 정했다 — **완료** (2026-09-10)
|
|
|
|
**왜** - D-1 로 자리를 나눠 놓기만 하면 다시 한 파일로 쌓인다. 어디에 적을지를 규칙으로 못박아야 한다.
|
|
|
|
지시서 [작업지시/4차.md](../작업지시/4차.md) 의 공통 규칙을 고쳤다. 항목 하나가 끝나면 세 군데에 남긴다.
|
|
|
|
1. **상세**는 `doc/history/YYYY-MM-DD-주제.md` — 원인 · 판단 · 확인한 결과
|
|
2. `진행상황.md` 은 **상태만** — 여기에 상세를 적지 않는다
|
|
3. `history/changelog.md` 에 한 줄 — 날짜 · 무엇을 왜 · 커밋
|
|
|
|
**곁들여 둘**
|
|
|
|
- 진행 순서를 `A → B → C` 에서 **`D → A → B → C`** 로 고쳤다. D 를 먼저 하라는 말이 D 묶음 안에만
|
|
있어서, 공통 규칙만 읽으면 A 부터 시작하게 되어 있었다. 규칙과 본문이 어긋나 있었다.
|
|
- 플랫폼 changelog 경로를 `UbisamPlatform/doc/history/changelog.md` 로 풀어 적었다.
|
|
MergeHub 에도 같은 이름의 파일이 생겨서 그냥 `doc/history/changelog.md` 라고 쓰면 어느 쪽인지 알 수 없다.
|
|
**두 파일은 기준이 다르다** - 플랫폼은 "다른 소비 프로그램에 미치는 영향", MergeHub 는 "무엇을 왜".
|
|
|
|
**판정 기준**은 4차 A~C 를 진행하는 동안 이 규칙대로 쌓이는지로 본다. 지금부터 적용한다.
|
|
---
|
|
|
|
## A-1. 저장하지 않은 편집이 말없이 사라지던 것 — **완료** (2026-09-10)
|
|
|
|
### 먼저 조사한 것 — 어느 길로 들어오면 사라졌나
|
|
|
|
`HomeViewModel` 에서 본문을 다시 읽는 자리를 전부 훑었다. 열한 군데였고 성격이 셋으로 갈렸다.
|
|
|
|
| 길 | 어떻게 들어오나 | 판정 |
|
|
|---|---|---|
|
|
| `OnPlainCompareRequested` | 폴더 비교 더블클릭 · 폴더 검색 결과 · 끌어다 놓기 · 탐색기 우클릭 · `git mergetool` | **막음** |
|
|
| `PickLeftFile` / `PickRightFile` | 기준 파일 · 내 파일 단추 | **막음** |
|
|
| `DropFile` | 경로 칸에 파일을 놓기 | **막음** |
|
|
| `OnSelectedFileChanged` | Git 탭 파일 목록에서 다른 파일 고르기 | **막음** (취소하면 목록 선택도 되돌린다) |
|
|
| `OnSelectedNodeChanged` | 이력에서 다른 커밋 고르기 | **막음** (취소하면 커밋 선택도 되돌린다) |
|
|
| `OnRemoteBranchChanged` | 3-Way 켜고 끄기 | **막음** (취소하면 브랜치도 되돌린다) |
|
|
| `SwitchDemoAsync` | 데모 폴더 전환 | **막음** |
|
|
| `RevertAll` | 전체 되돌리기 단추 | **막음** (되살릴 수 없어 한 번 묻는다) |
|
|
| `ReloadLinesFrom(keepAsEdited: true)` | 비교 규칙 변경 · 무시 규칙 변경 | **안 막음** — 편집을 지키도록 이미 만들어져 있다 |
|
|
| `LoadDefaultPlainFiles` | 켤 때 기본 파일 열기 | **안 막음** — 아직 고친 것이 있을 수 없다 |
|
|
| `RefreshCommits` → `LoadCommitAsync` | 커밋·체크아웃 뒤 목록 다시 세우기 | **일부러 안 막음** (아래) |
|
|
|
|
**비교 규칙을 바꾸는 길에 손대지 않은 것이 중요하다.** 지시서가 그렇게 못박았고, 실제로 그 길은
|
|
`keepAsEdited: true` 로 편집을 지킨다. 여기까지 확인 창을 붙였으면 규칙 하나 바꿀 때마다 창이 떠서 못 쓴다.
|
|
|
|
**`RefreshCommits` 는 일부러 두었다.** 사용자가 고른 것이 아니라 프로그램이 목록을 다시 세우는 자리다.
|
|
그 한가운데 창을 띄우면 무엇에 답하는 창인지 알 수 없고, 취소해도 목록은 이미 새로 세워진 뒤라
|
|
되돌릴 자리가 없다. `_suspendGuard` 로 그 구간만 묻지 않게 했다. **남은 구멍이라는 것은 인정한다** -
|
|
커밋·체크아웃을 한 뒤에는 고치던 것이 다시 읽힌다. 다만 그 조작들은 대개 저장한 뒤에 하는 일이다.
|
|
|
|
### 어떻게 막았나
|
|
|
|
`ConfirmDiscard(무엇을 하려는지)` 하나로 모았다. 고친 것이 없으면 **묻지 않는다** -
|
|
매번 뜨는 창은 읽지 않고 누르게 되고, 정작 위험할 때도 그냥 눌러 버린다.
|
|
|
|
세 갈래로 묻는다. **예/아니오로는 "버리고 가기"와 "그만두기"가 구분되지 않는다** -
|
|
아니오를 눌렀는데 그대로 열려 버리면 그것이 곧 잃는 것이다.
|
|
플랫폼에 `MessageUtil.ShowChoice` 를 새로 넣었다(플랫폼 `ccfed6f`).
|
|
|
|
`저장하고 계속` 은 **커밋하지 않고 파일에만 쓴다**(`SaveWorkingCopy`). Git 모드의 저장은 커밋 메시지가
|
|
있어야 하는데 확인 창에서 메시지를 받을 수는 없다. 커밋은 사용자가 따로 할 일이다.
|
|
작업 게이트를 타지 않는다 - 확인 창이 UI 스레드에서 답을 기다리는 중이라 게이트를 기다리면 서로 막힌다.
|
|
**저장이 실패하면 넘어가지 않는다.** 여기서 넘어가면 저장한 줄 알고 잃는다.
|
|
|
|
### 곁들여 잡은 것 — 고친 것이 없는데도 묻던 문제
|
|
|
|
만들어 놓고 화면에서 확인하다 걸렸다. 파일을 새로 열어도 `HasChanges` 가 꺼지지 않아
|
|
**앞 파일의 상태가 그대로 끌려왔다.** `LoadPlainFilesAsync` 에 그 줄이 빠져 있었다.
|
|
지금까지는 저장 단추가 켜진 채 남는 정도라 눈에 안 띄었는데, A-1 이 그 값을 읽으면서 드러났다.
|
|
|
|
### 화면에서 확인한 것
|
|
|
|
| 한 일 | 결과 |
|
|
|---|---|
|
|
| 고친 뒤 다른 파일 열기 | `Other.cpp 에 저장하지 않은 편집이 있습니다 / 다른 파일을 엽니다: WeldController.cpp` |
|
|
| [취소] | 편집기 내용 그대로, 파일도 그대로, 열린 파일도 그대로 |
|
|
| [저장하고 계속] | `Other.cpp` 에 고친 내용이 쓰이고 `WeldController.cpp` 가 열렸다 |
|
|
| [저장하지 않고 계속] | 파일은 손대지 않은 채 다음 파일이 열렸다 |
|
|
| 고친 것 없이 두 번 연속 열기 | 창이 뜨지 않았다 |
|
|
|
|
검사 514건 통과 · 빌드 경고 0 · 오류 0. |