본문 바로가기
GIT

[GIT] git cherry-pick

by 무사뎀벨레 2022. 7. 7.

 

 

 

 

git cherry-pick이란 무엇일까요? 

git을 이용해 코드관리를 하다 보면
다른 브랜치의 특정 커밋을 가져와야 할 경우가 종종 생기는데,

이때 git cherry-pick 명령어를 사용할 수 있습니다.

 

 

 

 

 

 

 

git cherry-pick 이란?


 

cherry-pick체리 한 바구니에서 제일 좋은 체리만 고르는 것에서 유래된  표현이라고 알려져 있습니다.

이 표현에 빗대어 git cherry-pick 명령어를 통하여 특정한 한 커밋을 현재 HEAD가 가르기는 브랜치에 추가할 수 있습니다.

 

git cherry-pick명령어를 사용할 경우, 특정한 한 커밋을 옮기는 것이 아닌 새로운 커밋이 추가됩니다.

즉, 특정한 커밋은 그대로 있고 커밋에 종속된 변경사항과 그에 따른 커밋 메시지가 현재 HEAD가 위치한 브랜치에 추가가 됩니다.

그렇기 때문에 기존의 커밋과 cherry-pick을 하여 가져온 커밋 hash는 다릅니다.

 

 

 

 

 

 

 

 

사용 방법


 

$ git cherry-pick <커밋hash>

위 문법과 같이 git cherry-pick 다음 커밋 hash를 입력하여 사용할 수 있습니다.

 

$ git cherry-pick <커밋hash1> <커밋hash2> <커밋hash3>

위와 같이 여러 개의 커밋을 나열하는 것도 가능합니다.

 

$ git cherry-pick <커밋hash1>..<커밋hash5>

또한 가져오고 싶은 첫 번째 커밋마지막 커밋 사이에 .. 으로 연결한다면, 첫번째 커밋은 제외되고 그다음 커밋부터 마지막까지의 커밋을 가져오게 됩니다.

 

위 이미지와 같이 브랜치Y에는 76ae30ef커밋과 13af32cc, a0ee45lc 커밋이 존재합니다.

 

# 커밋당 한번씩
$ git cherry-pick 76ae30ef
$ git cherry-pick 13af32cc

#혹은 두 커밋을 한번에
$ git cherry-pick 76ae30ef 13af32cc

 

위와 같은 명령어를 실행한다면, 아래 이미지와 같이 브랜치X에 76ae30ef, 13af32cc 커밋이 체리픽되어 위치할 것입니다.

 

하지만, 체리픽을 하는 과정에서 겹치는 내용이 있으면 아래와 같이 conflict가 발생할수 있습니다. 이럴 경우 수정 후 새로 커밋하는 작업이 필요합니다.

You are currently cherry-picking commit 8ead2de
        (fix conflicts and run "git cherry-pick --continue")
        (use "git cherry-pick --abort" to cancel the cherry-pick operation)

 

 

 

 

 

 

 

 

git cherry-pick -continue 혹은 git cherry-pick -abort


위에서 언급한 것과 같이 체리픽을 하려는 과정에서 conflict가 발생할 수 있습니다. 그런 경우 두 가지 옵션을 사용할 수 있습니다.

 

-continue
conflict를 해결한 뒤 체리픽을 진행시킬 경우에 사용합니다.

1. conflict 해결을 위해 코드를 수정합니다.

2. git add <파일 경로> 명령어를 통해 수정된 코드를 올립니다.

3. git cherry-pick -continue 명령어를 사용하여 체리픽을 다시 진행합니다.

 

-abort
체리픽을 중단할 경우 사용합니다.

1. git cherry-pick -abort 명령어를 통하여 체리픽을 중단합니다. 체리픽을 중단하게되면, 체리픽 하기 이전의 상태로 돌아갈 수 있습니다.

 

 

 

 

 

 

 

 

git cherry-pick merge


git cherry-pick merge명령어를 통하여 merge커밋을 체리픽 할 수 있습니다. 사용법은 아래와 같습니다.

$ git cherry-pick -m 1 <merge커밋 해시>

 

 

 

 

 

 

git cherry-pick의 기타 옵션


-e, –edit

commit 하기 전에 커밋 메시지를 수정할 수 있습니다.


-x

커밋을 기록할 때, 원래 커밋의 커밋 메시지를 기록할 수 있습니다. (“cherry picked from commit XXX” 같은..)
conflict 없는 커밋에만 적용됩니다.


-r

위의 -x가 default라면, -r은 -x를 disable 하는 것입니다.


-m parent-number, –mainline parent-number

merge commit에는 종종 체리픽을 못하는데, merge 커밋의 메인라인의 부모가 무엇인지 모르기 때문입니다.
이 옵션은 merge commit의 부모를 특정 지어 줍니다.(1번부터 시작)


-n, –no-commit

이 옵션은 체리픽으로 변경된 내용을 커밋을 하지 않습니다.


-s, –signoff

커밋 메시지 끝에 signed-off-by line을 추가합니다.


–ff

현재 HEAD가 cherry-pick으로 골라진 커밋의 부모와 동일하다면 fast-forward 합니다.

반응형

댓글