From 26d9d042bfde8c70e01908cbeb07bab999eba5f8 Mon Sep 17 00:00:00 2001 From: ksj09406 Date: Mon, 14 Sep 2026 16:35:41 +0900 Subject: [PATCH] =?UTF-8?q?7=EC=B0=A8=20=EC=A7=80=EC=8B=9C=EC=84=9C=20?= =?UTF-8?q?=C2=B7=20E-1:=20=EB=B3=91=ED=95=A9=20=EC=A4=91=20[=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=EB=A1=9C=20=EC=A0=80=EC=9E=A5]=20=EB=8B=A8=EC=B6=94?= =?UTF-8?q?=EB=A5=BC=20[Save]=20=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LOCAL 칸을 이 파일에만 쓰고 스테이징하는 단추라 Save & Commit 과 짝이 되게 이름만 바꿈. 알림 · 막힘 안내 · 웹 문서도 Save. 하는 일은 그대로(충돌 24 → 23, 커밋 없음 확인). 7차 지시서: 6차 D-1 에서 걸린 세 가지(마지막 저장 뒤 남은 차이 · 로그 3-Way 안 씀 · 기록 파일 남음)와 pull · rebase · cherry-pick 충돌. Co-Authored-By: Claude Opus 5 --- doc/history/2026-09-14-7차.md | 32 +++++ doc/history/changelog.md | 1 + doc/web/index.html | 28 ++--- doc/작업지시/7차.md | 144 +++++++++++++++++++++++ doc/진행상황.md | 41 ++++++- src/MergeHub/Services/MergeSavePlan.cs | 2 +- src/MergeHub/ViewModels/HomeViewModel.cs | 6 +- src/MergeHub/Views/HomeView.xaml | 2 +- 8 files changed, 236 insertions(+), 20 deletions(-) create mode 100644 doc/history/2026-09-14-7차.md create mode 100644 doc/작업지시/7차.md diff --git a/doc/history/2026-09-14-7차.md b/doc/history/2026-09-14-7차.md new file mode 100644 index 0000000..b394842 --- /dev/null +++ b/doc/history/2026-09-14-7차.md @@ -0,0 +1,32 @@ +# 7차 — 병합 화면이 사실대로 말하게 · 병합 말고 다른 충돌 길 (2026-09-14 ~) + +지시서: [../작업지시/7차.md](../작업지시/7차.md). 6차 D-1 에서 새로 걸린 세 가지와 6차에서 뺀 pull · rebase · cherry-pick 충돌. + +## E-1. [해결로 저장] 이름을 [Save] 로 (2026-09-14, 추가 요청, 완료) + +사용자: "해결로 저장은 LOCAL SAVE 버튼이잖아? 그냥 Save 로 이름 바꿔주고". +병합 중에만 보이는 그 단추는 LOCAL 칸 내용을 이 파일에만 쓰고 스테이징한다. 바로 아래 Save & Commit 과 짝이 되게 이름만 바꿨다. 하는 일은 그대로다. + +### 바꾼 것 + +| 파일 | 무엇 | +|---|---| +| `Views/HomeView.xaml` | 단추 글자 `해결로 저장` → `Save` (툴팁 "이 파일만 풀어서 저장하고 스테이징합니다. 커밋은 하지 않습니다 (Ctrl+S)" 그대로) | +| `ViewModels/HomeViewModel.cs` | 작업 이름(`RunAsync`) · 알림 `Save · 파일 · 남은 충돌 N건` / `… 남은 충돌 없음 - 이제 커밋할 수 있습니다` | +| `Services/MergeSavePlan.cs` | Save & Commit 이 막힐 때 안내 "[Save] 로 이 파일만 저장해 두고 …" | +| `doc/web/index.html` | 매뉴얼 · 단축키 · 한계 · 시연 대본 · 비교표의 이름 | + +지난 기록(history · 6차 지시서)은 그때 이름 그대로 두었다. 코드 주석의 옛 이름도 그 시점 설명이라 두었다. + +### 확인한 것 (새로 만든 저장소, MergeHub 로 병합한 뒤) + +| 확인 | 결과 | +|---|---| +| 병합 중 네 칸의 단추 | **Save** · 옆에 Save & Commit. "해결로 저장" 단추 없음 · 화면 전체 글자에도 없음 | +| `Io/Unit12.cs` 충돌 1개 Take Theirs → [Save] | 알림 **"Save · Unit12.cs · 남은 충돌 23건"**. git 충돌 24 → 23, 파일 `M ` 스테이징, HEAD 그대로(커밋 없음) | +| 저장 뒤 | 남은 충돌 첫 파일(`Common/Util/Unit15.cs`)이 네 칸으로 열림 | + +하네스는 이 두 파일(`HomeViewModel.cs` · `MergeSavePlan.cs`)을 컴파일하지 않고 글자를 보는 검사도 없어 그대로(22벌 948건). 빌드 경고 0 · 오류 0. +설정 파일은 백업 → `CSharpBraceStyle` 끔 → 시험 → 바이트 그대로 되돌림(해시 같음). + +(자동 조작 쪽: 앱을 새로 켠 뒤에는 충돌 목록에 고른 것이 없어 [3분할로 열기] 가 아무것도 안 열었다. 목록에서 파일을 고르고 다시 했다.) diff --git a/doc/history/changelog.md b/doc/history/changelog.md index 19e4877..df7ee12 100644 --- a/doc/history/changelog.md +++ b/doc/history/changelog.md @@ -8,6 +8,7 @@ | 날짜 | 항목 | 커밋 | |---|---|---| +| 2026-09-14 | **7차 지시서 · E-1** — 6차 D-1 에서 걸린 세 가지와 pull · rebase · cherry-pick 충돌로 7차 지시서를 씀. 병합 중 [해결로 저장] 단추를 [Save] 로(LOCAL 저장 단추라 Save & Commit 과 짝). 하는 일 그대로, 알림 · 막힘 안내 · 웹 문서 이름도 | 아래 | | 2026-09-14 | **6차 D-1** — 새로 만든 저장소를 MergeHub 만으로 처음부터 병합 커밋까지(충돌 26 · 자동 2 · 파일 단위 15 · 3분할 7 · 지우기/남기기 2). 줄끝 · BOM 이 바뀐 파일 0/33, 표식 0. 5차 C-1 의 23가지 중 사라짐 18. 새로 걸린 3가지는 7차로. 코드 변경 없음 | 아래 | | 2026-09-14 | **6차 C-1** — 병합 · revert · cherry-pick · rebase · pull 결과가 로그에 두 번 찍히던 것을 한 번으로. 충돌 탭 목록에 종류(양쪽 수정 · 상대 삭제 · 내가 삭제 · 양쪽 새 파일)와 "남은 충돌 N개 · 푼 것 M개 (M/전체)". 처음 충돌 목록을 .git 에 적어 두어 앱을 다시 켜도 이어짐 | 아래 | | 2026-09-14 | **6차 B-8 닫음** — 병합 커밋 뒤 파일 비교 탭이 어정쩡하게 남던 증상이 다시 나지 않음. Git 으로 풀고 커밋 · 탭에서 마지막 충돌을 풀고 커밋 두 흐름 모두 목록 304 · 두 칸 · 선택 커밋 = 병합 커밋. B-1 · A-3 에서 없어진 것으로 봄 | 아래 | diff --git a/doc/web/index.html b/doc/web/index.html index 7279f1e..c9d9a73 100644 --- a/doc/web/index.html +++ b/doc/web/index.html @@ -470,12 +470,12 @@ UbisamBase.Shell.exe --merge --base B.cs
  • 알림이 충돌 수를 말한다. 머지 주석만 다른 충돌은 이때 저절로 풀린다 — 예: “충돌 24건 (머지 주석만 다른 2건은 자동으로 풀림)”.
  • 충돌 탭 목록에서 파일을 두 번 누르거나 Enter, 또는 3분할로 열기. 파일 비교 탭에 네 칸으로 열린다.
  • 자동 병합 으로 저쪽만 고친 줄을 받고, 다음 충돌 으로 딛으며 Take Mine / Take Theirs 를 고르거나 MERGED 를 직접 고친다.
  • -
  • 해결로 저장 (Ctrl+S) — 이 파일만 쓰고 스테이징한다. 커밋은 안 한다. 줄끝 · 인코딩은 내 쪽(ours) 파일을 따른다.
  • +
  • Save (Ctrl+S) — 이 파일만 쓰고 스테이징한다. 커밋은 안 한다. 줄끝 · 인코딩은 내 쪽(ours) 파일을 따른다.
  • 한쪽이 지운 파일은 네 칸 대신 두 칸과 띠가 나온다. 파일 남기기 또는 파일 지우기.
  • 줄마다 볼 필요가 없는 파일은 충돌 탭에서 Accept Mine / Accept Theirs. 여러 파일을 Ctrl/Shift 클릭(Ctrl+A 전부)으로 골라 한 번에 적용한다 — 단추 옆에 “N개 고름” 이 뜨고, 저장소 다시 읽기는 끝에 한 번이다. Accept Both 는 두 파일을 통째로 이어 붙이므로 누르면 먼저 묻는다.
  • 남은 충돌이 0 이 되면 병합 커밋. 메시지 기본값은 Merge branch '상대' into 내 브랜치 이고 git 의 # 줄은 빠진다.
  • -

    남은 충돌이 있는데 Save & Commit 을 누르면 아무것도 쓰지 않고 막는다. 병합 중에는 파일 단위로 해결로 저장 을 쓴다.

    +

    남은 충돌이 있는데 Save & Commit 을 누르면 아무것도 쓰지 않고 막는다. 병합 중에는 파일 단위로 Save 를 쓴다.

    머지 주석

    줄을 반영하면 그 줄 바로 위에 // [이름] 날짜 한 줄이 들어간다(들여쓰기는 코드를 따른다). 같은 줄을 다시 반영하면 새 주석이 코드 바로 위에 붙고 앞 주석은 위로 밀린다. 누가 언제 반영했는지 소스에 남기 위해서다.

    @@ -504,7 +504,7 @@ UbisamBase.Shell.exe --merge --base B.cs Ctrl+PageUp / PageDown폴더 비교 목록의 앞 / 다음 파일 파일 · 보기Ctrl+D폴더 비교 탭으로 (새 창이 아니라 탭) F5 · Ctrl+R다시 비교 - Ctrl+S저장 (병합 중에는 해결로 저장) + Ctrl+S저장 (병합 중에는 Save) 찾기Ctrl+F · Ctrl+H찾기 · 바꾸기 F3 / Shift+F3 · Esc다음 / 이전 찾기 · 찾기 칸 닫기 도움말F1단축키 목록 @@ -531,7 +531,7 @@ UbisamBase.Shell.exe --merge --base B.cs
  • 머지 주석 자동 풀기는 Git 탭 Merge 에만 걸려 있다. pull · rebase · cherry-pick 이 낸 충돌에는 아직 안 된다.
  • rebase · cherry-pick 충돌도 같은 네 칸을 쓰지만, 6차는 병합만 끝까지 확인했다.
  • 3분할에서 줄을 고르면 로그에 “(3-Way 안 씀) 반영” 으로 적힌다 — 글자만 틀렸고 결과는 맞다(7차).
  • -
  • 마지막 충돌을 [해결로 저장] 하면 병합 커밋 전까지 두 칸 · “남은 차이 N줄” 로 보인다 — 푼 결과가 내 쪽과 다른 줄 수다. 충돌 탭의 “충돌 정리 끝” 을 믿으면 된다(7차).
  • +
  • 마지막 충돌을 [Save] 하면 병합 커밋 전까지 두 칸 · “남은 차이 N줄” 로 보인다 — 푼 결과가 내 쪽과 다른 줄 수다. 충돌 탭의 “충돌 정리 끝” 을 믿으면 된다(7차).
  • 빠른 비교(크기 · 수정일)는 내용이 바뀌었는데 크기와 시각이 같은 파일을 놓친다.
  • 코드 검사는 빌드가 된다는 보증이 아니다.
  • 로그인 · 권한은 아직 없다. 창 여러 개로 비교하는 기능은 넣지 않기로 했다.
  • @@ -713,7 +713,7 @@ UbisamBase.Shell.exe --merge --base B.cs
    - + @@ -894,7 +894,7 @@ Log("step 5");

    D-1 결과 — 새로 만든 저장소, MergeHub 만으로

    A-13분할 저장이 CRLF → LF. 이제 내 쪽 파일의 줄끝 · 인코딩을 따른다+3,367/−3,363 → +8/−4
    A-2병합 중 [해결로 저장] 을 따로. 충돌이 남으면 커밋은 쓰기 전에 막음22 → 21, 성공
    A-2병합 중 [Save] 을 따로. 충돌이 남으면 커밋은 쓰기 전에 막음22 → 21, 성공
    A-3충돌 파일을 열면 콤보 안 건드려도 네 칸REMOTE 에 브랜치명
    A-4한쪽이 지운 충돌 → [파일 남기기] · [파일 지우기]UD · DU
    A-5Accept Both 는 글로 이어 붙이고 먼저 묻는다BOM 1번
    - + @@ -904,7 +904,7 @@ Log("step 5");
    확인결과
    충돌git 26 · 머지 주석만 다른 2 자동 · 파일 단위 Accept 15(한 번에 1.3초) · 3분할 [해결로 저장] 7 · [파일 지우기] 1 · [파일 남기기] 1
    충돌git 26 · 머지 주석만 다른 2 자동 · 파일 단위 Accept 15(한 번에 1.3초) · 3분할 [Save] 7 · [파일 지우기] 1 · [파일 남기기] 1
    병합 커밋부모 둘 · “Merge branch 'feature/theirs' into feature/mine” · 워킹트리 Clean
    줄끝 · BOM · 인코딩이 내 쪽과 달라진 파일0 / 33 (LF 만 있는 줄 0 · 가운데 BOM 0 · 충돌 표식 0)
    5차 C-1 의 23가지사라짐 18 · 정해서 남음 1(머지 주석, B-5) · 이번 흐름에서 안 남 · 안 씀 3 · 따로 안 봄 1
    - +
    #무엇근거
    N13분할에서 줄을 고르면 로그가 “N행 (3-Way 안 씀) 반영”로그 11줄 모두. 머리의 3-Way 콤보 글자를 쓰는 것으로 보임
    N2마지막 [해결로 저장] 뒤, 병합 중인데 두 칸(HEAD ↔ 워킹트리) “남은 차이 3줄” 로 떨어져 덜 푼 것처럼 보인다Weld/Unit1.cs 저장 직후 화면
    N2마지막 [Save] 뒤, 병합 중인데 두 칸(HEAD ↔ 워킹트리) “남은 차이 3줄” 로 떨어져 덜 푼 것처럼 보인다Weld/Unit1.cs 저장 직후 화면
    N3병합 커밋 뒤에도 .git/MERGEHUB_CONFLICTS 가 남는다MERGE_HEAD 와 대조하므로 해는 없음
    @@ -975,7 +975,7 @@ Log("step 5");
    - + @@ -1010,7 +1010,7 @@ Log("step 5"); - + @@ -1057,7 +1057,7 @@ Log("step 5"); - +
    항목고친 것확인한 값
    A-1충돌 해결 저장이 내 쪽(ours) 파일의 줄끝 · 인코딩을 따른다. 검사 모음이 옛 실행 파일로 돌던 것도 찾아 세 벌을 고침3,367줄 파일 diff +3,367/−3,363 → +8/−4
    A-2병합 중 [해결로 저장](쓰고 스테이징만). Save & Commit 은 남은 충돌이 있으면 쓰기 전에 막음충돌 22 → 21 · 화면 “성공” · 확인 창 안 뜸
    A-2병합 중 [Save](쓰고 스테이징만). Save & Commit 은 남은 충돌이 있으면 쓰기 전에 막음충돌 22 → 21 · 화면 “성공” · 확인 창 안 뜸
    A-3병합 중 충돌 파일을 열면 네 칸. REMOTE 제목에 상대 브랜치(MERGE_HEAD → 병합 메시지 → 짧은 해시)콤보를 안 건드려도 LOCAL · BASE · REMOTE · MERGED
    A-4한쪽이 지운 충돌(UD · DU)은 남은 파일을 두 칸으로, [파일 남기기] · [파일 지우기]거꾸로 세던 “Theirs only 89” 사라짐
    A-5파일 단위 Accept Both 를 글로 풀어 이어 붙이고 내 쪽 형식으로 씀. 누르기 전에 물음BOM 맨 앞 한 번 · 줄끝 한 가지
    파일 비교히스토그램 정렬 · 단어 단위 · 자리 옮김 · 줄/덩어리/전체 반영 · Undo/Redo · 색 구분 범례 이동 · 미니맵 · 북마크 · 찾기/바꾸기 · 줄 접기 · 편집 잠금 · 코드 검사 · 저장 형식 · 비교 규칙 · 최근 목록 · 끌어다 놓기완료
    언어13가지 색칠(C# · C/C++ · Java · JS/TS · Python · SQL · 셸 · XML/XAML/HTML · JSON · YAML · INI · Markdown · 평문) · CP949 판별 · 이진/그림완료
    네 칸 병합LOCAL · BASE · REMOTE · MERGED · Take Mine/Theirs · 자동 병합 · 충돌만 이동 · 완료 판정 · 한쪽 삭제 띠 · git mergetool완료
    Git열기 · 클론 · 원격 · Fetch/Pull/Push · 체크아웃 · Merge · rebase · 충돌 목록 · 파일 단위 Accept · 해결로 저장 · 병합 커밋 · 스테이징 · 커밋 · amend · stash · 이력 그래프 · Revert · Cherry-pick · Reset · 커밋 간 비교 · 변경분 추출 · Blame · 태그 · 서브모듈 · 작업 취소완료
    Git열기 · 클론 · 원격 · Fetch/Pull/Push · 체크아웃 · Merge · rebase · 충돌 목록 · 파일 단위 Accept · Save · 병합 커밋 · 스테이징 · 커밋 · amend · stash · 이력 그래프 · Revert · Cherry-pick · Reset · 커밋 간 비교 · 변경분 추출 · Blame · 태그 · 서브모듈 · 작업 취소완료
    Git충돌 여러 개 한 번에 Accept (B-6)완료
    머지 주석반영한 줄 위에 쌓기 · 작업자 이름 · 비교에서 무시 · 주석만 다른 충돌 자동 해결완료
    C# 스타일AURORA / Allman 맞춤 비교 · 저장 · 폴더 비교 · 설정완료
    3 비교 시점커밋 트리에서 기준 커밋 클릭커밋 이력에서 고르기 + 3-Way 콤보로 브랜치를 REMOTE 로완료
    4 변경점 확인좌우 비교와 미니맵미니맵 + 색 구분 범례를 눌러 이동 + 차이 이동 단축키완료
    5 부분 수용여백 [>] · Undo/Redo같음 + 덩어리 반영 · Take Mine/Theirs · 자동 병합완료
    6 저장 & 커밋구문 검사 통과 후 Save & Commit가벼운 코드 검사 + Save & Commit. 병합 중에는 [해결로 저장] → [병합 커밋]바뀜
    6 저장 & 커밋구문 검사 통과 후 Save & Commit가벼운 코드 검사 + Save & Commit. 병합 중에는 [Save] → [병합 커밋]바뀜
    병행 사용git mergetool 등록[mergetool 등록] 버튼 · 네 칸으로 열림(6차)완료
    @@ -1119,7 +1119,7 @@ Log("step 5");
  • 폴더 비교 · 폴더 전체 검색 · 결과 내보내기
  • 언어 13가지 색칠(XAML 여러 줄 태그 포함) · CP949 판별 · 이진/그림 비교
  • 머지 주석 넣기와 비교 · 병합에서 무시, 주석만 다른 충돌 자동 해결
  • -
  • 병합 중 [해결로 저장] · 한쪽 삭제 충돌 [파일 남기기]/[파일 지우기] · 병합 커밋 메시지
  • +
  • 병합 중 [Save] · 한쪽 삭제 충돌 [파일 남기기]/[파일 지우기] · 병합 커밋 메시지
  • WinMerge 단축키와 설명 창 · 최근 비교 목록 · 끌어다 놓기 · 북마크 · 찾기/바꾸기
  • 저장 안 한 편집 보호(4차 A-1 · 5차 A-2)
  • 완료 C# 코드 스타일 맞춤 (AURORA / Allman) · 충돌 여러 개 한 번에 · 발표 시연 재료
  • @@ -1257,7 +1257,7 @@ D:\MergeHubDemo\repo\ make-demo.ps1 이 만드는 Git
    1. 위 줄 데모 버튼으로 Git 저장소 화면(D:\MergeHubDemo\repo). Git 탭 → 브랜치 · 병합에서 feature/mine 체크아웃, feature/theirs 를 골라 Merge → 현재 브랜치로.
    2. 알림을 읽는다: “충돌 N건 (머지 주석만 다른 M건은 자동으로 풀림)”. 전날 적어 둔 숫자와 같은지.
    3. -
    4. 충돌 탭. 같은 줄 충돌 파일을 두 번 누른다 → 파일 비교 탭 네 칸, REMOTE 제목에 feature/theirs. 한두 줄 Take 하고 해결로 저장 → 충돌 수가 하나 준다.
    5. +
    6. 충돌 탭. 같은 줄 충돌 파일을 두 번 누른다 → 파일 비교 탭 네 칸, REMOTE 제목에 feature/theirs. 한두 줄 Take 하고 Save → 충돌 수가 하나 준다.
    7. CP949 한글 파일을 열어 네 칸 모두 한글이 바른 것, XAML 충돌 파일이 색칠된 것을 짚는다.
    8. 한쪽이 지운 파일을 연다 → “상대가 이 파일을 지웠습니다” 띠 → 파일 지우기.
    9. 충돌 탭으로 돌아가 남은 파일을 Ctrl/Shift 클릭으로 여러 개 골라 Accept Theirs 한 번. 단추 옆 “N개 고름” 을 짚고, 한 번에 풀리는 것을 보여 준다(만든 저장소에서 같은 줄 충돌 15개가 1.2초, 고치기 전에는 하나씩 22.0초).
    10. @@ -1315,7 +1315,7 @@ D:\MergeHubDemo\repo\ make-demo.ps1 이 만드는 Git 병합 충돌 목록없음 — git 이 파일마다 하나씩 부른다충돌 탭 목록 → 두 번 누르면 네 칸, 파일 단위 Accept, 여러 개를 골라 한 번에 한쪽이 지운 충돌 (UD · DU)명령줄에서 git rm / git add[파일 남기기] · [파일 지우기] 주석만 다른 충돌사람이 푼다양쪽 주석을 남겨 자동으로 푼다 - 병합 중 저장파일 저장 뒤 git 이 스테이징[해결로 저장] = 쓰기 + 스테이징, 남은 충돌이 있으면 커밋을 막음, 병합 커밋 메시지 정리 + 병합 중 저장파일 저장 뒤 git 이 스테이징[Save] = 쓰기 + 스테이징, 남은 충돌이 있으면 커밋을 막음, 병합 커밋 메시지 정리 파일 형식 인코딩 · 줄바꿈판별 · 코드 페이지 골라 저장원본 유지가 기본. 병합 저장은 내 쪽(ours) 파일의 줄끝 · 인코딩을 따른다(충돌 표시가 든 워킹트리 파일을 보면 틀리므로). CP949 판별 쓰는 환경 @@ -1329,7 +1329,7 @@ D:\MergeHubDemo\repo\ make-demo.ps1 이 만드는 Git

      MergeHub 가 필요한 이유

        -
      1. 병합이 한 화면에서 끝난다. WinMerge 는 git 이 파일마다 하나씩 불러 주는 비교 창이다. 충돌이 22개면 명령줄과 WinMerge 를 22번 오간다. MergeHub 는 병합 → 충돌 목록 → 네 칸 → 해결로 저장 → 병합 커밋까지 탭 안에서 간다.
      2. +
      3. 병합이 한 화면에서 끝난다. WinMerge 는 git 이 파일마다 하나씩 불러 주는 비교 창이다. 충돌이 22개면 명령줄과 WinMerge 를 22번 오간다. MergeHub 는 병합 → 충돌 목록 → 네 칸 → Save → 병합 커밋까지 탭 안에서 간다.
      4. 반영 기록을 소스에 남기고, 그 기록 때문에 생기는 충돌은 스스로 푼다. 우리 팀은 누가 언제 반영했는지를 // [이름] 날짜 로 남긴다. WinMerge 에는 이 규칙이 없어 손으로 적어야 하고, 다음 병합 때 주석끼리 충돌한다. 만든 저장소에서 git 충돌 26개 중 2개가 이런 충돌이었다.
      5. 리뷰할 diff 를 지킨다. 병합 결과를 내 쪽 파일의 줄끝 · 인코딩으로 쓴다. 3분할 저장이 LF 로 바꿔 쓰던 문제를 고친 뒤 3,367줄 파일의 diff 가 +8/−4 로 줄었다. CP949 한글 파일도 같은 규칙이다.
      6. 스타일만 다른 diff 를 걷어 낸다. 사람마다 다른 C# 중괄호 자리를 AURORA / Allman 로 맞춘 뒤 견준다. 시연 파일에서 남은 차이가 39줄에서 진짜 변경 1줄로 준다.
      7. diff --git a/doc/작업지시/7차.md b/doc/작업지시/7차.md new file mode 100644 index 0000000..43b3154 --- /dev/null +++ b/doc/작업지시/7차.md @@ -0,0 +1,144 @@ +# 작업 지시 — MergeHub 7차 (병합 화면이 사실대로 말하게 · 병합 말고 다른 충돌 길) + +대상: `D:\Sorce\MergeTool\MergeHub` (플러그인) · `D:\Sorce\MergeTool\UbisamPlatform` (셸) +전제: 1~6차 지시서는 모두 끝났다([../진행상황.md](../진행상황.md)). + +**이번 지시서가 나온 곳** — 6차 D-1 에서 시험 저장소를 새로 만들어 MergeHub 만으로 처음부터 병합 커밋까지 다시 했다. +줄끝 · BOM 이 바뀐 파일은 0/33 이었고 5차의 23가지 중 18가지가 사라졌다. 대신 **새로 걸린 것이 세 가지**였고, +6차에서 일부러 뺀 **병합이 아닌 충돌 길**(pull · rebase · cherry-pick)이 남아 있다. +근거와 수치는 [../history/2026-09-14-6차.md](../history/2026-09-14-6차.md) 의 D-1 에 있다. + +| 6차 D-1 에서 잰 것 | 값 | +|---|---| +| 충돌 | git 26 · 머지 주석 자동 2 · 파일 단위 Accept 15(1.3초) · 3분할 저장 7 · 지우기/남기기 2 | +| 줄끝 · BOM · 인코딩이 내 쪽과 달라진 파일 | **0 / 33** · 충돌 표식 0줄 | +| 병합 커밋 | 부모 둘 · `Merge branch 'feature/theirs' into feature/mine` | +| 5차 C-1 의 23가지 | 사라짐 18 · 정해서 남음 1(머지 주석) · 이번 흐름에서 안 남 3 · 따로 안 봄 1(#12 줄 번호) | + +--- + +## 공통 규칙 + +- **A → B → C → D 순서로 진행한다.** A 는 사람이 화면을 보고 잘못 판단하게 만드는 것이라 먼저다. +- **항목 하나를 끝낼 때마다** 빌드하고 실제로 실행해 화면을 확인한 뒤 보고한다. +- **항목 하나가 끝나면 기록을 세 군데에 남기고 로컬 커밋한다**(4차 D-2 규칙). + 1. **상세**는 `doc/history/YYYY-MM-DD-7차.md` — 원인 · 판단 · 확인한 결과 + 2. [../진행상황.md](../진행상황.md) 은 **대기 → 완료로 상태만** + 3. [../history/changelog.md](../history/changelog.md) 에 한 줄 — 날짜 · 무엇을 왜 · 커밋 +- **푸쉬하지 않는다.** +- **실제 소스를 열지 않는다**(2026-09-11 결정). 시험 재료는 우리가 만들어 쓴다. +- **확인은 `C1Repo` 로 만든 저장소로 한다.** 씨앗이 고정돼 몇 번을 만들어도 같다. + 고치기 전에 문제가 **다시 나는 것부터 보이고**, 고친 뒤 안 나는 것을 보인다. +- 기존 검사 하네스 22벌(948건)은 계속 통과해야 한다. 로직을 건드리면 **테스트를 먼저 늘린다.** +- 빌드 경고 0 · 오류 0 을 유지한다. 앱이 실행 중이면 `UbisamBase.Shell` 을 먼저 종료한다. +- 사용자 설정 파일(`D:\UbisamConfig\Settings\MergeHubSettings.json`)은 시험 전에 백업하고, 끝나면 **바이트 그대로** 되돌린다. +- 플랫폼을 고치면 다른 소비 프로그램에 미치는 영향을 함께 적고 + `UbisamPlatform/doc/history/changelog.md` 에 남긴다. + +--- + +## A. 병합 화면이 사실과 다르게 말하는 것 + +### A-1. 마지막 충돌을 저장하면 "남은 차이" 가 뜬다 (D-1 N2) + +- 마지막 충돌 파일을 [Save] 하면, **아직 병합 커밋 전인데** 파일 비교 탭이 두 칸(HEAD 내 쪽 ↔ 워킹트리)으로 떨어져 + "남은 차이 3줄 · BASE와 다름 3" 을 보인다(`Weld/Unit1.cs`). 방금 고른 줄이 "차이" 로 세어져 **덜 푼 것처럼** 읽힌다. + 충돌 탭은 같은 때 "충돌 정리 끝 · 푼 것 26개" 라고 한다. 두 화면이 다른 말을 한다. +- 짚이는 곳: `HomeViewModel.ReloadAfterResolveAsync` 가 남은 충돌이 없으면 `LoadCommitAsync` 로 보통 화면(HEAD 대비)을 연다. + 병합 중이라는 사정을 모른다. +- 방향: 병합 중이고 충돌이 0 이면 파일 비교 탭도 "**충돌 정리 끝 · 병합 커밋을 할 수 있습니다**" 를 말한다. + 푼 파일을 보여 줄 거라면 무엇과 견준 차이인지(내 쪽 대비 받은 변경) 제목과 요약에 적는다. +- **판정 기준**: D-1 과 같은 순서로 마지막 충돌을 저장했을 때 파일 비교 탭의 요약 · 상태바가 "남은 차이" 가 아니라 + 병합 커밋을 할 수 있다는 말을 한다. 충돌 탭과 말이 같다. 병합 커밋 뒤에는 지금처럼 보통 화면(B-8)으로 돌아간다. + +### A-2. 3분할에서 줄을 골라도 로그는 "3-Way 안 씀" 이라고 한다 (D-1 N1) + +- 네 칸에서 Take Theirs 를 누르면 로그가 **"101행 (3-Way 안 씀) 반영"** 이라고 적는다. D-1 로그 11줄이 모두 그랬다. + 결과 파일은 맞다 — 글자만 틀렸다. +- 짚이는 곳: `HomeViewModel.cs` 의 `"{line.RemoteNumber}행 {RemoteBranch} 반영"` 이 3-Way 콤보 값을 쓴다. + 병합 중 충돌 파일은 콤보를 건드리지 않고 네 칸을 띄우므로(6차 A-3) 콤보는 `(3-Way 안 씀)` 그대로다. +- 머리의 3-Way 콤보도 같은 때 `(3-Way 안 씀)` 을 보이는지 **고치기 전에 화면으로 확인**하고, 그렇다면 같이 고친다. +- **판정 기준**: 병합 중 네 칸에서 줄을 고르면 로그가 상대 쪽 이름(예: `feature/theirs`)이나 "Theirs" 로 적는다. + Take Mine 도 무엇을 골랐는지 적힌다. 네 칸이 떠 있는 동안 화면 어디에도 "3-Way 안 씀" 이 없다. + 충돌이 아닌 파일의 2-Way · 브랜치 3-Way 로그는 지금 그대로다. + +--- + +## B. 치우기 + +### B-1. 병합 커밋 뒤에도 `.git/MERGEHUB_CONFLICTS` 가 남는다 (D-1 N3) + +- 병합에서 충돌이 나면 처음 충돌 목록을 `.git/MERGEHUB_CONFLICTS` 에 적는다(6차 C-1, "푼 것 M개 (M/전체)" 용). + **지우는 곳이 없다.** 병합 커밋 · 작업 취소 뒤에도 남는다. +- 첫 줄의 MERGE_HEAD 와 대조하므로 다음 병합에 해는 없다. 그래도 남의 `.git` 에 우리 파일을 흘리지 않는다. +- 짚이는 곳: `GitService.RememberMergeConflicts` 만 있고, 병합 커밋 · `--abort`(작업 취소) 길에 치우는 코드가 없다. +- **판정 기준**: MergeHub 로 병합 커밋을 하거나 작업 취소를 하면 파일이 없다. + MergeHub 밖(터미널)에서 병합을 끝낸 경우에는 다음에 저장소를 열 때 MERGE_HEAD 가 없으면 치운다. + +--- + +## C. 병합 말고 다른 충돌 길 (6차에서 뺀 것) + +6차는 "병합만 끝까지 믿을 수 있게" 를 목표로 pull · rebase · cherry-pick 을 뺐다. 같은 네 칸을 쓰지만 끝까지 해 본 적이 없다. + +### C-1. pull 이 낸 충돌에는 머지 주석 자동 풀기가 안 걸린다 + +- `GitService.Pull` 은 안에서 `Merge()` 를 부르므로 처음 충돌 목록은 적힌다. + 하지만 **머지 주석만 다른 충돌을 푸는 `ResolveNoteOnlyConflicts` 는 `GitViewModel.MergeAsync` 에서만 부른다.** + pull 로 같은 저장소를 받으면 사람에게 26개를 묻게 된다(6차 B-5 가 약속한 것과 다르다). +- 병합 커밋 메시지 기본값(`Merge branch …`)도 MergeAsync 에만 있다. pull 뒤의 메시지를 확인한다. +- **판정 기준**: 만든 저장소에서 원격을 흉내 낸 bare 저장소를 두고 pull 했을 때 알림 · 로그 · 충돌 수가 [Merge] 와 같다 + ("충돌 24건 (머지 주석만 다른 2건은 자동으로 풀림)"). 병합 커밋 메시지가 원격 브랜치 이름을 담는다. + +### C-2. rebase · cherry-pick 충돌을 네 칸으로 끝까지 + +- rebase 계속 · cherry-pick 충돌도 파일 비교 탭 네 칸으로 열리는지, **제목(LOCAL · REMOTE 가 무엇인지)** 이 맞는지 본 적이 없다. + rebase 에서는 "내 쪽" 과 "상대 쪽" 이 병합과 **거꾸로**다(upstream 이 ours). 화면이 그 사정을 말해야 한다. +- [Save] 뒤 흐름: 병합은 [병합 커밋] 인데 rebase 는 [계속], cherry-pick 은 커밋이다. 충돌 탭 단추와 안내가 작업에 맞는지 본다. +- 생성기(`C1Repo`)에 rebase · cherry-pick 용 갈래를 더한다(같은 씨앗, 기존 병합 경우는 그대로). +- **판정 기준**: 만든 저장소에서 rebase 와 cherry-pick 을 각각 MergeHub 만으로 끝까지 간다. + 네 칸 제목이 실제 쪽을 말한다. 끝난 커밋에 **줄끝 · BOM 이 바뀐 파일 0개**, 충돌 표식 0. + +--- + +## D. 확인 + +### D-1. 세 길을 처음부터 다시 끝까지 + +- A~C 를 고친 뒤 저장소를 새로 만들어 **병합 · pull · rebase · cherry-pick** 을 각각 처음부터 끝까지 한다. +- 6차 D-1 에서 **따로 안 본 #12(MERGED 칸 줄 번호)** 를 이번에는 네 칸 화면으로 찍어 확인한다(`Motion/Unit0.cs` · `Weld/Unit1.cs` 끝 줄). +- 6차 D-1 과 **같은 표로** 적는다. 새로 걸린 것은 고치지 말고 적는다 — 그 목록이 8차가 된다. +- **판정 기준**: 네 길 모두 MergeHub 만으로 커밋(또는 rebase 끝)까지 간다. 줄끝 · BOM 이 바뀐 파일 0개. + A-1 · A-2 · B-1 이 다시 나지 않는다. + +--- + +## E. 추가 요청 + +### E-1. [해결로 저장] 이름을 [Save] 로 (2026-09-14, 사용자) + +- 병합 중에 보이는 그 단추는 LOCAL 칸 내용을 저장하는 단추다. 이름을 **Save** 로 바꾼다(단추 옆 Save & Commit 과 짝). +- 하는 일은 그대로다 — 이 파일만 쓰고 스테이징, 커밋은 안 함, Ctrl+S. +- 알림 · 막힘 안내 · 웹 문서의 이름도 같이 바꾼다. 지난 기록(history)은 그때 이름 그대로 둔다. +- **판정 기준**: 병합 중 단추가 "Save" 이고 "해결로 저장" 은 화면 어디에도 없다. 눌렀을 때 충돌이 하나 줄고 커밋은 안 생긴다. + +--- + +## 이번 지시서에서 하지 않는 것 + +- **실제 소스로 병합해 보기** — 실제 소스는 열지 않는다(2026-09-11 결정). +- **머지 주석을 병합에서 끄기** — 6차 B-5 에서 "소스에 넣고 비교 · 병합에서는 무시" 로 정했다. D-1 에서도 그대로 동작했다. +- 빠른 비교(크기 · 수정일)가 내용만 바뀐 파일을 놓치는 것 — 폴더 비교의 알려진 한계로 둔다. +- 같은 줄 접기(4차 B-2) · 외부 편집기(4차 B-4) · 로그인·권한 · Gitea PR — 미룬 그대로 둔다. + +--- + +## 보고 형식 + +항목마다 이렇게 적는다. + +- 고치기 전에 문제가 **다시 나는 것**을 어떻게 보였는지 (만든 저장소의 어느 파일로) +- 무엇이 원인이었는지 한두 줄 +- 어떤 파일을 어떻게 고쳤는지 +- 실제로 실행해 확인한 결과 (바이트 · 줄끝 · 충돌 수처럼 **눈이 아닌 값**으로) +- 커밋 해시 diff --git a/doc/진행상황.md b/doc/진행상황.md index 09df90b..fdb0bb5 100644 --- a/doc/진행상황.md +++ b/doc/진행상황.md @@ -136,11 +136,50 @@ **6차 전부 끝.** D-1 에서 새로 걸린 세 가지는 7차 재료다(고치지 않음). - N1 3분할에서 고른 줄 로그가 "N행 (3-Way 안 씀) 반영" -- N2 마지막 [해결로 저장] 뒤 병합 중인데 두 칸 · "남은 차이 3줄" 로 떨어짐 +- 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 마지막 충돌을 저장하면 "남은 차이" 가 뜬다 | +| 대기 | A-2 3분할에서 줄을 골라도 로그는 "3-Way 안 씀" 이라고 한다 | + +### B. 치우기 + +| 상태 | 항목 | +|---|---| +| 대기 | B-1 병합 커밋 뒤에도 `.git/MERGEHUB_CONFLICTS` 가 남는다 | + +### C. 병합 말고 다른 충돌 길 + +| 상태 | 항목 | +|---|---| +| 대기 | C-1 pull 이 낸 충돌에는 머지 주석 자동 풀기가 안 걸린다 | +| 대기 | C-2 rebase · cherry-pick 충돌을 네 칸으로 끝까지 | + +### D. 확인 + +| 상태 | 항목 | +|---|---| +| 대기 | D-1 세 길을 처음부터 다시 끝까지 (+ 6차에서 안 본 MERGED 줄 번호) | + +### E. 추가 요청 + +| 상태 | 항목 | +|---|---| +| **완료** | E-1 [해결로 저장] 이름을 [Save] 로 — 하는 일은 그대로, 알림 · 안내 · 웹 문서 이름도 | + +--- + ## 3~4주차로 미룬 것 디테일이라 지금 붙잡을 일이 아니다. diff --git a/src/MergeHub/Services/MergeSavePlan.cs b/src/MergeHub/Services/MergeSavePlan.cs index 912fca4..1ae7591 100644 --- a/src/MergeHub/Services/MergeSavePlan.cs +++ b/src/MergeHub/Services/MergeSavePlan.cs @@ -35,7 +35,7 @@ namespace MergeHub.Services if (others.Count == 0) return null; return $"아직 풀지 않은 충돌이 {others.Count}건 있어 커밋하지 않았습니다. " - + "파일은 바꾸지 않았습니다. [해결로 저장] 으로 이 파일만 저장해 두고, 나머지를 다 푼 뒤 커밋하세요."; + + "파일은 바꾸지 않았습니다. [Save] 로 이 파일만 저장해 두고, 나머지를 다 푼 뒤 커밋하세요."; } /// 남은 충돌 수. 지금 막 저장한 파일은 뺀다. 저장 뒤 알림에 쓴다. diff --git a/src/MergeHub/ViewModels/HomeViewModel.cs b/src/MergeHub/ViewModels/HomeViewModel.cs index 7d4f62d..f972e6c 100644 --- a/src/MergeHub/ViewModels/HomeViewModel.cs +++ b/src/MergeHub/ViewModels/HomeViewModel.cs @@ -867,7 +867,7 @@ namespace MergeHub.ViewModels var newLine = SaveNewLine; var remaining = 0; - var ok = await _workspace.RunAsync("해결로 저장", () => + var ok = await _workspace.RunAsync("Save", () => { var isConflict = _workspace.Git.GetConflicts().Any(c => c.Path == path); if (isConflict) @@ -899,8 +899,8 @@ namespace MergeHub.ViewModels RaiseCanExecuteChanged(); MessageUtil.ShowSuccessToast(remaining == 0 - ? $"해결로 저장 · {Path.GetFileName(path)} · 남은 충돌 없음 - 이제 커밋할 수 있습니다" - : $"해결로 저장 · {Path.GetFileName(path)} · 남은 충돌 {remaining}건"); + ? $"Save · {Path.GetFileName(path)} · 남은 충돌 없음 - 이제 커밋할 수 있습니다" + : $"Save · {Path.GetFileName(path)} · 남은 충돌 {remaining}건"); }); // 새로고침 직후엔 게이트가 잠깐 막혀 목록 세우기가 건너뛰어진다. 기다렸다 다시 세운다. diff --git a/src/MergeHub/Views/HomeView.xaml b/src/MergeHub/Views/HomeView.xaml index 5530f06..4e2832e 100644 --- a/src/MergeHub/Views/HomeView.xaml +++ b/src/MergeHub/Views/HomeView.xaml @@ -1443,7 +1443,7 @@ Git 모드가 아니면 병합도 없으므로 바깥에서 한 번 더 가린다. --> -