본문 바로가기

Git

git squash & cherrypick

Git Squash (vscode로 쉽게 squash 진행해보기)

 

환경

vscode

extension : git graph, git Lens

 

 

 

작업을 하다보면 커밋 기록이 너무 더러워지거나 여러개의 기록을 하나로 합치고 싶은 경우가 생긴다.

 

 

그럴땐, git sqush 를 이용하여 커밋 기록을 합칠 수 있다.

 

git rebase -i HEAD~3   # 최근 3개의 커밋을 대상으로 대화형 리베이스 실행

 

 

실습을 통해 자세히 알아보자.

 

 

우리의 목표는 최근 3개의 커밋을 하나로 합치는 것이다!

 

 

 

git graph가 다음과 같은 경우를 생각해보자.

 

git graph(flow)

 

 

 

 

 

 

우선, ctrl + shift + p를 누른다음, GitLens의 Interactive Rebase Editor기능을 활성화 시켜주자.                                         `

 

 

 

 

 

 

 

 

해당 명령어를 입력하게 되면, GitLens를 설치한 경우에는, 다음과 같은 화면이 나타난다!

 

직관적인 UI를 가진 Ineractive Rebase Editor

 

 

 

 

전체 commit을 확인하고 싶다면

git rebase -i

 

 

 

 

 

만약, Interactive Rebase Editor가 나타나지 않는다면, 다음과 같은 명령어를 실행시키자.

 

git config --global core.editor "code --wait"

 

 

 

 

pick 을 sqaush로 선택하고, editor 우측 하단의 start rebase를 누르면 커밋 메시지를 입력하는 vscode에 새로운 탭이 생성된다.

 

커밋 메시지를 작성하고, 저장하면 끝!

 

 

최근3개의 커밋을 squash한 상태

 

 

 

 

 

squash한 커밋 내역을 보면 다음과 같이 여러개의 커밋이 하나의 커밋으로 합쳐진 것을 확인할 수 있다.

 

 

 


 

응용 - 원격 저장소에 push된 커밋 squash 하기 (커밋 기록 정리하기)

 

 

사실, squash 라는 것이 원격 저장소에 push되기 전에 이루어져야 하는 작업이다.

 

 

 

과거의 커밋 기록이 변경되는 것이기 때문에, 한 브랜치에서 여러명이 작업하는 경우에 문제가 발생할 수 있기 때문이다.

 

 

 

하지만, 혼자 작업하고 일부 상황에선  원격 저장소에 push된 커밋 기록을 정리해야할 상황이 있을 수 있다.

 

 

 

방법은 다음과 같다.

 

1. 로컬에서 squash 진행하여 커밋 기록 정리

  • squash를 진행하여 하나의 커밋으로 만들고, commit undo를 진행한다.
  • 합쳐진 커밋 내역들의 변경사항이 commit 되기 전의 상태로 돌아간다. (스테이징)
  • 기능 별, 원하는 단위 별로 커밋을 나누어 진행한다.

 

2. 원격 브랜치 날리기 (굉장히 위험함)

 

 

3. 로컬의 커밋 내역으로 원격 저장소에 새롭게 브랜치 발행하기

 

 


 

브랜치를 날리기 싫다면 강제 푸시를 해도 된다.

 

 

 

결국 핵심은, 로컬 저장소의 commit 기록을 강제로 원격 저장소에 덮어 씌운다는 점이다.

 

 

따라서 이 방법은 혼자 브랜치에서 작업하는 경우에만 권장된다.

 

 

 

예를들어, test 브랜치를 만들고 작업을 하면서, 이런 방법으로 더러워진 커밋 기록을 정리하고, 나중에 MR(PR)을 하는 방법으로 활용할 수 있겠다.

 

 

 

글쓴이의 경우에도 ArgoCD에 배포된 Application의 변경사항을 테스트하기 위해선 push(원격 저장소의 상태 변경)이 필요하기 때문에, 테스트를 위해서 많은 push를 할 수 밖에 없었다.

 

 

그래서, 원하는 목표를 달성 후에, 이러한 방법을 통해 커밋 기록을 깔끔하게 정리 후에 MR을 하고있다.

 


cherry-pick

 

다른 브랜치의 커밋을 현재 브랜치에 적용하는 것

 

= 커밋에서 변경된 파일만 적용이 되는 것 

 

 

 

방법은 간단하다.

 

 

 

1. cherry-pick할 커밋의 해시를 확인

git cherry-pick <커밋해시>

 

커밋 메시지는 cherry-pick한 커밋 메시지와 동일하다.

 

 

 

 

만약, 커밋 메시지를 바꾸고 싶다면,

 

1. git cherry-pick --no-commit <커밋해시>
2. git commit -m "새로운 메시지"

 

 

 

git도 아직 갈길이 멀다...

 

파이팅