cherry-pick은 "(최고를) 선별하다"라는 뜻의 동사인데, 이 의미 그대로 Git에서도 cherry-pick을 사용하여 내가 원하는 커밋을 선별하여 가져올 수 있다.
Cherry-pick으로 원하는 커밋을 지정하는 방법을 알아보자.
git cherry-pick <Commit>
기본적인 사용방법은 위와 같다. 내가 가져오고 싶은 커밋을 적으면 된다.
git cherry-pick <Commit1> <Commit2> ...
가져올 커밋을 여러개 설정해줄 수도 있다. 위처럼 여러개의 커밋을 지정할 경우, 앞에 있는 것부터 차례대로 가져온다.
git cherry-pick <Commit1>...<Commit2>
위처럼 ...
을 사이에 넣어주면 Commit1
바로 뒤 커밋부터 Commit2
까지의 커밋을 모두 가져온다.
git cherry-pick <Commit1>^...<Commit2>
위처럼 ^...
을 사이에 넣어주면 Commit1
부터 Commit2
까지를 모두 가져온다. 이러한 방식은 cherry-pick 뿐만 아니라 rebase나 revert 등의 다른 명령어로 커밋을 조작할 때도 동일하게 동작하니 알아두면 좋다.
Cherry-pick은 현재 브렌치로 다른 커밋을 가져오기 때문에 Conflict가 발생할 수 있다. 만약 가져오는 커밋이 하나라면 단순히 충돌을 제거하고 커밋하면 된다. 하지만 가져오는 커밋이 여러개일 경우 충돌이 난 커밋을 해결한 후, 다음 커밋으로 넘어가는 명령어들이 필요할 것이다. 이럴 경우 사용할 수 있는 시퀀스 하위 커맨드들이 있다.
git cherry-pick --continue
다음 커밋으로 넘어가는 명령이다. continue
옵션을 사용하려면, 해당 차례의 충돌을 해결한 후에 사용할 수 있다.
git cherry-pick --skip
현재 커밋을 스킵하고, 다음 커밋으로 넘어간다. 현재 커밋을 스킵하기 때문에, 당연히 해당 커밋의 변경점 역시 반영되지 않는다.
git cherry-pick --quit
현재 진행중인 cherry-pick 동작을 그만둔다. quit
은 롤백같은 추가적인 동작을 하지 않고, 그냥 그 상태 그대로 끝낸다. 그래서 이전 차례때 가져온 커밋들은 그대로 남아있으며, 현재 진행 중인 커밋들의 파일 역시 Conflict가 발생한 상태 그대로 종료된다.
git cherry-pick --abort
현재 진행중인 cherry-pick 동작을 그만두면서 처음 상태로 롤백시킨다. 만약 이전 차례때 가져온 커밋들이 있다면 그 커밋들 역시 사라지면서, cherry-pick을 실행하기 전 상태로 돌아간다.
위 사진의 main 브렌치에서 develop 브렌치의 CSS 만듬
커밋만을 가져오고 싶을 수 있다.
이 경우 git cherry-pick 820a8ff5
를 입력하여 해당 커밋을 가져올 수 있다.
만약 Conflict가 발생하지 않았다면 추가 과정 없이 위 사진처럼 커밋을 가져온다.
위 사진의 c1
과 c1'
은 같은 파일에 대해 작업을 하여 Conflict를 발생시킨 커밋이다. 위 상황의 develop 브렌치에서 c1 커밋을 가져와보자.
위 사진처럼 Conflict가 발생한 것을 볼 수 있다. 충돌이 발생한 부분을 해결해주고, 해당 파일들을 commit 해주면 해결할 수 있다.
이번에는 위 사진처럼 충돌이 나는 커밋들이 여러개 있는 경우, 여러개의 커밋들을 cherry-pick으로 가져와보자.
만약 c1
과 c2
를 차례대로 가져왔다고 가정해보자. 그렇다면 우선 c1 커밋부터 충돌이 발생할 것이다. 이 때, git cherry-pick --skip
으로 c1 커밋을 넘어가거나, 충돌 해결 및 커밋을 한 후 git cherry-pick --continue
로 다음 커밋(c2)로 넘어갈 수 있다.
c1
, c2
의 충돌을 모두 해결하고 가져왔을 때 모습이다.
c1
커밋은 skip하고 c2
커밋만 가져온 모습이다.
위 예시에서 알 수 있듯 자기가 원하는 커밋만을 가져올 수 있다.
위 예시에서 확인할 수 있듯이, 커밋을 가져올 때는 해당 커밋을 그대로 가져오는 것이 아닌 새로운 커밋을 만들어서 가져온다. 커밋의 정보(커밋 시간, 부모 커밋 등)이 다르니 당연한 결과이다.
Git - git-cherry-pick Documentation
git cherry-pick - 다른 브렌치의 커밋을 적용
[Git] cherry-pick으로 원하는 commit 가져오기