23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Git repository에 깔끔한 commit 이력을 남기는 것은 중요하다.
논리적인 작업 단위로 깔끔하게 정리된 commit 이력은 코드 히스토리를 파악하기 쉽게 해주고, 코드 변경 사항을 되돌리고 싶은 경우에도 변경할 시점을 찾기 쉽게 해준다.
하지만 이미 commit을 했음에도 불구하고 사소한 오타나 버그가 발견되어 commit을 다시 하게 되는 경우가 있다.
지저분하게 남아 버린 commit 내역들이 있으면 히스토리가 난잡해지고, 코드 이력을 확인할 때의 직관성이 떨어지게 된다.
이럴 때 유용한 해결책이 squash를 이용하는 것이다.
Squash는 '짓누르다'라는 의미인데, git에서의 squash는 여러 개의 commit들을 하나의 commit으로 짓눌러서 합치는 기법이다.
이 기능은 불필요하게 작은 단위로 나뉘어진 commit들을 의미 있는 변경 사항을 담은 commit으로 압축할 수 있게 해준다.
Local repository에서 작업 중에 자주 commit을 하더라도, remote repository에 push 하거나 pull request를 날리는 등 중요한 작업 전에 squash로 불필요한 commit들을 정리해 주면 깔끔하게 remote repository를 관리할 수 있다.
그렇다면 이제 예제와 함께 squash의 사용법에 대해 알아보자.
hello, world! 를 출력하는 bash 스크립트를 다섯 차례로 나누어 commit 한 예시이다.
먼저, git log 명령으로 commit 내역을 확인하고 squash할 commit을 선정한다.
두 번째 "hello" commit과 세 번째 ", " commit을 합치고
네 번째 "world" commit과 다섯 번째 "!" commit을 합쳐보자.
git rebase -i HEAD~4 명령어로 최근 4개의 commit 을 대상으로 interactive rebase를 시작한다.
수정하려는 commit들은 전부 포함되어야 하지만, 그 이상을 대상으로 해도 무방하다.
다음과 같이 interactive rebase 세션이 열린다.
참고로 최초의 commit을 포함하고 싶다면 git rebase -i HEAD~5 명령어가 아닌, git rebase -i --root를 사용해야 한다.
편집기에 보이는 commit 목록에서 squash할 commit을 pick에서 squash 혹은 s로 변경한다.
이때 squash 혹은 s로 설정한 commit들이 가장 가까운 과거의 commit에 합쳐진다.
이 경우에 ", " commit은 "hello" commit에 합쳐지고, "!" commit은 "world" commit에 합쳐진다.
만약 ", " commit, "world" commit, "!" commit 을 squash로 설정하였다면 이들 세 commit이 "hello" commit에 합쳐진다.
squash할 commit들을 표시하였다면 :wq를 입력하여 편집기를 닫는다.
이제 commit message를 수정할 수 있는 창이 나온다.
원하는 내용으로 수정하고 :wq로 저장 후 닫아준다.
", " commit을 "hello" commit에 합치고, "!" commit을 "world" commit에 합치는 두 가지 squash를 동시에 실행했기 때문에 다음 squash에 관한 message 수정 창도 나오게 된다.
마찬가지로 원하는 내용으로 수정하고 :wq를 입력하여 저장 후 닫아준다.
Interactive rebase를 종료하면 아래와 같이 수정한 message를 확인할 수 있다.
git log 명령어로도 확인해보자.
Date 란을 보면 squash한 commit들이 가장 가까운 과거의 commit에 합쳐졌음을 알 수 있다.
Remote repository에 이미 push가 된 commit에 squash를 수행한 경우에, 이를 remote repository에 반영하려면 --force 옵션을 붙여 강제로 push 해주어야 한다.
Local repository에서는 작은 작업 단위로 commit을 하더라도 remote repository에 push하기 전에는 squash를 수행하여 깔끔한 이력을 남기는 것이 좋다.
만약 원격 저장소에 이미 push된 commit을 변경하는 상황이라면, 원격 저장소를 사용하는 개발자들 간에 반드시 미리 소통한 후 squash를 수행하자.
Squash를 하기 전에는 혹시 모를 실수를 방지하기 위해 branch를 생성하여 backup 해두는 것도 좋다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.