Published on

Git rebase 충돌 자동해결 - rerere 실전 설정

Authors

서로 다른 브랜치에서 같은 파일을 자주 만지는 팀이라면 git rebase는 생산성을 올려주지만, 반복 충돌이 누적되면 금방 피로해집니다. 특히 장수 브랜치(오래 살아남는 기능 브랜치)나 체리픽/리베이스를 자주 하는 레포에서는 같은 충돌을 “매번” 똑같이 푸는 일이 흔합니다.

이때 가장 강력한 숨은 기능이 rerere입니다. 한 번 해결한 충돌의 “해결 결과”를 Git이 기록해두고, 다음에 동일/유사 충돌이 다시 발생하면 자동으로 그 해결을 재적용합니다. 즉, 사람의 손으로 해결한 충돌을 Git이 학습하는 셈입니다.

이 글에서는 rerere의 동작 원리, 켜는 방법, 기록을 안전하게 관리하는 팁, 그리고 rebase 실전 흐름에서 어떻게 체감 효율을 극대화하는지까지 다룹니다.

rerere란 무엇이고 왜 rebase에 특히 유용한가

rerere는 “reuse recorded resolution”의 약자입니다.

  • 충돌이 발생하면 Git은 충돌 난 파일의 상태(충돌 베이스/양쪽 버전)와 사용자가 최종적으로 만든 해결 결과를 기록합니다.
  • 이후 같은 형태의 충돌이 다시 발생하면, Git이 과거 기록을 찾아 3-way 머지 과정에 해결 결과를 자동으로 적용합니다.

rebase에서 유용한 이유는 간단합니다.

  • rebase는 커밋을 하나씩 재적용하면서 충돌이 여러 번 발생할 수 있습니다.
  • 특정 파일(예: 라우터, 설정 파일, 공통 유틸)에서 충돌 패턴이 반복되면, rerere가 바로 시간 절약으로 이어집니다.

rerere 활성화: 개인/레포 단위 설정

1) 개인 전역 설정(추천)

git config --global rerere.enabled true

이 설정을 켜면, 충돌을 해결할 때마다 기록이 자동으로 쌓입니다.

추가로 자동 업데이트도 켜두면 편합니다.

git config --global rerere.autoupdate true
  • rerere.autoupdate=true는 기록된 해결책이 적용 가능한 경우, 인덱스(stage)까지 더 자동으로 업데이트해주는 편의 옵션입니다.
  • 다만 팀 규칙상 자동 stage를 싫어하는 경우도 있으니, 처음에는 enabled만 켜고 적응한 뒤 켜도 됩니다.

2) 특정 레포에서만 켜기

git config rerere.enabled true
git config rerere.autoupdate true

레포 단위 설정은 .git/config에 저장됩니다.

rerere 기록은 어디에 저장되나

기록은 기본적으로 .git/rr-cache/ 아래에 저장됩니다.

  • 이 디렉터리는 기본적으로 버전 관리 대상이 아닙니다.
  • 즉, 개인 PC에서 학습한 충돌 해결 기록이 다른 사람에게 자동 공유되지는 않습니다.

여기서 중요한 포인트는 “기록이 로컬에만 존재한다는 점이 오히려 안전장치가 된다”는 것입니다. 잘못된 해결을 팀 전체에 전파할 위험이 줄어듭니다.

rebase 실전 워크플로: rerere로 반복 충돌 제거하기

아래는 rerere가 가장 빛나는 전형적인 흐름입니다.

시나리오

  • main에서 계속 변경이 들어오는 동안, feature/long-lived 브랜치에서 공통 파일을 수정 중
  • rebase를 주기적으로 하며 최신 main을 따라가고 싶음

1) rebase 수행

git checkout feature/long-lived
git fetch origin
git rebase origin/main

충돌이 발생하면 평소처럼 해결합니다.

2) 충돌 해결 후 stage 및 계속 진행

# 충돌 파일 편집 후

git add path/to/conflicted-file
git rebase --continue

이때 rerere가 켜져 있으면, Git이 “충돌 전 상태”와 “내가 만든 해결 결과”를 세트로 기록합니다.

3) 다음 rebase에서 자동 해결 확인

며칠 뒤 다시 rebase를 하면, 동일한 충돌이 발생하는 순간 Git이 다음과 같은 메시지를 출력하는 것을 볼 수 있습니다.

  • 예: Resolved '파일경로' using previous resolution. 같은 형태

그리고 충돌이 줄거나, 어떤 충돌은 아예 수동 편집 없이 지나갑니다.

rerere가 잘 먹히는 충돌/안 먹히는 충돌

잘 먹히는 경우

  • 같은 파일에서 비슷한 라인 범위 충돌이 반복
  • 포맷팅/정렬/리네이밍 등으로 인해 충돌 패턴이 유사하게 재발
  • 장수 브랜치에서 주기적으로 main을 따라가는 구조

덜 먹히는 경우

  • 충돌은 같은 파일에서 나지만 매번 맥락이 크게 달라짐(근본 로직이 계속 바뀜)
  • 대규모 리팩터로 인해 충돌 베이스 자체가 달라져 유사도를 찾기 어려움

그럼에도 “반복 충돌이 1개라도 줄어드는 순간”부터 이득이 누적됩니다.

rerere 기록 확인과 디버깅

rerere 상태 확인

git config --get rerere.enabled
git config --get rerere.autoupdate

rerere가 적용 가능한지 수동으로 재시도

rebasemerge 도중에 기록 적용을 다시 시도하고 싶다면 아래가 유용합니다.

git rerere
  • 이미 충돌이 난 상태에서 git rerere를 실행하면, 적용 가능한 기록을 찾아 반영합니다.

어떤 파일이 rerere 대상인지 확인

git rerere status

기록 정리

오래된/불필요한 기록을 정리하려면:

git rerere gc

주의사항: 자동 해결은 “정답”이 아니다

rerere는 반복 작업을 줄여주지만, 자동으로 적용된 결과가 항상 비즈니스 로직의 정답은 아닙니다.

권장 습관:

  • 자동 해결이 적용된 커밋 구간에서는 테스트를 더 신뢰할 것
  • 특히 설정 파일, 권한/보안 관련 코드, 마이그레이션 스크립트는 자동 해결 후 반드시 리뷰할 것

이건 운영 장애 트러블슈팅과 비슷합니다. 예를 들어 네트워크/인프라 이슈에서 “증상이 사라졌다”가 “원인이 해결됐다”를 보장하지 않듯, 자동 머지도 “충돌이 사라졌다”가 “의도가 보존됐다”를 보장하지 않습니다. 장애 관점의 점검 루틴은 아래 글들도 참고할 만합니다.

팀에서 rerere를 더 잘 쓰는 운영 팁

1) 리베이스 정책과 함께 쓰면 효과가 커진다

  • “작게 자주 리베이스”할수록 충돌이 작은 단위로 쪼개지고, rerere가 기록을 재사용하기 쉬워집니다.
  • 반대로 한 달에 한 번 몰아서 리베이스하면 충돌이 거대해지고, 해결 패턴이 매번 달라져 재사용률이 떨어집니다.

2) 장수 브랜치는 가능하면 줄이고, 불가피하면 rerere를 기본 장착한다

  • 장수 브랜치는 충돌의 빈도와 반복성을 동시에 높입니다.
  • 조직 문화상 장수 브랜치가 필요하다면, rerere는 사실상 필수 도구에 가깝습니다.

3) CI를 “자동 해결 검증 장치”로 삼는다

  • rerere가 자동으로 충돌을 풀어도, 테스트가 실패하면 그 해결은 잘못된 것입니다.
  • 특히 타입체크, 린트, 통합 테스트를 rebase 후에 빠르게 돌릴 수 있는 구조가 중요합니다.

CI/배포 자동화 쪽은 GitHub Actions 권한/인증 문제에서 자주 막히는데, 관련해서는 아래 글이 도움이 됩니다.

자주 쓰는 rebase 충돌 해결 명령 모음

실전에서 rerere와 함께 가장 많이 쓰는 조합입니다.

# 1) rebase 시작
git fetch origin
git rebase origin/main

# 2) 충돌 확인
git status

# 3) rerere로 기록 적용 재시도(필요 시)
git rerere

# 4) 해결 후 stage
git add -A

# 5) 계속 진행
git rebase --continue

# 6) 중단하고 원복(너무 꼬였을 때)
git rebase --abort

결론: rerere는 “충돌 해결을 자산화”한다

rerere의 핵심 가치는 충돌 해결을 일회성 노동에서 재사용 가능한 자산으로 바꾸는 데 있습니다. 특히 rebase를 자주 하는 팀/프로젝트일수록 효과가 가파르게 커집니다.

  • 개인은 git config --global rerere.enabled true만으로 바로 체감 가능
  • 반복 충돌이 많은 레포에서는 rerere.autoupdate까지 켜서 흐름을 더 매끄럽게
  • 자동 해결을 맹신하지 말고 테스트/리뷰로 의도를 검증

한 번만 제대로 세팅해두면, 앞으로의 리베이스 경험이 확실히 달라집니다.