🌄 배경
멀티레포
의 형태로 존재하는 여러 프로젝트를 모노레포
로 전환하는 작업을 진행중이었습니다. 그리고 이와 동시에 기존 레포(멀티 레포)에서의 작업도 이루어져야 했습니다.
따라서, 모노레포 전환이 완료되기 전까지는 기존 레포에서 작업을 진행하고 작업이 완료된 이후 새롭게 구성중인 모노레포로 작업 결과 커밋을 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
역시 별로 다르지 않았습니다
Cherry-pick
을 통해 가져올 레포를remote
로 지정합니다.
$ git remote add cherryPickTargetRepo <https://github.com/>...
$ git remote add cherryPickTargetRepo <https://github.com/>...
git fetch
를 통해remote
레포의 변경사항을 가져옵니다.
$ git fetch cherryPickTargetRepo
$ git fetch cherryPickTargetRepo
git log
를 통해 가져온 레포의 커밋 로그를 확인합니다. (git log remoteName/branchName
)
$ git log cherryPickTargetRepot/cherryPickTargetBranch
$ git log cherryPickTargetRepot/cherryPickTargetBranch
- 로그를 통해 확인한 커밋을
cherry-pick
합니다.
$ git cherry-pick commit1 commit2 commit3 ...
$ git cherry-pick commit1 commit2 commit3 ...
conflict
이 발생할 경우, 수정 이후 진행합니다.
$ git add $file
$ git cherry-pick --continue
$ git add $file
$ git cherry-pick --continue