MergeHub 문서
+UbisamBase 셸 위에서 도는 플러그인(.NET Framework 4.8 · WPF)이다. 폴더 비교에서 다른 파일을 찾고, 파일 비교에서 줄을 골라 반영하고, Git 탭에서 병합과 커밋까지 끝낸다. 이 페이지는 매뉴얼 · 발표 · 진행 기록 · 기획안 · 시연 대본 · WinMerge 비교를 한곳에 모았다.
+숫자는 모두 doc/진행상황.md · doc/history/*.md · doc/작업지시/6차.md 에서 옮겼다. 시험은 실제 소스가 아니라 직접 만든 저장소로 했다(2026-09-11 결정).
MergeHub 사용법
+화면에 적힌 버튼 이름 그대로 적었다. 버튼은 이렇게, 키는 Ctrl+S 처럼 표시한다.
+켜기와 탭 구성
+MergeHub 는 dll 이라 혼자 실행되지 않는다. UbisamBase.Shell.exe 를 켜면 셸이 MergeHub 를 읽어 탭을 만든다. 개발 PC 에서는 src\MergeHub\bin\Release\net48\UbisamBase.Shell.exe 다.
| 탭 | 하는 일 |
|---|---|
| 폴더 비교 | 두 폴더에서 어느 파일이 다른지 찾는다. 파일을 두 번 누르면 파일 비교 탭으로 넘어간다. |
| 파일 비교 | 두 칸(기준 · 내 파일) 또는 네 칸(LOCAL · BASE · REMOTE · MERGED)으로 보고, 줄을 골라 반영하고 저장한다. Git 저장소면 커밋 이력이 함께 나온다. |
| Git | 저장소 열기, 브랜치 · 병합, 충돌 목록, 스테이징 · 커밋, 이력, Blame, 태그 · 서브모듈. |
| 설정 | 셸의 설정 탭 안 MergeHub 항목. D:\UbisamConfig\Settings\MergeHubSettings.json 에 저장된다. |
탭 순서가 작업 순서다. 폴더 비교로 다른 파일을 찾고 → 파일 비교로 들어가 고치고 → Git 에서 커밋한다. 켤 때 작업자 이름을 묻는 창이 뜬다(지난 이름이 채워져 있어 같은 사람이면 Enter 한 번). 이 이름이 머지 주석과 보고서에 들어간다.
+ +파일 · 폴더 여는 법
+| 방법 | 어떻게 |
|---|---|
| 화면에서 고르기 | 폴더 비교 왼쪽 폴더... 오른쪽 폴더... · 파일 비교 기준 파일... 내 파일... |
| 끌어다 놓기 | 탐색기에서 파일이나 폴더를 화면에 놓는다. 폴더면 폴더 비교, 파일이면 파일 비교가 열린다. 경로 칸에 바로 놓으면 그 칸만 채운다. 파일을 하나씩 두 번 놓으면 짝이 된다. |
| 최근 목록 | 파일 비교 위 줄의 최근 콤보. 파일 짝과 폴더 짝을 따로 기억한다. 지금 없는 경로는 흐리게만 보이고 지워지지 않는다. |
| 탐색기 보내기 | Git 탭 탐색기 보내기 등록 을 한 번 누른다. 그 뒤 탐색기에서 파일 두 개를 골라 우클릭 → 보내기 → MergeHub. 관리자 권한이 필요 없다. |
| git mergetool | Git 탭 mergetool 등록 (전역 .gitconfig 의 merge.tool 을 고친다). 그 뒤 git mergetool 이 MergeHub 를 네 칸으로 연다. |
명령줄
+# 파일 두 개 +UbisamBase.Shell.exe --diff 왼쪽.cs 오른쪽.cs +# 폴더 두 개 (그냥 폴더 경로를 줘도 폴더 비교가 된다) +UbisamBase.Shell.exe --folder D:\a D:\b +# 충돌 해결 — git mergetool 이 부르는 모양. 네 칸으로 열리고 결과는 --merged 파일에 쓴다 +UbisamBase.Shell.exe --merge --base B.cs --local L.cs --remote R.cs --merged M.cs+
BASE 는 없어도 된다(양쪽이 새로 만든 파일). --merged 가 없으면 LOCAL 에 쓴다. 네 칸의 저장 형식은 LOCAL 파일을 따른다 — MERGED 에는 git 이 LF 로 충돌 표시를 넣어 두기 때문이다.
폴더 비교
+-
+
- 왼쪽 폴더... 오른쪽 폴더... 로 두 폴더를 고른다. +
- 필요하면 빠른 비교 (크기·수정일만) 와 하위 폴더 포함 을 켠다. 빠른 비교는 내용을 안 읽어 틀릴 수 있다 — 그래서 기본은 꺼져 있다. +
- 비교. 오래 걸리면 취소 — 그때까지 본 결과는 남는다. +
- 목록에서 파일을 두 번 누르거나 줄 단위 비교 를 누르면 파일 비교 탭에서 열린다. 거기서 Ctrl+PageDown / PageUp 으로 목록의 다음 · 앞 파일로 간다. +
상태와 보기 필터
+같음 다름 주석만 다름 왼쪽에만 · 오른쪽에만 이진 — 주석만 다름은 코드가 같고 주석 · 공백만 다른 파일이다(언어를 아는 파일만, 8MB 까지). 머지 주석만 다른 파일은 같음으로 본다(설정에서 끔).
+보기 필터: 다른 것만 · 전체 · 왼쪽에만 · 오른쪽에만 · 같은 것만 · 코드가 다른 것만. 필터는 다시 비교하지 않고 목록만 다시 그린다.
+복사 · 삭제
+→ 오른쪽으로 복사 ← 왼쪽으로 복사 왼쪽 삭제 오른쪽 삭제. 폴더째 된다. 확인 창에 안에 든 파일 수가 나온다 — 몇 개가 덮이는지 보고 누른다.
+폴더 전체 검색
+검색 칸에 말을 넣고 찾기. 대소문자 구분, 오른쪽 폴더도 를 고를 수 있다. 결과 줄마다 왼쪽 · 오른쪽 · 양쪽 이 붙는다 — 양쪽은 두 폴더에 똑같이 있는 줄(손대지 않은 줄)이다. 찾은 줄 열기 를 누르면 그 줄에 캐럿이 선 채로 파일 비교가 열린다. 이진 파일과 8MB 넘는 파일은 건너뛴다.
결과 내보내기
+결과 내보내기 는 상태와 경로를 줄마다 적은 글 파일을 만든다. 만든 사람과 만든 때가 머리글에 들어가 메일이나 결재에 그대로 붙인다.
+ +파일 비교 (두 칸)
+왼쪽이 기준(BASE), 오른쪽이 내 파일(LOCAL, 고칠 수 있는 칸)이다. Git 저장소 안이면 왼쪽 칸에 커밋 이력이 나오고, 커밋을 고르면 그 시점이 기준이 된다.
+색 구분 (눌러서 이동)
+화면 위 범례의 개수를 누르면 그 갈래의 첫 줄로 가고, 다시 누르면 다음 줄로 간다. 0건인 갈래는 흐리다.
+| 갈래 | 뜻 |
|---|---|
| BASE와 다름 | 아직 손대지 않은 차이 |
| 머지 반영함 | > 나 Accept 로 기준 내용을 가져온 줄 |
| 직접 수정 | 칸에 직접 타이핑해 고친 줄 |
| 추가 · 삭제 | 한쪽에만 있는 줄 |
| 무시 | 비교 규칙(공백 · 대소문자 · 줄 필터 · 머지 주석)에 걸려 차이로 세지 않는 줄 |
| 자리 옮김 | 내용은 같고 자리만 옮긴 덩어리 (메서드 순서 바꾸기 등) |
| 줄 안에서 바뀐 부분 | 한 줄 안에서 바뀐 낱말만 진하게 |
줄 고르기와 반영
+-
+
- 여백의 > — 이 줄만 기준(BASE) 내용으로 가져온다. < — 이 줄을 내 원본으로 되돌린다. +
- 오른쪽 ACTIONS: Accept(선택 줄) · 이 덩어리 반영(이어진 차이 한 번에, Alt+Shift+→) · 전체 반영 · 전체 되돌리기 · Revert(선택 줄의 마지막 편집만) · Undo Redo +
- 머지 설명 (선택) 에 적은 글은 반영한 줄의 머지 주석 뒤에 붙는다. 비워 두면 이름 · 날짜만 들어간다. +
- 저장 (Ctrl+S) — Git 이 아닐 때. Git 저장소에서는 Save & Commit 이 쓰고 · 스테이징하고 · 커밋한다. +
한 번 정하면 그대로인 것 (접었다 펴는 칸)
+-
+
- 저장 형식 — 인코딩(원본 유지 · UTF-8 · UTF-8(BOM) · CP949) · 줄바꿈(원본 유지 · CRLF · LF). 기본은 원본 유지. +
- 비교 규칙 — 공백(전부 비교 → 개수만 무시 → 전부 무시) · 대소문자 · 줄 필터(설정의 정규식) · 긴 줄 접기. +
- 편집 잠금 — 실수로 고치는 것을 막는다. +
그 밖
+-
+
- 차이 이동: 이전 차이 다음 차이 처음 마지막, 줄 번호 이동 Ctrl+G. 오른쪽 미니맵을 누르면 그 자리로 간다. +
- 찾기 · 바꾸기: Ctrl+F / Ctrl+H. 바꾸기 는 고른 자리가 찾는 말일 때만 바꾸고 넘어간다. 모두 는 Ctrl+Z 로 되돌린다. +
- 북마크: 여백 더블클릭 또는 Ctrl+M, 다음 북마크 F2. +
- 코드 검사: 괄호 짝 · 닫히지 않은 따옴표 · 코드 자리의 전각 문자 · 주석 기호를 빼먹은 한글 문장을 알린다. 컴파일러가 아니라 눈에 띄는 실수 알림이다. 코드 파일에서만 돈다. +
- 언어: 확장자로 고른다 — C# · C/C++ · Java · JavaScript/TypeScript · Python · SQL · 셸/배치 · XML/XAML/HTML · JSON · YAML · 설정/INI · Markdown · 평문. 상태바에 보인다. +
- 이진 · 그림 파일: 크기 · SHA-1 · 처음 갈리는 바이트 위치를 알려 준다. 그림이면 나란히 띄우고, 아니면 앞 4KB 를 16진으로 늘어놓는다. +
- 결과 내보내기: 양쪽 줄 번호와 다른 줄을 글로 뽑는다. 단축키 또는 F1: 단축키 목록 창. +
네 칸 병합
+위에 원본 세 칸 LOCAL(Mine) · BASE(공통 조상) · REMOTE(Theirs), 아래에 고치는 칸 MERGED 가 뜬다. MERGED 는 내 파일에서 출발한다. 네 칸이 뜨는 경우는 셋이다.
+-
+
- 병합 중에 충돌 파일을 열 때 (자동으로 네 칸, REMOTE 제목에 상대 브랜치 이름) +
- 파일 비교 위 줄의 3-Way 콤보에서 브랜치를 고를 때 (그 브랜치를 REMOTE 로, merge base 를 BASE 로) +
git mergetool·--merge명령줄로 켤 때
+
| 버튼 | 키 | 하는 일 |
|---|---|---|
| Take Mine | Alt+→ | 선택 줄을 LOCAL 내용으로 |
| Take Theirs | Alt+← | 선택 줄을 REMOTE 내용으로 |
| 이 덩어리 반영 | Alt+Shift+→ | REMOTE 를 가져올 수 있는 줄이 이어진 구간을 한 번에 |
| 자동 병합 | Alt+M | 저쪽만 고친 줄을 한 번에 가져온다. 충돌과 내가 고친 줄은 안 건드린다 |
| 이전 충돌 다음 충돌 | Alt+Shift+↑/↓ | 아직 안 정한 충돌만 딛는다 |
ACTIONS 위의 남은 충돌 N개(빨강)가 충돌 정리 끝(초록)이 되면 저장할 수 있다. 줄 번호는 다섯 자리(99,999줄)까지 보인다.
+ +C# 코드 스타일 맞춤
+C# 파일은 사람마다 중괄호를 두는 자리가 달라, 코드는 같은데 diff 가 수십 줄씩 뜬다. 파일 비교 화면 오른쪽 비교 규칙(접혀 있으면 ▸ 저장 형식 · 비교 규칙 펴기)의 콤보에서 C# AURORA 또는 C# Allman 를 고르면, 지금 파일을 원본부터 다시 읽어 BASE · LOCAL · REMOTE 를 모두 그 스타일로 맞춘 뒤 비교한다. 두 칸 · 네 칸 · mergetool 모두 같다. 상태바에 C# AURORA 가 붙는다.
-
+
- 편집 칸 글이 스타일 때문에 바뀌면 저장할 것이 있는 상태가 되고, 저장하면 그 스타일로 파일에 쓴다. 스타일만 바뀐 상태로 다른 파일을 열면 묻지 않는다. +
- 폴더 비교도 스타일만 다른 C# 파일은 같음. 줄끝이 다른 파일은 가리지 않는다. +
- 설정 [비교 옵션] “C# 코드 스타일 맞춤” 에 저장된다. 기본은 끔. +
- 옮기는 것은 여는 중괄호와 else · catch · finally 의 줄 위치뿐이다. 들여쓰기 · 공백은 그대로. 앞 줄 끝에 주석이 있으면 중괄호를 올리지 않는다. +
시연 재료 demo\style: 스타일 끔 남은 차이 39줄 → AURORA 1줄(값 한 줄의 진짜 변경만 남는다).
| 자리 | AURORA | Allman (모두 새 줄 · Visual Studio 기본값) |
|---|---|---|
| 형식(class · struct 등) · 메서드 · 로컬 함수의 여는 중괄호 | 새 줄 | 새 줄 |
| 속성 · 접근자 · 익명 메서드 · 제어 블록(if · for …) · 익명 형식 · 개체 초기화 · 람다 | 같은 줄 | 새 줄 |
else · catch · finally | 같은 줄 } else { | 새 줄 |
| 개체 초기화 멤버 · 익명 형식 멤버 · 쿼리 절 | 새 줄 | 새 줄 |
AURORA
+public void Start(int count) +{ + if (count > 0) { + Run(count); + } else { + Stop(); + } + var opt = new WeldOption { + Power = 1800, + Speed = 250 + }; +}
Allman
+public void Start(int count) +{ + if (count > 0) + { + Run(count); + } + else + { + Stop(); + } + var opt = new WeldOption + { + Power = 1800, + Speed = 250 + }; +}
Git 탭
+위쪽 저장소 연결: 로컬 경로에 폴더... → 열기. 하위 폴더를 골라도 저장소 최상위를 찾아 연다. 원격 칸(원격 URL · 클론 · 원격 추가 · 원격 삭제 · Gitea 계정 · 토큰/암호 · Fetch Pull Push)은 접혀 있고, 접은 상태는 다음에도 그대로다. 작업 취소 는 진행 중인 merge · cherry-pick · revert · rebase 를 취소한다.
+| 안쪽 탭 | 있는 것 |
|---|---|
| 브랜치 · 병합 | 체크아웃 Merge → 현재 브랜치로 브랜치 삭제 · 새 브랜치 생성 + 체크아웃(선택 커밋에서 분기) · 선택 브랜치 위로 rebase 계속 중단 |
| 충돌 | 충돌 파일 목록 · 3분할로 열기 Accept Mine Accept Theirs Accept Both 병합 커밋 |
| 변경 · 커밋 | 스테이징 언스테이징 변경 취소 전체 스테이징 stash 저장 blame · stash 목록 적용 삭제 · 커밋 메시지 마지막 메시지 커밋 커밋 수정(amend, 푸시 전에만) |
| 이력 | 커밋 그래프 · 선택 커밋 → Revert Cherry-pick Reset · 여기부터(두 커밋 사이 비교) 해제 · 변경분 추출(바뀐 파일만 폴더로, 바이트 그대로) |
| Blame | 파일 경로 → 실행. 줄마다 커밋 · 날짜 · 작성자. 이력에서 커밋을 골라 두면 그 시점 기준 |
| 태그 · 서브모듈 | 태그 생성(메시지를 넣으면 annotated) 선택 태그 삭제 · 서브모듈 업데이트 (--init) |
커밋 · 체크아웃처럼 파일을 바꾸는 Git 작업을 시작하면, 파일 비교 탭에 저장하지 않은 편집이 있을 때 먼저 묻는다.
+ +병합 충돌 푸는 순서
+-
+
- Git 탭 → 브랜치 · 병합에서 내 브랜치를 체크아웃하고, 가져올 브랜치를 골라 Merge → 현재 브랜치로. +
- 알림이 충돌 수를 말한다. 머지 주석만 다른 충돌은 이때 저절로 풀린다 — 예: “충돌 24건 (머지 주석만 다른 2건은 자동으로 풀림)”. +
- 충돌 탭 목록에서 파일을 두 번 누르거나 Enter, 또는 3분할로 열기. 파일 비교 탭에 네 칸으로 열린다. +
- 자동 병합 으로 저쪽만 고친 줄을 받고, 다음 충돌 으로 딛으며 Take Mine / Take Theirs 를 고르거나 MERGED 를 직접 고친다. +
- 해결로 저장 (Ctrl+S) — 이 파일만 쓰고 스테이징한다. 커밋은 안 한다. 줄끝 · 인코딩은 내 쪽(ours) 파일을 따른다. +
- 한쪽이 지운 파일은 네 칸 대신 두 칸과 띠가 나온다. 파일 남기기 또는 파일 지우기. +
- 줄마다 볼 필요가 없는 파일은 충돌 탭에서 Accept Mine / Accept Theirs. 여러 파일을 Ctrl/Shift 클릭(Ctrl+A 전부)으로 골라 한 번에 적용한다 — 단추 옆에 “N개 고름” 이 뜨고, 저장소 다시 읽기는 끝에 한 번이다. Accept Both 는 두 파일을 통째로 이어 붙이므로 누르면 먼저 묻는다. +
- 남은 충돌이 0 이 되면 병합 커밋. 메시지 기본값은
Merge branch '상대' into 내 브랜치이고 git 의#줄은 빠진다.
+
남은 충돌이 있는데 Save & Commit 을 누르면 아무것도 쓰지 않고 막는다. 병합 중에는 파일 단위로 해결로 저장 을 쓴다.
머지 주석
+줄을 반영하면 그 줄 바로 위에 // [이름] 날짜 한 줄이 들어간다(들여쓰기는 코드를 따른다). 같은 줄을 다시 반영하면 새 주석이 코드 바로 위에 붙고 앞 주석은 위로 밀린다. 누가 언제 반영했는지 소스에 남기 위해서다.
대신 비교하고 병합할 때는 이 주석을 무시한다.
+-
+
- 두 칸 · 네 칸 · 폴더 비교에서 주석 줄은 무시 색으로 보이고 차이로 세지 않는다. 줄 끝에 붙은 주석(
코드 // [이름] 날짜)은 주석 조각만 떼고 견준다.
+ - git 충돌이 주석 차이뿐이면 양쪽 주석을 모두 남기고 자동으로 푼다. 코드도 다르면 코드 충돌만 묻는다. +
- 설정 [머지 주석] 에서 끌 수 있다. 사람이 우연히
// [글자] 2026-01-01모양으로 쓴 주석도 무시된다.
+
단축키
+WinMerge 에 맞췄다. F1 을 누르면 화면에서도 같은 목록이 뜬다(키 처리와 목록이 같은 표를 읽는다).
+| 묶음 | 키 | 하는 일 |
|---|---|---|
| 차이 이동 | Alt+↓ / ↑ · F4 / Shift+F4 | 다음 / 이전 차이 |
| Alt+Home / End · Ctrl+Home / End | 첫 / 마지막 차이 | |
| 병합 · 편집 | Alt+→ | 두 칸: BASE 반영 · 네 칸: Take Mine |
| Alt+← | 두 칸: 이 줄 되돌리기 · 네 칸: Take Theirs | |
| Alt+Shift+→ | 이 덩어리 반영 | |
| Alt+Shift+↓ / ↑ | 다음 / 이전 충돌 (네 칸) | |
| Alt+M | 자동 병합 (네 칸) | |
| Ctrl+Z / Ctrl+Y | 실행 취소 / 다시 실행 (되돌릴 반영이 없으면 편집기 글자 되돌리기) | |
| 이동 · 북마크 | Ctrl+M | 북마크 켜기 / 끄기 |
| Alt+PageDown · F2 | 다음 북마크 | |
| Ctrl+G | 줄 번호로 이동 | |
| Ctrl+PageUp / PageDown | 폴더 비교 목록의 앞 / 다음 파일 | |
| 파일 · 보기 | Ctrl+D | 폴더 비교 탭으로 (새 창이 아니라 탭) |
| F5 · Ctrl+R | 다시 비교 | |
| Ctrl+S | 저장 (병합 중에는 해결로 저장) | |
| 찾기 | Ctrl+F · Ctrl+H | 찾기 · 바꾸기 |
| F3 / Shift+F3 · Esc | 다음 / 이전 찾기 · 찾기 칸 닫기 | |
| 도움말 | F1 | 단축키 목록 |
설정
+| 묶음 | 항목 | 기본 |
|---|---|---|
| 저장소 | 기본 저장소 경로 · 기본 원격 이름 | — · origin |
| 파일 비교 (Git 아님) | 기본 왼쪽 파일 · 기본 오른쪽 파일 | 비움 |
| 데모 | .git 있는 폴더 · .git 없는 폴더 — 채우면 위 줄에 두 화면을 오가는 버튼이 생긴다 | 비움 |
| 사내 Gitea | 서버 주소 · 계정 | 비움 |
| 비교 옵션 | 공백 변경 무시 · 공백 무시 단계(0 전부 비교 · 1 개수만 · 2 전부) · 대소문자 무시 | 끔 · 0 · 끔 |
| 줄 필터 사용 · 줄 필터 정규식(한 줄에 하나) | 켬 · 비움 | |
| 단어 단위 diff · 문법 강조 · 커밋 조회 개수 | 켬 · 켬 · 200 | |
| 머지 주석 | 반영한 줄에 주석 남기기 | 켬 |
| 비교 · 병합에서 머지 주석 무시 | 켬 | |
| 작성자 (비우면 git config user.name) | 비움 | |
| 비교 옵션 | C# 코드 스타일 맞춤 (None=끔 · Aurora · Allman) — 파일 비교 화면 콤보와 같은 값 | 끔 |
알아 둘 한계
+-
+
- 머지 주석 자동 풀기는 Git 탭 Merge 에만 걸려 있다. pull · rebase · cherry-pick 이 낸 충돌에는 아직 안 된다. +
- rebase · cherry-pick 충돌도 같은 네 칸을 쓰지만, 6차는 병합만 끝까지 확인했다. +
- 병합 중 상태바의 인코딩 · 줄바꿈과 “남은 차이” 는 아직 믿을 수 없다(6차 B-7 대기). +
- 병합 커밋 뒤 파일 비교 탭이 어정쩡한 상태로 남는다 — 저장소를 새로고침하면 된다(6차 B-8 대기). +
- 빠른 비교(크기 · 수정일)는 내용이 바뀌었는데 크기와 시각이 같은 파일을 놓친다. +
- 코드 검사는 빌드가 된다는 보증이 아니다. +
- 로그인 · 권한은 아직 없다. 창 여러 개로 비교하는 기능은 넣지 않기로 했다. +
MergeHub 중간 발표
+← → 또는 PageUp PageDown 으로 넘긴다. 전체 화면에서 Esc 로 나온다.
+남은 일
+6차 지시서의 남은 네 항목과 일부러 미뤄 둔 것. 6차 규칙대로 B → C → D 순서로 간다.
+6차 — 병합을 끝까지 믿고 쓸 수 있게
+15개 항목 중 A 다섯 · B-1 ~ B-6 이 끝났다(B-6: 같은 줄 충돌 15개 22.0초 → 1.2초). 남은 것은 아래 순서다.
+| 항목 | 상태 | 무엇이 문제인가 | 끝났다고 볼 기준 |
|---|---|---|---|
| B-7 상태바가 병합 중에 믿을 수 없는 값을 보인다 | 대기 | 인코딩 · 줄바꿈을 충돌 표시가 들어간 워킹트리 파일에서 읽어, 양쪽 CRLF 인 파일도 “UTF-8 · 혼합”. “남은 차이 6줄” 이 충돌을 다 정해도 그대로. | 병합 중 상태바 인코딩 · 줄바꿈이 ours 기준. 상태바에 남은 충돌 수가 나오고 풀면 준다. |
| B-8 병합 커밋 뒤 파일 비교 탭이 어정쩡하게 남는다 | 대기 | 목록이 비고, 병합과 상관없는 파일이 BASE 칸에만 뜨고 언어는 “평문”. | 병합 커밋이 끝나면 병합 전과 같은 보통 상태(선택 커밋 = 방금 만든 병합 커밋). |
| C-1 로그와 목록 다듬기 | 대기 | “충돌 22건” 로그가 두 번. 충돌 종류 표시가 들쭉날쭉(상대쪽 삭제만). 풀린 개수 없음. 로그가 CP949 를 “ks_c_5601-1987” 로 적음. | 로그 한 번. 종류(양쪽 수정 · 상대 삭제 · 내가 삭제 · 양쪽 새 파일)와 풀린 개수. 인코딩 이름이 상태바와 같음. |
| D-1 병합을 처음부터 다시 끝까지 | 대기 | A ~ C 를 고친 뒤 시험 저장소(C1Repo)를 새로 만들어 같은 병합을 다시 한다. 5차 C-1 과 같은 표로 23가지 중 무엇이 사라졌는지 적는다. | MergeHub 만으로 병합 커밋까지. 커밋된 파일 중 줄끝이 바탕과 달라진 파일 0개. A 다섯 가지가 다시 나지 않는다. 새로 걸린 것은 고치지 말고 적어 7차로. |
C# 코드 스타일 맞춤에서 남긴 것
+-
+
- 들여쓰기 · 공백 등 다른 서식은 맞추지 않는다 — 중괄호와 else · catch · finally 의 줄 위치만. +
- git 병합 자체는 스타일을 모른다. 스타일만 다른 충돌도 git 은 충돌로 내고, MergeHub 는 네 칸에서 맞춰 보여 줄 뿐 자동으로 풀지는 않는다. +
6차에서 남긴 것
+-
+
- 머지 주석 자동 풀기는 Git 탭 [Merge] 에만 걸었다. pull · rebase · cherry-pick 이 낸 충돌에는 아직. +
- rebase · cherry-pick 충돌을 끝까지 믿을 수 있게 하는 확인 — 6차에서 뺐다. +
- MERGED 칸에서 반영하며 넣은 주석 줄이 다시 정렬하면 “무시” 색이 된다(차이 수에는 원래 안 세던 줄). +
- 폴더 비교 뒤 화면 트리를 세우는 데 약 1초 — 줄일 자리로 적어 둠(5차 B-2). +
미룬 것
+| 항목 | 까닭 |
|---|---|
| 로그인 · 권한 | 디테일이라 지금 붙잡을 일이 아니다 |
| 같은 줄 접기 (4차 B-2) | 차이 이동만으로 부족하다고 느끼는 순간이 오면 그때 |
| 외부 편집기로 열기 (4차 B-4) | 설정 값 두 개를 채우는 수고가 얻는 것보다 컸다 |
| 비교 창 여러 개 (3차 D-4) | 사용자 판단으로 뺌. 탭 하나로 돌아가는 도구 |
| 대용량 파일 성능 | 잴 필요가 없어졌다 — 실제 소스 최대 7,479줄에서 편집 · 이동 · 재정렬이 빠르다 |
기획안에서 아직 안 한 것
+-
+
- Gitea PR · 리뷰 코멘트 인라인 표시 (기획 확장 범위) — 사내 Gitea 저장소가 아직 없다. 지금은 원격 주소 · 계정 설정과 Fetch · Pull · Push 까지. +
- 멀티 레포 대시보드 · 오프라인 캐싱 (확장 범위) +
- Roslyn 실시간 구문 검사 (확장 범위) — 가벼운 코드 검사로 대신했다. Roslyn 은 붙이지 않았다. +
- 변경분 ZIP 내보내기 — 폴더로만 뽑는다. +
- 기획 4단계: 사내 베타 배포와 피드백, 단축키 가이드 포함 매뉴얼 (기획 일정 09.29 ~ 10.02). +
- 푸시 — 사내 Gitea 저장소가 만들어지면 그때 한 번에 올린다. +
지금까지 만든 것
+2026-09-07 방향 전환부터 2026-09-14 6차 B-5 까지. 차수마다 “실제로 써 보고 걸린 것” 을 지시서로 만들어 하나씩 고쳤다.
+차수별 기록
+-
+
- 기획안 v1.14주(영업일 20일) 개발 기준. MVP 8개 · Git 작업 UI화 5개 · 확장 3개.
+
- 머지툴 기본기 보강 · 사용성 보강“머지툴이 본체, Git 은 얹는 기능” 으로 방향 전환. 히스토그램 정렬, 진짜 3-Way(나중에 네 칸), Git 유무에 따라 화면 바꾸기, 언어 · 이진 파일, 폴더 비교. 작업자 이름 등록, 머지 주석을 고친 줄 위에 쌓기, WinMerge 단축키 + 설명 창, 셸 상 · 하단 띠 줄이기(코드 31줄 → 34줄).
+
- 2주차 — 기능 덩어리 ①~⑤① 폴더째 복사 · 삭제 · 보기 필터 · 비교 취소 ② 바꾸기 · 덩어리 반영 · 저장 형식 · 이진/그림 비교 ③ 자동 병합 · 충돌만 이동 · 병합 완료 판정 ④ amend · stash 목록 · 커밋 간 비교 · blame · 변경분 추출 ⑤ 명령줄 인자 · 탐색기 보내기.
+
- 3차 — 버그 정리 + 기능 확장 (23항목)폴더 고르기에서 죽던 것, 화면 이동 결함 3가지, 3-Way 스크롤 · 행 어긋남, 주석만 다름, C++ 전처리 색칠, 3-Way 덩어리 반영을 REMOTE 로, 결과 내보내기, 폴더 전체 검색, 끌어다 놓기. 22 완료 · 1 취소. 하네스 16벌 514건.
+
- 4차 — 로컬 머지툴 사용성 (13항목)저장 안 한 편집이 사라지던 길 8군데 막음, 보고서에 만든 사람, 최근 비교 목록, 폴더 목록 다음 파일로, 경로 표시 정리, 아래 상태 한 줄로, Git 원격 칸 접기(128px), 범례 눌러서 이동, ACTIONS 정리. 11 완료 · 2 취소. 17벌 571건.
+
- 5차 — 실제 소스에 맞추기CP949 67개 확인(실제 저장소 2,091개 깨짐 0) · 판별 코드 한 곳으로. 커밋 · 체크아웃 전에 저장 안 한 편집을 묻기. XAML 태그 · 속성 · 값 색칠(여러 줄 태그 포함). 폴더 비교 3.4배 / 4.7배. 20벌 698건.
+
- 5차 C-1 — 병합을 끝까지만든 저장소 303개 · 충돌 22개를 MergeHub 만으로 병합 커밋까지. 코드는 안 고치고 걸린 것 23가지를 적음.
+
- 6차 A-1 ~ B-6 · 추가 요청 E-1 ~ E-3아래 표. C# 스타일 맞춤 · 시연 재료 · 이 문서. 22벌 948건.
+
6차에서 끝낸 것
+| 항목 | 고친 것 | 확인한 값 |
|---|---|---|
| A-1 | 충돌 해결 저장이 내 쪽(ours) 파일의 줄끝 · 인코딩을 따른다. 검사 모음이 옛 실행 파일로 돌던 것도 찾아 세 벌을 고침 | 3,367줄 파일 diff +3,367/−3,363 → +8/−4 |
| A-2 | 병합 중 [해결로 저장](쓰고 스테이징만). 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 맨 앞 한 번 · 줄끝 한 가지 |
| B-1 | 병합 뒤 파일 목록이 게이트가 풀릴 때까지 기다렸다 섬. 두 번 누르기 · Enter · [3분할로 열기] | 병합 뒤 목록 304개 → 23개(충돌만) |
| B-2 | 확인 창이 고친 파일 이름을 대고, [저장하고 계속] 이 그 파일에 씀. [취소] 뒤 콤보 제자리 | 화면 확인 18건 |
| B-3 | 병합 커밋 메시지 Merge branch '상대' into 내 브랜치, # 줄 제거, 끝나면 칸 비움 | 고치기 전: “Merge commit 'fc8b8f8…'” + # 줄 24개 |
| B-4 | MERGED 줄 번호 자리 20 → 36px, 네 칸 여백 54 → 66px | 2949 가 “294” 로 잘리던 것 → 다섯 자리까지 |
| B-4 발견 ① | 멀리 건너뛰면 네 칸이 위로 밀리던 것 — 기준 행을 보이는 첫 행으로 | 7,479줄 Ctrl+End: 목록 칸 어긋남 −279px → −7px |
| B-4 발견 ② | git mergetool 세 벌을 두 칸이 아니라 네 칸으로 열고 MERGED 에 씀 | 저장 뒤 BOM · CRLF 42 · 홀로 LF 0 · ArgsTest 36건 |
| B-5 | 머지 주석을 비교에서 무시(두 칸 · 네 칸 · 폴더), 주석만 다른 git 충돌 자동 해결, 설정에서 끔 | git 충돌 26 → 24 · 두 칸 남은 차이 2 → 0 · NoteTest 29 → 64 |
| B-6 | 충돌 탭에서 여러 파일을 골라 Accept 한 번, 저장소 다시 읽기는 끝에 한 번 | 같은 줄 충돌 15개 22.0초 → 1.2초 |
| E-1 | C# 코드 스타일 맞춤(AURORA / Allman) — 두 칸 · 네 칸 · mergetool · 폴더 비교 · 설정 | 시연 파일 남은 차이 39줄 → 1줄 · StyleTest 78건 |
| E-2 | 시연 재료 demo\make-demo.ps1 — 폴더 비교 · 스타일 · mergetool · 큰 파일 · 병합 저장소 | 시연 저장소 git 충돌 8 → MergeHub 6 |
검사 하네스
+ +차수 끝의 통과 건수. 로직을 건드리면 테스트를 먼저 늘린다.
+ +기능 목록
+| 영역 | 기능 | 상태 |
|---|---|---|
| 폴더 비교 | 전체 / 빠른 비교 · 하위 폴더 · 취소 · 보기 필터 6가지 · 주석만 다름 · 머지 주석만 다르면 같음 · 폴더째 복사/삭제 · 전체 검색 · 결과 내보내기 · 다음/앞 파일 | 완료 |
| 파일 비교 | 히스토그램 정렬 · 단어 단위 · 자리 옮김 · 줄/덩어리/전체 반영 · 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 | 충돌 여러 개 한 번에 Accept (B-6) | 완료 |
| 머지 주석 | 반영한 줄 위에 쌓기 · 작업자 이름 · 비교에서 무시 · 주석만 다른 충돌 자동 해결 | 완료 |
| C# 스타일 | AURORA / Allman 맞춤 비교 · 저장 · 폴더 비교 · 설정 | 완료 |
| 밖에서 부르기 | 명령줄(--diff · --folder · --merge) · 탐색기 보내기 · mergetool 등록 | 완료 |
| 셸 · 플랫폼 | UbisamBase 셸 플러그인 · 테마 · 화면 잠금 · 세 갈래 확인 창 · 작업자 이름 창 · 설정 화면 자동 생성 | 완료 |
| 빠진 것 | 로그인 · 권한 · Gitea PR 코멘트 · 멀티 레포 · Roslyn · 같은 줄 접기 · 외부 편집기 · 창 여러 개 | 대기 취소 |
사내 Git 연동 UbiSam MergeTool 개발 기획안
+2026-09-03 기획안 v1.1 의 목차를 그대로 따르고, 각 절에 실제로 만든 것 · 바뀐 것 · 남은 것을 적었다. 제품 이름은 개발 중에 MergeHub 로 정해졌다.
+| 항목 | v1.1 (09-03) | v2 (09-14) |
|---|---|---|
| 개발 기간 | 2026-09-02 ~ 10-02 (영업일 20일) | 같음. 지금 기획 2단계 끝 시점 |
| 기술 | C# / .NET 8 · WPF · MVVM · LibGit2Sharp · DiffPlex · AvalonEdit | C# / .NET Framework 4.8 · WPF · CommunityToolkit.Mvvm 8.3.2 · LibGit2Sharp 0.32.0 · 자체 정렬기 · WPF 기본 편집 칸 · UbisamBase 셸 플러그인 |
| 보안 등급 | 사내 한정 | 같음 |
1. 프로젝트 개요
+배경 · 목적 — 바뀌지 않음
+담당자의 실력 향상을 위한 자기주도 과제이면서 사내에서 실제로 쓰는 도구를 남긴다. TortoiseGit 은 셸 확장이 파일 상태를 폴링하고 이력 조회마다 git.exe 를 새로 띄워 저장소가 클수록 느리다. 병합 · 비교가 번거로워 Git 을 꺼리게 된다. Merge / Diff 를 한 프로그램으로 통합한다.
+바뀐 것 — 머지툴이 본체 (09-07)
+v1.1 은 “Git 저장소의 병합 화면” 이었다. 만들어 보니 Git 저장소 안 · C# 소스 · 두 칸 비교에 묶여 있어 실무에서 쓰기 어려웠다. Git 이 아니어도, 소스가 아니어도 비교가 되는 머지툴을 본체로 두고 Git 을 그 위에 얹었다. 그래서 기획에 없던 폴더 비교가 첫 탭이 됐다.
+기대효과 — 확인된 것
+-
+
- 사내 개발 자산 — 사내 요구가 생기면 바로 반영한다. 실제로 머지 주석 무시(B-5)는 결정한 날 들어갔다. +
- 생산성 — 병합 저장이 줄끝을 보존해 리뷰할 diff 가 +3,367/−3,363 에서 +8/−4 로 줄었다. +
- 개발 역량 — WPF · MVVM · libgit2 · 셸 플러그인 구조 경험이 기록(
doc/history)으로 남는다.
+
2. 사용자 시나리오
+타겟: 사내 Windows PC 개발자. Git 명령줄 경험은 필수 아님.
+| STEP | v1.1 | 실제 | 상태 |
|---|---|---|---|
| 1 실행 | 탐색기 우클릭 → MergeTool 로 열기 | 우클릭 메뉴 대신 보내기(HKCU 등록은 메뉴에 안 떠서). 끌어다 놓기 · 명령줄 · 최근 목록 추가 | 바뀜 |
| 2 저장소 인식 | 저장소와 브랜치 자동 인식 | 상위로 거슬러 .git 을 찾음. 없으면 파일 두 개 비교 모드 | 완료 |
| 3 비교 시점 | 커밋 트리에서 기준 커밋 클릭 | 커밋 이력에서 고르기 + 3-Way 콤보로 브랜치를 REMOTE 로 | 완료 |
| 4 변경점 확인 | 좌우 비교와 미니맵 | 미니맵 + 색 구분 범례를 눌러 이동 + 차이 이동 단축키 | 완료 |
| 5 부분 수용 | 여백 [>] · Undo/Redo | 같음 + 덩어리 반영 · Take Mine/Theirs · 자동 병합 | 완료 |
| 6 저장 & 커밋 | 구문 검사 통과 후 Save & Commit | 가벼운 코드 검사 + Save & Commit. 병합 중에는 [해결로 저장] → [병합 커밋] | 바뀜 |
| 병행 사용 | git mergetool 등록 | [mergetool 등록] 버튼 · 네 칸으로 열림(6차) | 완료 |
3. 상세 기능 명세
+3.1 정보 구조도 (실제)
+MergeHub (UbisamBase 셸 탭) +├─ 폴더 비교 — v1.1 에 없던 탭 +│ ├─ 전체 / 빠른 비교 · 보기 필터 · 주석만 다름 +│ ├─ 폴더째 복사 · 삭제 +│ └─ 폴더 전체 검색 · 결과 내보내기 +├─ 파일 비교 +│ ├─ 두 칸 (기준 · 내 파일) · 커밋 이력 · 미니맵 +│ ├─ 네 칸 (LOCAL · BASE · REMOTE · MERGED) +│ ├─ 반영 · Undo/Redo · 머지 주석 +│ ├─ 저장 형식 · 비교 규칙 · 편집 잠금 · 코드 검사 +│ └─ C# 스타일 맞춤 — AURORA / Allman +├─ Git +│ ├─ 저장소 연결 (로컬 · 원격 · Gitea 계정) +│ ├─ 브랜치 · 병합 / 충돌 / 변경 · 커밋 +│ └─ 이력 / Blame / 태그 · 서브모듈 +└─ 설정 (셸 설정 탭 → MergeHub) + ├─ 비교 옵션 · 머지 주석 · 사내 Gitea · 데모 + └─ mergetool · 탐색기 보내기 등록은 Git 탭 버튼+
v1.1 은 하단 탭 다섯 개(2-Way Diff · 3-Way Merge · Folder Diff · Branch Graph · Settings)였다. 두 칸과 네 칸은 한 탭 안에서 저절로 바뀌고, 커밋 그래프는 Git 탭 이력으로 들어갔다. 탭은 셸이 그린다.
+ +3.2 기능 목록 — MVP 8개
+| 기능 | v1.1 설명 | 상태 | 실제 |
|---|---|---|---|
| 3-Way Merge 뷰 | BASE · LOCAL · 병합 결과 | 완료 | 네 칸. 처음엔 두 칸이었다(09-07 지적). BASE 축으로 세 쪽을 정렬 |
| 부분 수용 | 여백 [>] 로 선택 라인만 | 완료 | [>] [<] + 덩어리 반영 |
| 일괄 수용 | Accept Mine / Theirs / Both | 완료 | 파일 단위(충돌 탭) + 전체 반영. 여러 파일을 골라 한 번에(B-6, 15개 22.0초 → 1.2초) |
| Undo · Redo | 병합 액션 단위 | 완료 | 머지 주석 줄까지 함께 넣고 뺀다 |
| 줄 · 단어 Diff | 한 줄 안의 변경까지 | 완료 | DiffPlex 대신 자체 히스토그램 정렬 + 단어 단위 + 자리 옮김 |
| 코드 미니맵 | 변경 분포 · 클릭 이동 | 완료 | — |
| 커밋 트리 | 분기 · 병합 그래프 | 완료 | 파일 비교 이력 칸 · Git 탭 이력 |
| 탐색기 우클릭 | 셸 메뉴 · mergetool 등록 | 바뀜 | 보내기 메뉴 (셸 확장 DLL 은 탐색기를 죽일 수 있어 안 씀) |
Git 작업 UI화 — 1차 범위 5개
+| 기능 | 상태 | 실제 |
|---|---|---|
| 브랜치 리셋 | 완료 | 이력 탭 선택 커밋 → [Reset] |
| 커밋 메시지 수정 | 바뀜 | 마지막 커밋만 [커밋 수정](amend) + [마지막 메시지]. 임의 커밋 우클릭 이름 변경은 없음 |
| 변경분 파일 추출 | 바뀜 | [여기부터] 로 범위를 잡고 [변경분 추출] — 폴더로, 바이트 그대로. ZIP 은 없음 |
| 임시 저장 (Stash) | 완료 | [stash 저장] · 목록에서 [적용] [삭제] |
| 파일 단위 되돌리기 | 완료 | 변경 · 커밋 탭 [변경 취소] |
확장 범위 — 2차 이후
+| 기능 | 상태 | 메모 |
|---|---|---|
| Gitea PR · 리뷰 코멘트 인라인 | 대기 | 사내 Gitea 저장소가 아직 없다 |
| 실시간 구문 검사 (Roslyn) | 바뀜 | 토크나이저 기반 가벼운 코드 검사로 대신 |
| 멀티 레포 대시보드 · 오프라인 캐싱 | 대기 | — |
v1.1 에 없던 기능 — 만들면서 더한 것
+-
+
- 폴더 비교 · 폴더 전체 검색 · 결과 내보내기 +
- 언어 13가지 색칠(XAML 여러 줄 태그 포함) · CP949 판별 · 이진/그림 비교 +
- 머지 주석 넣기와 비교 · 병합에서 무시, 주석만 다른 충돌 자동 해결 +
- 병합 중 [해결로 저장] · 한쪽 삭제 충돌 [파일 남기기]/[파일 지우기] · 병합 커밋 메시지 +
- WinMerge 단축키와 설명 창 · 최근 비교 목록 · 끌어다 놓기 · 북마크 · 찾기/바꾸기 +
- 저장 안 한 편집 보호(4차 A-1 · 5차 A-2) +
- 완료 C# 코드 스타일 맞춤 (AURORA / Allman) · 충돌 여러 개 한 번에 · 발표 시연 재료 +
3.3 화면 정의 — 메인 화면
+실제 파일 비교 탭은 이 틀에서 이렇게 달라졌다.
+-
+
- 맨 위 한 줄: 최근 · 파일 콤보 · 3-Way 콤보 · 데모 전환 · [단축키] · [결과 내보내기]. 같은 경로가 세 곳에 나오던 것을 하나로(4차 C-1). +
- 그 아래 색 구분 범례 — 눌러서 이동(4차 C-4). +
- 가운데: 두 칸이면 커밋 이력 · BASE · LOCAL, 네 칸이면 위 LOCAL · BASE · REMOTE 와 아래 MERGED. 커밋 이력 칸은 네 칸일 때 폭을 양보한다. +
- 오른쪽 ACTIONS: 자주 쓰는 것(저장 · 반영 · 충돌 이동 · 머지 설명 · 커밋) 위, 한 번 정하는 것(저장 형식 · 비교 규칙 · 편집 잠금)은 접는 칸(4차 C-5). +
- 창 아래 상태 한 줄: 줄/열 · 인코딩 · 줄바꿈 · 켜진 무시 규칙 · 코드 검사(4차 C-2). 셸 상 · 하단 띠를 줄여 코드가 3줄 더 보인다. +
- 다크 테마 리소스는 셸이 준다(라이트 · 다크). +
4. 개발 일정 및 마일스톤
+| 단계 | v1.1 계획 | 실제 | 상태 |
|---|---|---|---|
| 1 착수 · 설계 | 09.02 – 09.04 · 요구사항 · 구조 · WPF 골격 | 기획안 v1.1(09-03). 구조를 App · Core · Git · UI 분리 대신 UbisamBase 셸 + 플러그인으로 | 완료 |
| 2 기반 구축 | 09.07 – 09.14 · Git 연동 · 커밋 그래프 · 편집기 · 비교 엔진 | 09-07 방향 전환 · 09-08 기능 덩어리 5개 · 09-09 3차 · 09-10 4차 · 09-11 5차. MVP 8개가 이 단계 안에 모두 들어갔다 | 완료 |
| 3 핵심 기능 | 09.15 – 09.23 · 3-Way · 부분 수용 · Undo · 우클릭 · Git 메뉴 | 기능은 앞당겨 끝났으므로 “병합을 끝까지 믿고 쓸 수 있게”(6차)로 쓴다. 09-14: A 5 · B 6 완료, B-7 · B-8 · C-1 · D-1 남음 | 진행 |
| 4 테스트 · 배포 | 09.29 – 10.02 · 성능 · 인코딩/줄바꿈 검증 · 베타 · 매뉴얼 | 성능 · 인코딩 · 줄바꿈 검증은 5차 · 6차에서 앞당겨 함. 매뉴얼 초안은 이 문서. 베타 배포는 대기 | 대기 |
일하는 방식 — v1.1 에 없던 것
+-
+
- 차수마다 지시서(
doc/작업지시) → 항목마다 빌드 · 실행 · 화면 확인 → 기록 세 군데(상세 · 상태 · changelog 한 줄) → 로컬 커밋.
+ - 고치기 전에 문제가 다시 나는 것부터 보이고, 고친 뒤 안 나는 것을 값으로 보인다. +
- 실제 고객 소스는 열지 않는다. 씨앗을 고정한 시험 저장소(C1Repo · 303개)와 시험 묶음(4,500개)을 만들어 쓴다. +
- 푸시하지 않는다. 사내 Gitea 저장소가 생기면 한 번에 올린다. +
비고(v1.1 과 같음): 담당 업무 외 시간(퇴근 후 · 주말)을 활용한다. 지연이 예상되면 확장 범위를 먼저 조정한다.
+시연 대본
+약 10분. 모든 재료는 지어낸 코드이고 실제 소스는 쓰지 않는다. 데모 폴더는 D:\Sorce\MergeTool\MergeHub\demo\ 에 따로 만든다.
데모 폴더 구성
+D:\Sorce\MergeTool\MergeHub\demo\ +├─ make-demo.ps1 한 번 실행하면 아래를 모두 새로 만든다 +├─ plain\left\ plain\right\ 폴더 비교용 +├─ style\Aurora.cs Allman.cs 같은 코드, 스타일만 다름 +├─ mergetool\Weld_BASE.cs Weld_LOCAL.cs Weld_REMOTE.cs Weld.cs +└─ big\Big7479_left.cs Big7479_right.cs 7,479줄 + +D:\MergeHubDemo\repo\ make-demo.ps1 이 만드는 Git 저장소 + feature/mine · feature/theirs+
| 재료 | 들어 있는 경우 | 보여 줄 것 |
|---|---|---|
plain\left · plain\right | 같은 파일 · 코드 다름 · 주석만 다름 · 머지 주석만 다름 · C# 스타일만 다름(AURORA vs Allman) · 한쪽에만 있음 · 이진 파일 | 폴더 비교 상태와 필터, 머지 주석 · 스타일 무시 |
style\ | 같은 코드를 AURORA 와 Allman 로 | 스타일 맞춤 전후의 차이 수 |
mergetool\ | BASE · LOCAL · REMOTE · 충돌 표시가 든 MERGED | git mergetool 네 칸 |
big\ | 7,479줄 두 파일 | 큰 파일에서 이동 · 줄 번호 다섯 자리 |
D:\MergeHubDemo\repo | 병합하면 같은 줄 충돌 · 자동 병합 · 한쪽 삭제 · 양쪽 새 파일 · CP949 한글 파일 · 줄바꿈 변경 · 머지 주석만 다른 충돌 · XAML 충돌 | 병합 → 충돌 목록 → 네 칸 → 병합 커밋 |
전날 준비
+-
+
- MergeHub 를 Release 로 빌드하고, 켜져 있는
UbisamBase.Shell을 끈다.
+ - PowerShell 에서
powershell -ExecutionPolicy Bypass -File D:\Sorce\MergeTool\MergeHub\demo\make-demo.ps1. 시연 직전에도 한 번 더 돌려 처음 상태로 만든다.
+ - 저장소 병합을 미리 한 번 해 보고 충돌 수 · 자동으로 풀린 수를 적어 둔다(발표 때 숫자를 말하기 위해). 끝나면 make-demo.ps1 로 되돌린다. +
- 설정 → MergeHub → 데모: .git 있는 폴더 =
D:\MergeHubDemo\repo, .git 없는 폴더 =…\demo\plain\left. 위 줄에 두 화면을 오가는 버튼이 생긴다.
+ - 설정 → 머지 주석: “비교 · 병합에서 머지 주석 무시” 켬. 비교 옵션 “C# 코드 스타일 맞춤” 은 끔으로 둔다 — 시연 중에 화면에서 고르는 것을 보여 준다. +
- 셸 창을 최대화, 화면 배율 100~125%. 작업자 이름 창에는 발표자 이름. +
대본
+ +여는 말 (30초)
+“폴더에서 다른 파일을 찾고, 줄을 골라 합치고, Git 병합을 커밋까지 한 화면에서 끝내는 도구입니다. 오늘 재료는 전부 지어낸 코드입니다.”
+폴더 비교 (2분)
+-
+
- 폴더 비교 탭. 탐색기에서
plain\left를 왼쪽 경로 칸에,plain\right를 오른쪽 칸에 끌어다 놓는다 → 바로 비교가 돈다.
+ - 상태 색을 짚는다: 같음 · 다름 · 주석만 다름 · 왼쪽에만/오른쪽에만 · 이진. +
- 보기 필터를 코드가 다른 것만 으로 → 주석만 다른 파일이 빠진다. +
MergeNoteOnly.cs가 같음에 있는 것을 보여 준다.StyleOnly.cs는 스타일 맞춤을 켜고 다시 비교하면 같음으로 옮겨 간다.
+ - 검색 칸에
PowerWatt같은 낱말 → 찾기 → 결과 줄의 왼쪽 · 오른쪽 · 양쪽 → 찾은 줄 열기.
+
파일 비교와 줄 반영 (1분 30초)
+-
+
- 폴더 목록에서 “코드 다름” 파일을 두 번 누른다 → 파일 비교 탭. +
- 범례의 BASE와 다름 개수를 누르고, Alt+↓ 로 다음 차이. +
- 여백 > 로 한 줄 반영 → 위에
// [이름] 날짜가 붙는다. Ctrl+Z → 주석까지 같이 사라진다. Ctrl+Y.
+ - Ctrl+PageDown 으로 목록의 다음 파일. +
C# 스타일 맞춤 (1분)
+-
+
style\Allman.cs(왼쪽)와style\Aurora.cs(오른쪽)를 파일 비교로 연다. 스타일 맞춤이 꺼져 있으면 상태바에 남은 차이 39줄 — 중괄호 자리만 다른 줄이다.
+ - 비교 규칙 콤보에서 C# AURORA → 남은 차이 1줄. 남은 한 줄은
RetryCount3 → 5, 진짜 변경이다. C# Allman 로 바꿔도 1줄이고, 이때는 편집 칸이 Allman 로 바뀌어 [저장] 이 켜진다.
+ - 편집 칸에서 한 줄 고치고 저장 → 저장된 파일이 고른 스타일인지 짚는다. +
git mergetool 네 칸 (1분 30초)
+-
+
- 셸을 끄고 명령줄에서 켠다 (경로는 데모 폴더 기준):
+
UbisamBase.Shell.exe --merge ^ + --base demo\mergetool\Weld_BASE.cs ^ + --local demo\mergetool\Weld_LOCAL.cs ^ + --remote demo\mergetool\Weld_REMOTE.cs ^ + --merged demo\mergetool\Weld.cs
+ - 네 칸이 뜬다. 범례의 Conflict · Theirs only 개수를 읽는다. +
- 자동 병합 → 저쪽만 고친 줄이 들어온다. 다음 충돌 → Take Theirs. +
- 충돌 정리 끝이 되면 저장. 탐색기에서
Weld.cs에 충돌 표시가 없는 것을 보여 준다.
+
저장소 병합 (3분)
+-
+
- 위 줄 데모 버튼으로 Git 저장소 화면(
D:\MergeHubDemo\repo). Git 탭 → 브랜치 · 병합에서feature/mine체크아웃,feature/theirs를 골라 Merge → 현재 브랜치로.
+ - 알림을 읽는다: “충돌 N건 (머지 주석만 다른 M건은 자동으로 풀림)”. 전날 적어 둔 숫자와 같은지. +
- 충돌 탭. 같은 줄 충돌 파일을 두 번 누른다 → 파일 비교 탭 네 칸, REMOTE 제목에
feature/theirs. 한두 줄 Take 하고 해결로 저장 → 충돌 수가 하나 준다.
+ - CP949 한글 파일을 열어 네 칸 모두 한글이 바른 것, XAML 충돌 파일이 색칠된 것을 짚는다. +
- 한쪽이 지운 파일을 연다 → “상대가 이 파일을 지웠습니다” 띠 → 파일 지우기. +
- 충돌 탭으로 돌아가 남은 파일을 Ctrl/Shift 클릭으로 여러 개 골라 Accept Theirs 한 번. 단추 옆 “N개 고름” 을 짚고, 한 번에 풀리는 것을 보여 준다(만든 저장소에서 같은 줄 충돌 15개가 1.2초, 고치기 전에는 하나씩 22.0초). +
- 양쪽 새 파일에 Accept Both → 먼저 묻는 창을 보여 주고 취소하거나 Mine 으로. +
병합 커밋과 마무리 (30초)
+-
+
- 남은 충돌 0 → 병합 커밋. 이력 탭에서 부모 둘인 커밋과 메시지
Merge branch 'feature/theirs' into feature/mine을 보여 준다.
+ - (시간이 남으면)
big\Big7479_left.cs·right.cs를 열어 Ctrl+End — 줄 번호 7,479 가 온전히 보이고 칸이 밀리지 않는다.
+
# 줄이 없다.시연이 막히면
+-
+
- 화면이 이상하면 F5(다시 비교). 저장소가 꼬이면 Git 탭 작업 취소 뒤 make-demo.ps1 을 다시 돌린다(1분 안쪽이어야 한다 — 전날 재 둔다). +
- 병합 중 상태바의 인코딩 · 줄바꿈 값은 아직 틀릴 수 있다(B-7). 짚지 않는다. +
- 병합 커밋 뒤 파일 비교 탭이 어정쩡하면(B-8) Git 탭 새로고침. +
WinMerge 가 있는데 왜 따로 만드나
+WinMerge 는 무료(GPL)로 오래 다듬어진 좋은 비교 · 병합 도구다. MergeHub 는 그것을 대신하려는 도구가 아니라, 우리 팀의 Git 병합 흐름에서 WinMerge 로는 손으로 해야 하던 일을 줄이려고 만들었다. 단축키와 조작 감각은 일부러 WinMerge 에 맞췄다(코드는 참고하지 않았다 — GPL).
+기능 비교
+WinMerge 쪽은 공개된 기능 설명 기준이다(최신 2.16 판). MergeHub 쪽은 2026-09-14 소스와 기록 기준이다.
+| 기능 | WinMerge | MergeHub |
|---|---|---|
| 비교 | ||
| 파일 2-way 비교 | 있음 | 있음 |
| 파일 3-way 비교 · 병합 | 있음 (세 파일) | 있음 — LOCAL · BASE · REMOTE 를 보며 따로 있는 MERGED 칸을 고친다 |
| 폴더 비교 | 2-way · 3-way | 2-way 만 |
| 줄 안 변경 강조 · 이동 블록 | 있음 | 있음 (단어 단위 · 자리 옮김) |
| 공백 · 대소문자 · 정규식 줄 필터 | 있음 | 있음 (공백 3단계) |
| 주석 차이 | 주석 차이 무시 옵션 | 폴더 비교에 주석만 다름 상태와 코드가 다른 것만 필터 |
머지 주석 // [이름] 날짜 | 없음 | 반영할 때 넣고, 비교 · 병합에서는 무시 |
| C# 중괄호 스타일 맞춤 | 없음 (전처리 플러그인을 직접 만들면 가능) | AURORA / Allman 로 맞춘 뒤 비교 · 저장 · 폴더 비교에서도 같음 |
| 이미지 · 이진 | 이미지 비교 창(겹쳐 보기 등) · 16진 비교 | 기본만 — 크기 · SHA-1 · 처음 갈리는 바이트 · 그림 나란히 · 앞 4KB 16진 |
| 표(CSV) · 압축 파일 · 문서 · 플러그인 | 있음 | 없음 (넣지 않기로 함) |
| 폴더 안 글자 검색 | 없음 | 있음 — 결과마다 왼쪽 · 오른쪽 · 양쪽, 그 줄로 열기 |
| 코드 실수 검사 | 없음 | 괄호 짝 · 따옴표 · 전각 문자 · 주석 기호 빠진 한글 |
| Git | ||
| git difftool / mergetool 로 불리기 | 있음 | 있음 (네 칸으로 열림) |
| 저장소 조작 | 없음 — 파일만 본다 | 내장 — 브랜치 · Merge · rebase · 커밋 · amend · stash · 이력 그래프 · Revert · Cherry-pick · Reset · Blame · 태그 · 서브모듈 · Fetch/Pull/Push |
| 병합 충돌 목록 | 없음 — git 이 파일마다 하나씩 부른다 | 충돌 탭 목록 → 두 번 누르면 네 칸, 파일 단위 Accept, 여러 개를 골라 한 번에 |
| 한쪽이 지운 충돌 (UD · DU) | 명령줄에서 git rm / git add | [파일 남기기] · [파일 지우기] |
| 주석만 다른 충돌 | 사람이 푼다 | 양쪽 주석을 남겨 자동으로 푼다 |
| 병합 중 저장 | 파일 저장 뒤 git 이 스테이징 | [해결로 저장] = 쓰기 + 스테이징, 남은 충돌이 있으면 커밋을 막음, 병합 커밋 메시지 정리 |
| 파일 형식 | ||
| 인코딩 · 줄바꿈 | 판별 · 코드 페이지 골라 저장 | 원본 유지가 기본. 병합 저장은 내 쪽(ours) 파일의 줄끝 · 인코딩을 따른다(충돌 표시가 든 워킹트리 파일을 보면 틀리므로). CP949 판별 |
| 쓰는 환경 | ||
| 탐색기에서 부르기 | 우클릭 메뉴(셸 확장, 설치 시 등록) | 보내기 메뉴 — 관리자 권한 없이 버튼 하나로 등록 · 해제 |
| 창 | 여러 비교 창 · 탭 | 탭 하나(폴더 비교 · 파일 비교 · Git) |
| 보고서 | HTML · XML 등 | 글(텍스트) 보고서, 만든 사람 · 만든 때 포함 |
| 셸 통합 | 단독 프로그램 | UbisamBase 셸 플러그인 — 테마 · 화면 잠금 · 작업자 이름 · 설정 화면을 셸과 같이 씀 |
| 다국어 UI | 여러 언어 | 한국어만 |
| 성숙도 | 20년 넘게 널리 쓰임 | 2026-09 개발 시작, 만든 시험 저장소로만 검증 |
MergeHub 가 필요한 이유
+-
+
- 병합이 한 화면에서 끝난다. WinMerge 는 git 이 파일마다 하나씩 불러 주는 비교 창이다. 충돌이 22개면 명령줄과 WinMerge 를 22번 오간다. MergeHub 는 병합 → 충돌 목록 → 네 칸 → 해결로 저장 → 병합 커밋까지 탭 안에서 간다. +
- 반영 기록을 소스에 남기고, 그 기록 때문에 생기는 충돌은 스스로 푼다. 우리 팀은 누가 언제 반영했는지를
// [이름] 날짜로 남긴다. WinMerge 에는 이 규칙이 없어 손으로 적어야 하고, 다음 병합 때 주석끼리 충돌한다. 만든 저장소에서 git 충돌 26개 중 2개가 이런 충돌이었다.
+ - 리뷰할 diff 를 지킨다. 병합 결과를 내 쪽 파일의 줄끝 · 인코딩으로 쓴다. 3분할 저장이 LF 로 바꿔 쓰던 문제를 고친 뒤 3,367줄 파일의 diff 가 +8/−4 로 줄었다. CP949 한글 파일도 같은 규칙이다. +
- 스타일만 다른 diff 를 걷어 낸다. 사람마다 다른 C# 중괄호 자리를 AURORA / Allman 로 맞춘 뒤 견준다. 시연 파일에서 남은 차이가 39줄에서 진짜 변경 1줄로 준다. +
- 우리가 고친다. 사내 요구가 생기면 그날 넣는다 — C# 스타일 맞춤은 요청 당일 들어갔다. 기록과 검사(22벌 948건)가 저장소에 함께 있다. +
WinMerge 가 더 나은 점
+-
+
- 안정성과 검증 — 오래, 많은 사람이 썼다. MergeHub 는 아직 만든 시험 저장소로만 확인했고, 6차 D-1 (처음부터 다시 끝까지)도 남았다. +
- 3-way 폴더 비교, 이미지 비교(겹쳐 보기 · 차이 강조), 표 · 압축 파일 · 문서 비교, 플러그인. +
- 여러 비교를 동시에 여는 창 · 탭. +
- 보고서 형식(HTML 등)과 다국어. +
- 단독 실행 — 셸 없이 어느 PC 에서나 설치해 쓴다. MergeHub 는 UbisamBase 셸이 있어야 한다. +
- 한 파일 안에서 줄 이동 선 표시 같은 세부 표시가 더 풍부하다. +
같이 쓰는 방법
+MergeHub 로
- 브랜치 병합과 충돌 풀기
- 반영 기록(머지 주석)을 남기는 비교
- C# 소스 폴더 비교 · 검색
- 한글 CP949 소스
WinMerge 로
- 이미지 · 엑셀/CSV · 압축 파일 비교
- 세 폴더 비교
- 셸이 없는 PC
- 여러 비교를 나란히 띄워야 할 때