GN⁺: Mergiraf - Git용 구문 인식 Merge 처리기
(mergiraf.org)- Git Merge Conflict를 해결하는 도구로, 파일 내 트리를 이해하여 양측의 요구를 조화롭게 해결
- 새로운 언어를 선언적으로 추가할 수 있음
- Git의 기본 Merge 알고리듬 대신 Mergiraf를 사용하도록 설정 가능
-
merge
,revert
,rebase
,cherrypick
등의 Git 명령어를 향상시킴
-
- 또는 Git의 원래 동작을 유지하면서 충돌 발생 시 수동으로 Mergiraf를 호출할 수 있음.
Mergiraf의 목표
- 충돌을 숨기지 않음
- 구문을 인식하는 머지 휴리스틱은 때로는 지나치게 낙관적으로 충돌이 해결되었다고 간주할 수 있음
- Mergiraf는 의심스러운 경우 파일에 충돌 마커를 유지하는 쪽으로 최선의 상태를 보존
- 모든 충돌을 자체적으로 해결했다면
mergiraf review
명령을 통해 중재 작업을 검토하도록 권장 - 병합이 잘못된 것처럼 보이면
mergiraf report
로 쉽게 보고할 수 있음
- 대화식 사용에 충분할 만큼 빠름
- 기린은 시속 60킬로미터로 달릴 수 있음
- 파일의 분기 버전을 병합하는 작업은 충돌이 없는 한 종종 눈치채지 못한 채 일상적으로 발생함
- Mergiraf는 작업을 방해하지 않도록 빨라지려고 노력함
- 다른 방법에 개방적임
- 많은 경우 행 기반 병합은 잘 작동하며 트리 조작이 필요하지 않음
- 행 기반 병합에 충돌이 없으면 Mergiraf는 해당 병합을 반환함(매우 빠름)
- 행 기반 병합으로 인해 중복 키가 생성되면 Mergiraf는 문제를 해결하거나 충돌 마커로 강조 표시하기 위해 약간의 추가 작업을 수행함
Hacker News 의견
-
SemanticDiff와 유사한 작업을 하고 있으며, tree-sitter와 GumTree 사용에서 문제를 겪고 있음
- tree-sitter는 주로 구문 강조를 위해 작성되어, 코드 수정 시 정확한 구문 분석이 어려움
- GumTree는 빠른 결과를 제공하지만, 잘못된 매칭을 자주 반환함
- Dijkstra 기반 접근 방식으로 전환하여 더 나은 결과를 얻고 있음
-
Mergiraf의 아키텍처 섹션이 복잡한 도구의 작동 방식을 깊이 있게 설명하고 있음
-
기린을 선택한 이유는 높이로 인해 멀리 볼 수 있고, 육상 포유류 중 가장 큰 심장을 가졌기 때문임
-
일부 삽입에서 순서가 중요하지 않다고 주장하는 것에 대해 비판적임
- 언어 수준에서는 순서가 중요하지 않을 수 있지만, 인간에게는 특정 순서가 중요할 수 있음
- 예시로 Base
struct Foo; struct Bar;
사이에 Left가impl Foo { }
를 삽입하고 Right가struct Baz;
를 삽입하는 경우, 컴퓨터는 차이를 인식하지 못함
-
Git의 병합 드라이버 개발에 긍정적임
- 표준 3-way 병합은 언어를 인식하지 못해 문제를 일으킬 수 있음
- Python 코드에서 두 가지 다른 브랜치가 각각 다른
print
를 삭제하면 유효하지 않은 코드가 됨
-
팀이 문제에 맞게 기본 언어를 확장할 때 구문 인식 도구가 문제를 겪음
- Rust의 매크로나 "go generate" 사용 사례를 언급함
-
자동 포맷팅 관련 충돌 해결에 도움이 될 수 있는 아이디어임
- 코드 이동으로 인해 발생하는 의미적 충돌을 감지할 수 있는지 궁금해함
-
Mergiraf를 시도해볼 예정이며, git-absorb와 함께 사용 중임
- 두 도구가 완벽하게 작동하거나 Git에 공식적으로 통합되면 좋겠음
-
Python 지원이 유용할 것 같음
- Python의 들여쓰기 기반 AST가 잘 작동할 것으로 보임
-
언어 지원이 제한적이지만, 더 많은 언어 지원이 추가되기를 바람