노트

인터랙티브 리베이스로 커밋 정리

Interactive Rebase

인프라#git · 연결된 개념 5개

쉽게 말하면

인터랙티브 리베이스는 원고를 편집자에게 넘기기 전의 퇴고 시간이에요. 장 순서를 바꾸고 자잘한 수정 쪽지를 본문에 합치고 제목을 다듬듯, 작업 중 생긴 지저분한 커밋을 읽기 좋은 단위로 정리해요.

비유가 깨지는 곳 원고와 달리 이미 남에게 나간 커밋을 고치면 히스토리가 바뀌어 강제 푸시가 필요해요. 그래서 혼자 쓰는 브랜치에서만 하고, --force-with-lease로 그사이 남이 올린 커밋을 덮지 않게 해요.

git rebase -i는 최근 커밋 목록을 편집기로 열어 순서를 바꾸고, 합치고, 메시지를 고치게 해 주는 명령이다. 리뷰 전에 "작업하면서 생긴 지저분한 커밋"을 읽기 좋은 단위로 다듬을 때 쓴다.

git rebase -i HEAD~3
# pick a1b2c3 결제 API 추가
# fixup d4e5f6 오타 수정
# reword 789abc 테스트 추가
  • squash: 앞 커밋과 합치고 두 메시지를 모아 다시 쓴다
  • fixup: 앞 커밋과 합치고 이 커밋의 메시지는 버린다
  • reword: 내용은 두고 메시지만 고친다. edit는 그 커밋에서 멈춰 내용을 고치게 한다
  • git commit --fixup <해시> 후 git rebase -i --autosquash를 쓰면 fixup 줄이 자동으로 배치된다

이미 푸시한 커밋을 정리했다면

히스토리가 바뀌었으므로 강제 푸시(force push)가 필요하다. 이때 --force 대신 --force-with-lease를 쓰면 그사이 남이 올린 커밋을 덮어쓰지 않는다. 다만 혼자 쓰는 브랜치에서만 하고, 공유 브랜치는 리베이스하지 않는다는 원칙이 우선이다.

잘못 합쳤다면 reflog로 날린 커밋 되살리기로 리베이스 이전 상태로 돌아갈 수 있다. 커밋을 어떤 단위로 남길지는 커밋 메시지와 원자적 커밋에서 다룬다.

출처: git-rebase 문서: Interactive mode · git-push --force-with-lease

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • git reset (soft·mixed·hard)

    git reset <커밋>은 현재 브랜치가 가리키는 커밋(HEAD)을 옮기는 명령이다. 옵션에 따라 스테이징 영역(staging area, index)과 작업 디렉터리(working directory)까지 함께 되돌릴지가 달라진다.

  • 여러 저장소 합치기

    따로 관리하던 Git 저장소를 하나로 합칠 때, 히스토리를 버리지 않고 옮기는 방법이 두 가지 있다. 저장소 루트끼리 그대로 합치거나(unrelated histories 머지), 한쪽을 다른 쪽의 하위 폴더로 넣는다(subtree). 모노레포로 옮길 때 자주 쓴다.

  • GitOps

    GitOps는 "환경이 어떤 상태여야 하는가"를 전부 git 저장소에 선언해 두고, git에 적힌 것을 유일한 진실(single source of truth)로 삼아 실제 환경을 맞추는 운영 방식이다. 서버에 직접 손대지 않고, 바꾸고 싶으면 git을 고친다.

  • kubectl 디버깅 치트시트

    kubectl은 쿠버네티스 클러스터를 조회·조작하는 CLI(Command-Line Interface)다. 앱 개발자가 가장 자주 쓰는 건 "내 Pod가 떠 있나, 왜 죽었나"를 확인하는 명령들이다.

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

보기 옵션