IntelliJ 인텔리제이 - Git commit squash (Interactively Rebase)

Git 을 이용해서 진행하는 개발 업무를 하다보면, 급한 이슈로 인해서 현재 작업하던 것을 제쳐두고 해당 이슈를 처리해야 할 일이 있다.
그러면 해당 작업을 불가피하게 commit 혹은 stash 를 이용하여 현재까지 작업한 상태를 보존해야 한다.

여담으로, 개인적으로 stash 를 상당히 비추한다.
그 이유는, commit 이 안된 stash 의 경우 실수로 날려버리면 복구가 불가능하다.
실제로 업무를 하다가 실수로 기존 stash 를 clear 해버려서 하루종일 작업한게 날아갈 뻔해서 진땀을 한바가지 흘린 적이 있다. 다행히도 commit 을 했어서, commit hash 를 통해서 복구를 했었다.
따라서 stash 보단 commit 을 자주하여, squash 를 애용하겠다고 생각했다.

다시 돌아와서 얘기하자면, 급한 이슈가 자주 발생하면 할수록, 도중에 흐름이 끊겨서 설계한 대로 commit 단위를 쪼개기가 어려워지고 의미있는 commit message 작성이 어려워진다. 따라서 commit 단위를 관리하기 위해서 squash 를 통해 commit 메세지를 관리하는 방법을 블로깅 해보려고 한다.

단적인 예로 아래와 같이 Pageable 이라는 feature 에 대해서 3가지로 나눠졌다.
해당 예제는 여러사람들과 같이 협업이 아니라 혼자 진행하고 있는 사이드 프로젝트라서 브랜치가 하나이다.
또한 전제로 이 기능은 매우 간단하며, 하나의 commit 으로 관리되는것이 더 효율적이라고 판단된 사항이다.
따라서 3개의 commit 을 하나로 통합하는 예제이다.


그렇다면 이제 진행해 보자.
아래와 같이 commit 내역에 오른쪽 클릭을 하고, interactively rebase from here.. 를 선택한다.

아래와 같이 하나의 commit 내역만 대상에 뜬다.


따라서 HEAD~3 을 합치고 싶은경우, HEAD~3 의 commit 을 다시 오른쪽 클릭하고 동일하게 진행해준다.



아래와 같이 HEAD~3 commit 들이 선택되었다.


자 이제 하나의 commit 으로 합쳐보자.
아래와 같이 reword, squash, fixup, drop 이 지원된다.
reword 는 단지 commit message 만 변경하고 싶은 경우,
squash, 와 fixup 은 동일하게 이전 커밋과 합칠 때 사용한다.
squash 와 fixup 의 차이는 squash 는 commit message 도 합쳐지지만,
fixup은 이전 commit message 에 흡수되는 형식이다.
그리고 drop 은 말 그대로 해당 commit 을 없앤다.

원래 하기로 했던 3개의 commit 을 squash 해보자.
first-step, second-step 과 complete 3가지 commit 을 complete 로 아래와 같이 squash 하고
메세지도 변경했다.


아래와 같이 하나의 커밋으로 합쳐졌다.


인텔리제이 및 다른 클라이언트 툴 대신
CLI 를 이용해서 시도해보고 추후에 블로깅을 해보도록 하겠다.

댓글

이 블로그의 인기 게시물

About Kafka Basic

About JVM Warm up

About idempotent

About G1 GC

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

sneak peek jitpack

Optimistic Concurrency Control VS Pessimistic Concurrency Control - What should i choose?

DDD(Domain Driven Design) - Aggregate (어그리게잇)

Strategy Pattern In Spring (feat. JPA)