728x90

평소 git branch, checkout, add, commit, pull, push, reset, rebase, merge, stash 와 git IDE으로 부족함 없이 git을 사용하여 왔기 때문인지 git 명령어에 대한 공부가 게을러졌다.

저 위의 명령어들외에 그나마 빈번히 쓰였던 cherry-pick에 대해 알아보고 어떤 상황에서 사용하는지 어떻게 사용하는지 알아보자.

 

cherry-pick이란

cherry-pick이란 다른 브랜치 위에 있는 커밋을 선택적으로 내 브랜치에 적용시킬 때 사용하는 명령어이다.

 

좀더 쉽게 그림으로 설명하자면

다음과 같이 commit 상황을 가지는 Master 브랜치와 Feature 브랜치가 있다. 

 a - b - c - d   Master
         \
           e - f - g Feature

Master 브랜치에 Feature의 e와 g를 뺀 f 커밋만 merge 하고 싶다.

이 경우 cherry-pick을 사용하지 않고 f 커밋만 merge 할 수 있을까?

1. git checkout Feature; git rebase master; git checkout master; // 사전 rebase 처리

2. git merge Feature //master에 Feature branch 가져오기

a - b - c - d - e - f - g   Master
         \
           e - f - g Feature


3. git reset --hard f //master g commit 삭제

a - b - c - d - e - f   Master
         \
           e - f - g Feature


4. git reset --soft e //master f commit 해제 및 코드변화 가져오기

a - b - c - d - e   Master (staged: f code changes)
         \
           e - f - g Feature


5. git stash //master f 코드변화 따로 저장 및 보호

a - b - c - d - e   Master (git stash list: f code changes)
         \
           e - f - g Feature


6. git reset --hard d //master e commit 삭제

a - b - c - d   Master (git stash list: f code changes)
         \
           e - f - g Feature


7. git stash pop //master f 코드변화 불러오기

a - b - c - d   Master (staged: f code changes)
         \
           e - f - g Feature


8. git commit f 

a - b - c - d - f   Master (staged: f code changes)
         \
           e - f - g Feature

최소 총 8번씩이나 git 명령어를 입력해야 이를 해결 할 수 있다. 이를 cherr-pick 을 사용한다면 단 한번의 명령어로 원하는 커밋을 merge 할 수 잇다.

1. git checkout master

2. git cherry-pick 76ae30ef // 76ae30ef: Feature f commit의 id

다른 브랜치의 커밋을 그대로 가져온다는 점에서 rebase와 개념적으로 겹치는 부분이 있다. 그래서 rebase를 사용할 줄 안다면 더욱이 cherry-pick이 없는 불편함을 크게 느끼지는 못했을 수 있다.

하지만 프로젝트 규모가 크고 많은 사람들이 코드를 수정하여 변화가 빈번하다면 rebase만으로는 한계가 있을 수 있다. cherry-pick을 기억해두도록 하자.

 

cherry-pick 필요한 상황 및 사용 이유

그럼 cherry-pick을 어떤 경우에 사용하게 될까?

기본적으로 수정해야 할 commit이 다른 commit들 사이에 껴있는 경우와 같이 수정 시 많은 reset을 필요로 할 때 cherry-pick이 빛을 발한다.

  1. 커밋을 다른 브랜치에 잘 못했을 때 이를 뒤늦게 찾은 경우
  2. 요구사항이 바뀌어 필요없는 커밋이 생겼을 경우
    • 해당 커밋들을 빼고 cherry-pick
  3. 수정사항이 생겨 두개의 브랜치에 동시 commit 해야할 경우
    • 어느 한 브랜치에 커밋 후 다른 브랜치에서 cherry-pick
  4. 코드 의존성 때문에 다른 사람의 커밋 중 일부를 가져와야 할 경우

'Git' 카테고리의 다른 글

version tag 원칙  (0) 2021.03.28
git으로 프로젝트 관리하는 방법 - Issue 관리  (0) 2021.01.09

+ Recent posts