긴 브랜치를 리베이스할 때마다 같은 충돌을 반복해서 푼 이유
문제 발생
2주 넘게 유지된 기능 브랜치를 main에 맞춰 여러 번 리베이스했습니다. 매번 같은 파일의 같은 지점에서 같은 충돌이 났고, 매번 같은 방식으로 풀었습니다.
여덟 번째쯤 되니 손이 익었는데, 익숙해진 만큼 대충 풀고 넘어갈 위험도 커졌습니다.
원인 분석
Git이 내 해결 방법을 기억하지 않기 때문입니다. 리베이스는 커밋을 새 베이스 위에 다시 적용하는 작업이라, 이전에 어떻게 풀었는지와 무관하게 매번 처음부터 충돌을 만듭니다.
Git에는 이걸 위한 기능이 있습니다. git rerere의 이름 자체가 reuse recorded resolution(기록된 해결의 재사용)이고, 문서 설명대로 최초 수동 병합에서 충돌한 automerge 결과와 그에 대응하는 수작업 해결 결과를 기록해두었다가, 같은 automerge 결과가 다시 나타나면 이전에 기록한 해결을 적용합니다.
문서가 드는 상황이 정확히 이 경우입니다 — 비교적 오래 사는 토픽 브랜치를 쓰는 워크플로에서는 브랜치가 끝날 때까지 같은 충돌을 반복해서 풀어야 할 때가 있습니다.
기본으로 꺼져 있는 이유도 있습니다. 잘못 푼 해결도 똑같이 기록되어 다음번에 조용히 재생되기 때문입니다.
해결 방안
- 켭니다.
git config --global rerere.enabled true-
평소처럼 충돌을 풉니다. 첫 해결이 기록되고, 다음 같은 충돌에서는 파일이 이미 해결된 상태로 나타납니다. 이때
git status에 "Resolved ... using previous resolution"이 보입니다. -
자동 적용된 결과를 반드시 확인합니다. 이게 이 기능을 안전하게 쓰는 유일한 방법입니다. 자동 해결은 과거의 나를 신뢰하는 것이고, 그때 잘못 풀었다면 지금도 잘못됩니다.
-
잘못 기록됐으면 지웁니다.
git rerere forget <파일>-
충돌 마커와 비슷한 내용이 있는 파일에 주의합니다. 문서가 경고하듯 rerere는 파일의 충돌 마커로 충돌을 감지하기 때문에, 문서나 코드에
<<<<<<<같은 줄이 이미 있으면 기록에 실패할 수 있습니다. 이런 파일에는gitattributes의conflict-marker-size를 씁니다. -
반복 충돌 자체를 줄이는 것도 함께 검토합니다. 같은 지점이 계속 충돌한다는 건 브랜치가 너무 오래 살았거나 변경 범위가 겹친다는 신호입니다. rerere는 통증을 줄여줄 뿐 원인을 고치지 않습니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.