git cherry-pick

phantom0308
5 min readMar 18, 2020

--

git을 이용하여 코드 형상 관리를 하다보면 몇몇 코드만 커밋하여, 다시 올려야하는 경우, 요구사항이 바뀌어 필요 없는 커밋이 생기거나, 커밋을 다른 branch에 잘못 하거나, 코드 의존성(dependency) 때문에 다른 사람의 커밋 중 일부를 가져와야 하는 경우가 종종 생긴다. 그런 경우 git cherry-pick을 많이 사용한다.(※git rebase 와 차이점 확인 필요)

git cherry-pick이 외에도 git rebase 명령어로 원하는 커밋을 선택적으로 적용할 수 있지만, git rebase는 현재 branch (체크아웃한 branch)에서만 가능하므로, 다른 branch에서 commit을 가져오고 싶다면 먼저 그 branch를 현재 branch로 merge한 후 rebase해야 하는 번거로움이 있다.

개요

git cherry-pick이란 다른 branch에 있는 커밋을 선택적으로 내 branch에 적용시킬 때 사용하는 명령어이다. 명령어는 다음과 같다.

$ git cherry-pick <commit_hash_id1> <commit_hash_id2> ...

아래 그림처럼 현재 X branch를 체크아웃하고 있고 Y branch의 커밋 중 76ae30ef와 13af32cc만 골라 X branch에 적용하려 한다.

명령어 예시

$ git cherry-pick 76ae30ef$ git cherry-pick 13af332cc

위 처럼 한개 씩 cherry-pick 명령어로 가져와 X branch 에 적용시키는 방법과

$ git cherry-pick 76ae30ef 13af32cc

명령어 뒤에 commit hash id를 나열하여 여러개를 한꺼번에 X branch에 적용할 수 있다.

cherry-pick 사용 이유

cherry-pick(or rebase)을 사용하지 않는다면, 최소 1개 이상의 파일에서 변경된 부분을 당신의 branch에 있는 코드로 손수 복사 붙여넣기 해야 하는 상황이 올 지도 모른다. 그런 경우, 그냥 복붙 하면 되지 않나? 하고 생각 할 지도 모른다. 하지만 그게 생각처럼 간단하지 않다. 커밋 메시지를 잘못 넣거나 잘못 branch off한 후 작업해서 복사 붙여넣기할 일이 많이 발생하는데, 쓸데없이 굉장한 고생이다. 여러개가 넘는 파일에서 변경된 부분만 찾아 복사 붙여넣기 하고 제대로 복사 붙여넣기가 되었나 확인하고, 유닛 테스트와 매뉴얼 테스트를 다시 확인해야한다. 큰 작업이었다면 테스팅 다시 하는 작업이 만만치 않을 것이다. 비록 모든branch에서 전부 테스트 했더라도, 이 branch에서 잘 작동한다는 보장이 없으니 반드시 다시 테스팅을 해야 하는데, 그 시간에 코드를 복붙하고 검증하는 시간까지 합치면 코드 양에 따라 많은 시간을 소비하게 될 수 있다. cherry-pick을 이용하면 적어도 이런 복붙하는 상황은 모면 할 수 있다.

— continue or — abort

cherry-pick하려는 커밋과 내 branch 사이에 conflict가 발생 할 수있다. Merge 할 때 merge conflict가 발생하듯이, 그런 경우 두 가지 옵션이 있다.

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

<Conflict로 인해 cherry-pick이 더 이상 진행하지 못하는 상황>

1.Conflict를 해결하고 cherry-pick을 진행시킨다.

Conflict을 해결하기 위해 코드를 수정한다. git add <path> 명령어로 수정된 코드를 올린다. (커밋은 다시 할 필요 없다.)

git cherry-pick — continue 명령어를 사용하면 다시 진행이 시작 될 것이다.

2. cherry-pick을 중단한다.

git cherry-pick — abort 명령어를 사용해 cherry-pick을 중단하면, cherry-pick을 하기 전 상태로 돌아 갈 수 있다.

cherry-pick merge

만약 merge commit을 cherry-pick하고 싶다면 다음과 같은 명령어를 사용하면 된다.

$ git cherry-pick -m 1 <merge_commit_hash_id>

cherry-pick은 그렇게 권장하는 명령어는 아니다. 위의 그림에서도 확인 했듯이 cherry-pick을 하는 경우, 같은 내용을 갖고 있는 커밋이 여러개 생기기 때문에 나중에는 어떤 branch에서 cherry-picking했는지 모르는 상황이 생길 수도 있다. 하지만 가끔 부득이하게 cherry-pick을 하는 경우가 생기므로 그 때를 위해 알아 두면 좋을 것이다.

--

--

No responses yet