-
git cherry-pick 명령어로 다른 브랜치의 커밋 내역 가져오기Today I Learned 2023. 1. 23. 23:07
상황은 이렇다.
- main branch에서 원격 branch인 origin/main을 추적하는 새로운 작업 branch를 분기했다.
- 작업을 진행한 뒤 commit하고, 작업 브랜치를 리모트의 origin에 push했다.
- Github 프로젝트 Repository에서 Pull Request된 branch를 원격의 main에 merge했다.
- 로컬에서 원격의 branch 내역을 main에 반영하지 않고, 작업 브랜치에서 계속 작업을 진행했다. commit은 하지 않았다.
추가로 작업을 진행한 로컬의 현재 브랜치는 원격에서는 이미 merge되었기 때문에 push할 경우 예상하지 못한 문제가 발생할 것이 염려되었다. 따라서 원격의 main을 로컬의 main에 반영하면서도 지금 작업하고 있던 내역을 새로운 작업 브랜치에 반영하기 위해 git cherry-pick 명령어를 사용해보기로 했다.
cherry-pick 명령어는 특정 커밋 내역을 선택적으로 현재 branch에 적용시킬 때 사용할 수 있다. 간단한 사용법은 다음과 같다.
git cherry-pick <커밋 내역의 hash>
현재 상황에서 cherry-pick을 적용해보기 위해 다음과 같은 절차를 계획했다.
1. 우선 작업 내역을 현재 branch에 commit한 뒤, commit한 작업 내역의 hash를 기억한다.
이때까지의 해당 branch의 커밋 내역은 다음과 같다.
먼저 작업했던 commit 내역 뒤로 새로운 commit이 추가되었다.
2. main branch로 이동한 뒤, 원격 main을 fetch해 로컬에 반영하고, 로컬 main branch의 HEAD가 fetch된 지점을 바라보게 한다.
이 시점에서 로컬 main branch의 HEAD가 바라보는 지점의 데이터는, 앞서 merge된 직전 작업 branch에서 먼저 작업했던 commit 내역까지의 내용과 똑같다.
3. origin/main을 추적하는 새로운 작업 branch로 분기한다.
4. 앞서 commit했던 작업 내역을 cherry-pick한다.
cherry-pick을 수행한 뒤 새로운 작업 branch의 커밋 내역은 다음과 같다.
이전까지의 작업 내역이 main에 merge되어 있고, 새로운 작업 branch에서 작업한 것처럼 commit이 쌓여있는 것을 확인할 수 있다.
cherry-pick해오는 커밋 내역에서 변경된 내용과, 현재 branch의 내용 간에 수정 사항이 겹치는 부분이 없었기 때문에 conflict는 발생하지 않았다. 만약 cherry-pick해오는 커밋 내역에서 변경된 내용과 겹치는 부분을 현재 branch에서 수정한 상태에서 cherry-pick를 시도하려 할 경우 conflict가 발생할 수 있다.
conflict가 발생할 경우 다음의 링크를 참고하기 바란다.
References
Remote
- https://git-scm.com/book/ko/v2/Git-브랜치-리모트-브랜치
- https://git-scm.com/book/ko/v2/Git의-기초-리모트-저장소
cherry-pick
- https://git-scm.com/docs/git-cherry-pick
- https://cselabnotes.com/kr/2021/03/31/56/
'Today I Learned' 카테고리의 다른 글
WebSocket 동작 테스트하기 (0) 2023.01.26 Heap, PriorityQueue (0) 2023.01.26 WebSocket을 이용한 실시간 채팅 구현하기 3-1: 브라우저 화면을 닫을 때 퇴장 메시지 전송하기 (0) 2023.01.21 WebSocket을 이용한 실시간 채팅 구현하기 3: STOMP (0) 2023.01.21 Java에서 단일 Key, Value 쌍 사용하기: Map.Entry<K, V> (0) 2023.01.20