ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • git 명령어 : git cherry-pick
    소프트웨어 개발 툴 2019. 1. 30. 16:31

    git을 이용해 코드 관리를 하다보면 커밋을 다른 브랜치에 잘못 하거나, 요구사항이 바뀌어 필요 없는 커밋이 생기거나, 코드 의존성(dependency) 때문에 다른 사람의 커밋 중 일부를 가져와야 하는 경우가 종종 생긴다. 그런 경우 git rebasegit cherry-pick을 많이 사용하는데 오늘은 그 중에서 cherry-pick에 대해 설명 할 것이다.


    git cherry-pick

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

    git cherry-pick <commit_hash_1> <commit_hash_2> ...

    예를 들어 설명 하기 위해 다음의 그림을 보자.

    위 처럼 현재 당신의 코드는 X 브랜치에 있고 (git checkout X)라는 뜻 당신은 브랜치 Y의 커밋 중 76ae30ef13af32cc만 골라 현재 브랜치인 X에 적용하고 싶다고 하자.

    git cherry-pick 76ae30ef

    git cherry-pick 13af332cc

    위 처럼 한개 씩 cherry-pick 명령어로 가져와 브랜치 X에 적용시키는 방법이 있고,

    git cherry-pick 76ae30ef 13af32cc

    또는 명령어 뒤에 commit hash를 나열 해 주면 여러개를 한꺼번에 내 브랜치인 브랜치 X에 적용시킬 수 있다.

    <76ae30ef13af32cc가 브랜치 X으로 복사 된 상황>

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

    --continue or --abort

    가끔 cherry-pick하려는 커밋과 내 브랜치 사이에 conflict이 발생 할 수있다. Merge 할 때 merge 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)

    <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>


    앞서 말 했듯이 cherry-pick이외에도 git rebase라는 명령어로 원하는 커밋을 선택적으로 고를 수 있다. 다만 git rebase는 현재 브랜치 위에서만 가능하므로, 다른 브랜치에서 commit을 가져오고 싶다면 먼저 그 브랜치를 현재 브랜치로 merge한 후 rebase해야 하는 번거로움이 있다.


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


    댓글 3

f.software engineer @ All Right Reserved