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이 빛을 발한다.
- 커밋을 다른 브랜치에 잘 못했을 때 이를 뒤늦게 찾은 경우
- 요구사항이 바뀌어 필요없는 커밋이 생겼을 경우
- 해당 커밋들을 빼고 cherry-pick
- 수정사항이 생겨 두개의 브랜치에 동시 commit 해야할 경우
- 어느 한 브랜치에 커밋 후 다른 브랜치에서 cherry-pick
- 코드 의존성 때문에 다른 사람의 커밋 중 일부를 가져와야 할 경우
'Git' 카테고리의 다른 글
version tag 원칙 (0) | 2021.03.28 |
---|---|
git으로 프로젝트 관리하는 방법 - Issue 관리 (0) | 2021.01.09 |