← 전체 글로 돌아가기

Git

git rebase를 쓰기 전에 챙기는 것들

rebase는 커밋 히스토리를 깔끔하게 만들어주지만, 공유 브랜치에서 잘못 쓰면 협업이 복잡해진다. 내가 정한 기준을 정리했다.

git rebase를 처음 쓸 때 가장 겁나는 건 "history를 다시 쓴다"는 말이다. 실제로 잘못 쓰면 팀원이 push를 못 하거나 커밋이 꼬이는 상황이 생긴다. 쓰기 전에 확인하는 기준 몇 가지를 정리해봤다.

혼자 쓰는 브랜치인지 확인한다

rebase의 핵심 위험은 공유 브랜치에서 history를 재작성하면 다른 사람의 작업 기반이 달라진다는 것이다.

git log --oneline origin/feature/my-branch..HEAD

로컬에만 있는 커밋이라면 rebase를 해도 다른 사람에게 영향이 없다. 이미 push한 커밋을 rebase하면 force push가 필요하고, 그 시점에 다른 사람이 같은 브랜치를 체크아웃하고 있으면 문제가 생긴다.

main이나 develop 같은 공유 브랜치에는 rebase를 직접 하지 않는다.

현재 상태를 저장해둔다

rebase 중에 conflict가 많이 나거나 실수했을 때 돌아가기 위해 현재 커밋을 기록해둔다.

git tag backup-before-rebase

rebase가 꼬이면:

git rebase --abort          # rebase 진행 중일 때
git reset --hard backup-before-rebase  # 태그로 되돌리기

interactive rebase로 커밋 정리

PR 올리기 전에 WIP 커밋이나 오타 수정 커밋을 하나로 합치고 싶을 때 interactive rebase를 쓴다.

git rebase -i HEAD~3

에디터가 열리면 합칠 커밋을 s(squash)로 바꾼다.

pick abc1234 feat: add user filter
s   def5678 fix typo
s   ghi9012 wip: progress

squash는 커밋 메시지를 하나로 합친다. fixup을 쓰면 메시지 없이 바로 합친다. 결과적으로 깔끔한 커밋 하나가 남는다.

upstream 변경을 가져올 때

feature 브랜치에서 작업하는 동안 main에 새 커밋이 생겼을 때, merge 대신 rebase를 쓰면 히스토리가 선형으로 유지된다.

git fetch origin
git rebase origin/main

conflict가 나면 파일을 수정하고 git add한 뒤 git rebase --continue로 진행한다. 같은 파일이 여러 커밋에서 충돌나면 반복해서 해결해야 한다. 복잡해지면 git rebase --abort로 돌아가서 merge를 쓰는 게 나은 선택일 수 있다.