# Show GN: threeway_merge – 100% Git 호환 3-way 문자열 병합 라이브러리 (Rust)

> Clean Markdown view of GeekNews topic #22926. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=22926](https://news.hada.io/topic?id=22926)
- GeekNews Markdown: [https://news.hada.io/topic/22926.md](https://news.hada.io/topic/22926.md)
- Type: show
- Author: [levish](https://news.hada.io/@levish)
- Published: 2025-09-05T16:49:18+09:00
- Updated: 2025-09-05T16:49:18+09:00
- Original source: [crates.io](https://crates.io/crates/threeway_merge)
- Points: 10
- Comments: 2

## Summary

**Rust** 환경에서 **Git**과 100% 호환되는 **3-way 문자열 병합**을 메모리 내에서 직접 수행할 수 있는 라이브러리가 공개되었습니다. 기존 솔루션과 달리 **임시 파일을 사용하지 않고**, **Git의 xdiff 엔진과 동일한 충돌 처리 및 병합 전략**을 완벽히 지원하여, 개발자들이 더욱 효율적으로 소스 코드 병합이나 변경 사항 통합 작업을 할 수 있습니다. Myers, Patience, Histogram 등 다양한 **병합 알고리즘**과 세분화된 충돌 스타일, 유연한 병합 옵션이 제공되어, 실제 **git merge-file**과 동일한 결과를 필요로 하는 서비스와 툴 개발에 적합합니다.

## Topic Body

안녕하세요 🙂  
  
프로젝트에서 문자열 변경을 3-way merge 해야 하는 상황이 있었는데, Git의 merge-file처럼 동작하면서 메모리에서 바로 문자열을 병합할 수 있는 라이브러리가 필요했습니다.  
  
기존 라이브러리들을 살펴봤지만:  
- 임시 파일을 꼭 써야 했거나  
- Git과 동일한 방식으로 충돌을 처리하지 않거나  
- 원하는 병합 전략을 지원하지 않는 경우가 많았습니다.  
  
그래서 결국 **libgit2의 xdiff(C 코드, Git 내부와 동일)** 에 대한 Rust 바인딩을 작성했습니다.  
  
```rust  
use threeway_merge::{merge_strings, MergeOptions};  
  
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;  
```  
  
특징:  
  
- Git의 모든 병합 알고리즘 지원 (Myers, Patience, Histogram 등)  
- 충돌 스타일 지원 (normal, diff3, zdiff3)  
- 한쪽을 자동으로 우선 선택하거나, union 전략으로 변경 사항 결합 가능  
- git merge-file 테스트와 100% 동일하게 동작  
  
링크:  
- crates.io: https://crates.io/crates/threeway_merge  
- 소스코드: https://github.com/levish0/threeway-merge-rs  
  
혹시 다른 분들께도 유용할 것 같아 공유합니다!

## Comments



### Comment 43434

- Author: jamiecha
- Created: 2025-09-06T11:43:07+09:00
- Points: 1

멋진 프로젝트네요! 코드가 깔끔해서 FFI 로 붙이는 아주 좋은 예제가 될 것 같습니다.  
그런데 cargo test 돌려봤더니 실패하는데 제가 Ubuntu on WSL2 라 그런가? 싶네요.  
  
=== COMPREHENSIVE TEST RESULTS ===  
Scenarios tested: 12  
Total test combinations: 576  
Passing tests: 96  
Failing tests: 480  
Success rate: 16.7%

### Comment 43435

- Author: levish
- Created: 2025-09-06T12:04:17+09:00
- Points: 1
- Parent comment: 43434
- Depth: 1

WSL에서 테스트 스크립트가 사용하는 git의 인수가 달랐던 것으로 기억합니다
