Hits

🌄 배경

멀티레포의 형태로 존재하는 여러 프로젝트를 모노레포로 전환하는 작업을 진행중이었습니다. 그리고 이와 동시에 기존 레포(멀티 레포)에서의 작업도 이루어져야 했습니다.
따라서, 모노레포 전환이 완료되기 전까지는 기존 레포에서 작업을 진행하고 작업이 완료된 이후 새롭게 구성중인 모노레포로 작업 결과 커밋을 cherry-pick 하기로 결정했습니다.
이 과정에서 기존 Repository가 아닌 다른 Repository의 커밋을 cherry-pick을 해야하는 상황이 발생했습니다.


🍒 Cherry-pick이란?

https://git-scm.com/docs/git-cherry-pick

Cherry-pick 은 다른 브랜치에서의 작업 내용을 가져와 반영하도록 해주는 명령어입니다.

$ git cherry-pick <commit hash>
$ git cherry-pick <commit hash>

그림으로 살펴보면 아래와 같습니다.

만약 개발자 B가 B라는 브랜치에서 작업을 하고 있는 도중에 A개발자가 A라는 브랜치에서 작업한 내용을 가져와 반영하고 싶다면, 가져오고 싶은 커밋을 Cherry-pick하면 됩니다.

$ git cherry-pick 76a397 9bd995 dbdff5
 
$ git cherry-pick 76a397 9bd995 dbdff5
 

그 결과로 아래와 같은 형태의 히스토리가 만들어 지게 됩니다.

cherry-pick을 진행하는 상황에서 conflict이 발생할 경우, 2가지 방법을 통해 해결할 수 있습니다.

1️⃣ -abort

cherry-pick을 중단하고 싶을 때 사용한다. 이 경우, cherry-pick 이전 상황으로 코드가 롤백됩니다.

$ git cherry-pick --abort
 
$ git cherry-pick --abort
 

2️⃣ -continue

충돌이 발생한 코드를 직접 수정 후에 -- continue 명령어를 통해 cherry-pick을 재개할 수 있습니다.

// 파일 수정 이후
$ git add $file
$ git cherry-pick --continue
 
// 파일 수정 이후
$ git add $file
$ git cherry-pick --continue
 

🍒 다른 레포의 커밋 Cherry-pick

앞서 다뤄본 상황은 같은 레포 환경에서의 cherry-pick에 대한 내용입니다.

다른 레포의 Cherry-pick 역시 별로 다르지 않았습니다

  1. Cherry-pick을 통해 가져올 레포를 remote로 지정합니다.
$ git remote add cherryPickTargetRepo <https://github.com/>...
$ git remote add cherryPickTargetRepo <https://github.com/>...
  1. git fetch를 통해 remote 레포의 변경사항을 가져옵니다.
$ git fetch cherryPickTargetRepo
$ git fetch cherryPickTargetRepo
  1. git log를 통해 가져온 레포의 커밋 로그를 확인합니다. (git log remoteName/branchName)
$ git log cherryPickTargetRepot/cherryPickTargetBranch
$ git log cherryPickTargetRepot/cherryPickTargetBranch
  1. 로그를 통해 확인한 커밋을 cherry-pick합니다.
$ git cherry-pick commit1 commit2 commit3 ...
$ git cherry-pick commit1 commit2 commit3 ...
  1. conflict이 발생할 경우, 수정 이후 진행합니다.
$ git add $file
$ git cherry-pick --continue
$ git add $file
$ git cherry-pick --continue