개발 상식

[개발 상식] git 불필요한 커밋을 합치는 방법. Rebase

kku_lurgi 2023. 10. 29. 15:19

이번 시간에는 git에서 과거 커밋을 없애기 위해 합치는 방법을 알려드리고자 합니다!

개발을 하고 커밋, 푸쉬를 하다보면 다음과 같은 상황이 많이 발생하기 마련입니다.

feat : #3 커밋을 푸쉬하자 마자, 잘못된 부분을 인지하고 바로 수정 후 fix 커밋을 날렸습니다. 이런 상황이라면 커밋이 2개가 되겠죠? 사실상 불필요한 커밋이라는 것!

이번 시간에는 위와 같은 상황을 git의 rebase라는 기능을 이용하여 커밋을 합쳐보고자 합니다!

저는 VSC를 사용하여 rebase기능을 공부하고자 합니다. 이를 기준으로 설명드릴게요!

1. Git 대화형 리베이스 실행

일단 처음으로 실행해야 하는 것은 대화형 리베이스를 실행하는 것입니

git rebase -i HEAD~(원하는 커밋의 갯수)

여기서 주목할 점은 ~(Tilde) 입니다. ~ 기호는 뒤에 붙은 숫자만큼의 커밋을 가리키는 것입니다. 예를 들면 HEAE~7 이것은 HEAD지점에서 7개의 커밋을 가리키는 것이죠!

^(Caret) 기호가 있습니다. 이는 바로전을 의미하는데요. 예를 든다면 HEAD^ 이것은 바로 이전의 커밋을 가리키는 것이고, HEAD^^^ 이것은 HEAD바로 이전 3개의 커밋을 가리키는 것입니다!

위의 사진 예시에서는 fix (#3) : fix 커밋과 feat : #3 커밋을 합치기 위해서 이 두개의 커밋을 가리키면 되므로

git rebase -i HEAD~2
혹은
git rebase -i HEAD^^

코드로 대화형 리베이스를 실행할 수 있겠네요!

2. Squash를 이용하여 합치기

Git의 대화형 리베이스를 실행하게 된다면 다음 화면이 나타나게 됩니다.

다.

정상적으로 2개의 커밋을 가져온 것을 확인할 수 있는데, 여기서 없애고 싶은 커밋의  pick  s  혹은  squash 로 변경해줍니다.

이후 창을 닫게되면 rebase가 이루어지게 되는데요

윗 부분은 제목으로 설정된 커밋의 제목이 새로 합쳐지는 커밋의 제목이됩니다

아랫 부분은 설명으로 커밋의 설명 부분에 들어가는 내용이 됩니다.

이 창 역시 닫게 되면 rebase된 커밋이 이루어 지게 됩니다.

3. 강제로 푸시하기

커밋이 완료되었으니, 원하는 브랜치에 푸시를 진행해 주면 됩니다.

하지만 이 상황에서 일반적인 푸시를 하게 될 경우 정상적으로 작동되지 않는데요. Git에서 혹시 모를 잘못된 푸시를 방지하기 위한 기능이라고 생각됩니다.

그러니 강제로 푸시를 진행해 주어야 하는데요. 다음과 같습니다

git push origin master -f

뒤에 -f를 붙여 강제적으로 푸시를 진행하게 된다면 커밋 합치기가 완료됩니다!

이렇게 feat : #3 커밋에 합쳐지게 된 것을 볼 수 있습니다.

그리고 오른쪽에 커밋 해시를 보시다면, 기존의 커밋에 합쳐진 것이 아니라, 두 개의 커밋을 합쳐 새로운 커밋으로 만들었다는 사실 역시 확인할 수 있습니다!

더 나아간다면 이러한 상황역시 rebase를 통해 커밋을 합칠 수 있는데요.

이미 HEAD가 합쳐지는 커밋이 아닌 상황에서의 reabase역시 위와 같은 방법으로 진행할 수 있습니다!

이런 식으로 진행하기 된다면 fix(#4) : fix 커밋이 feat : #4로 합쳐지게 되는데요, 이는 Squash 기능 자체가 이전 커밋과 합치는 기능이기 때문에 그렇습니다!

😊결론!

rebase를 통해 깔끔한 커밋을 할 수 있다는 것을 배웠습니다! 팀 프로젝트 활동에서 불필요한 커밋을 제거하고 동료들이 보기 쉽게 깔끔한 커밋을 함으로써 유지보수의 비용을 줄여나가는 방법을 배운 것 같습니다.