mabbit — 워크북 3-way 의미 병합
![]()
1. 요약
워크북을 파일이 아니라 표로 병합합니다. 두 사람이 같은 .xlsx를 수정하였을 때, 셀의
위치가 아니라 테이블·행 키·컬럼의 3단계로 정합하여 병합하고, 병합할 수 없는 자리만
충돌로 보고합니다.
이것이 성립하는 근거는 하나입니다 — 이 저장소는 그 워크북의 구조를 이미 읽을 수 있습니다. 어느 시트가 표인지, 어느 사각형이 테이블의 경계인지, 어느 컬럼이 기본 인덱스인지를 레이아웃 파서가 산출합니다. 범용 엑셀 병합 도구가 행을 위치로 정합할 수밖에 없는 자리에서, 이 도구는 키로 정합할 수 있습니다.
| 무엇 | 현재 | 이 스펙 이후 |
|---|---|---|
| 같은 워크북의 동시 수정 | 한쪽의 작업이 소실됩니다. 여러 사람이 함께 쓸 때가 도구의 상한으로 기재해 둔 자리입니다 | 겹치지 않는 수정은 병합되고, 겹치는 자리만 셀 단위로 보고됩니다 |
| 워크북 두 개의 차이 확인 | 수단이 없습니다. 변환한 뒤 히스토리에서만 확인합니다 | --diff가 테이블·행·셀 단위로 산출합니다 |
| 병합 결과의 신뢰 | — | 병합 결과에 검증 파이프라인을 그대로 적용합니다. 중복 id와 깨진 참조가 커밋 전에 검출됩니다 |
대상은 파일로 존재하는 워크북입니다. 구글 스프레드시트는 파일이 아니므로 대상이 아니고, 그쪽의 동시 편집은 id 대역 분할이 계속 담당합니다.
1.1 현재 상태 — 되는 것과 안 되는 것
이 문서의 나머지는 설계이고, 이 절만 현재 구현입니다. 6단계 전부 되어 있습니다 — git 병합 드라이버로 등록해서 쓸 수 있습니다.
되는 것
| 무엇 | 비고 |
|---|---|
--diff로 워크북 2개 비교 | 테이블·행 키·컬럼 3단계. 행은 위치가 아니라 키로 정합합니다 |
| 변경마다 셀 주소 보고 | Item!C2 형태. 텍스트와 JSON 두 형식(--format), 파일로도(--out) |
.xlsx · .xlsm · .xlsb · .xls 읽기 | 4종 전부. 게이트가 .xlsx와 .xlsb를 각각 읽습니다 — 리더 안에서 다른 코드입니다 |
| 확장자 없는 파일 읽기 | --path가 주는 저장소 경로에서 형식을 판정합니다. git이 넘기는 임시 파일이 이 형태입니다 |
| 키 컬럼 지정 | --key <시트>:<헤더> 또는 --key <시트>:<열 문자>. 없으면 첫 컬럼 |
| 따라갈 수 없는 행의 보고 | 키가 빈 행과 중복 키를 차이와 분리해서 보고합니다. 자기 자신과 비교하면 「차이 없음」이고 주석만 남습니다 |
--merge로 워크북 3개 판정 | §4.3~§4.5의 규칙 전부. 충돌마다 base·mine·theirs 셋과 셀 주소를 함께 냅니다 |
| 표 밖 영역의 변경 검출 | 표 사각형 밖을 시트마다 해시해 3개 파일을 대조합니다 |
--result로 병합 결과 쓰기 | mine의 사본에 셀 값만. 표 밖은 바이트가 동일하고 게이트가 그것을 대조합니다 |
| 행 추가·삭제 | 추가는 표 아래에 덧붙이고, 자리가 없으면 거부합니다. 삭제는 표 안의 셀을 비웁니다 |
| git 병합 드라이버 | --result %A로 제자리에 씁니다. 종료 코드 0 병합 · 1 충돌 |
| 충돌을 보는 페이지 | --format html. 자립한 파일 하나이고 값 3개를 나란히 놓습니다 |
| 진짜 표 사각형 | --schema가 tabbit --dump-schema의 JSON을 읽습니다. 없으면 추정으로 동작합니다 |
| 게이트 67개 | .github/workflows/mabbit.yml이 리눅스와 윈도우 양쪽에서 돌립니다. 실제 git으로 실제 저장소를 병합하는 것 포함 |
안 되는 것
| 무엇 | 어디서 |
|---|---|
| 컬럼·테이블이 오가는 병합. 컬럼이 오가거나 시트가 생기고 없어지는 것은 거부하고 이유를 댑니다 | 미착수 |
.xlsb 쓰기. 읽기는 됩니다. 쓰기는 거부합니다 | §8 |
|서식·차트·수식·주석의 병합|§7 — 하지 않기로 한 것| |구글 스프레드시트|§7 — 하지 않기로 한 것|
이 문서의 나머지
| 무엇 | 어디 |
|---|---|
| 배치와 설계 | 왜 독립한 프로그램인지, 참고한 구현, 그리고 병합 알고리즘 |
| 단계와 충돌 표시 | 구현 단계와, 충돌을 사람이 보는 화면 |
| 남은 것과 연동 | 담지 않은 것, 미결, 그리고 SCM 에 붙이는 법 |