git cherry-pick
git cherry-pick이 뭘까?
git cherry-pick은 제목과 마찬가지로 필요한 commit만 골라서 가져오는 명령어이다.
쉽게 말해 다른 브랜치에 있는 commit들 중에서 원하는, 필요한 commit을 지금 내 브랜치에 가져와 commit을 하는 것이다.
참고로 해당 commit을 branch끼리 옮기는 게 아니라 동일한 commit을 다른 branch에 복사하는 개념이라고 생각하면 된다. (실제로 commit이 추가된다.)
그렇다면 cherry-pick은 언제 사용하는 걸까?
git cherry-pick은 유용한 도구이지만 같은 commit이 중복되는 일이 발생하거나 그 외에도 여러가지 문제가 발생할 수 있기 때문에 꼭 필요한 상황에서만 사용하는 것을 권장한다.
- 팀으로 협업할 때
팀으로 협업을 진행하고 있을때, 다른 동료가 만들고 있는 기능이 필요한 순간이 있다. 만약 동료가 해당 기능을 이미 다 만들어 놨고, 동료가 맡은 모든 작업을 merge 할 때까지 시간이 걸린다면 동료가 만들었다는 기능이 들어있는 commit만 골라서 가져올 때 사용한다. - 버그를 수정할 때
새로운 기능을 개발하는 동안 기존에 있던 기능에서 버그가 발견되었을 때, 개발자는 이 버그를 패치하기위해 명시적 커밋을 만들고 해당 커밋만 골라서 master 브랜치에 배포할 수 있다. - 반영되지 않은 손실된 커밋 복원 (pull request)
실수로 pull request를 merge하기 전에 닫아버렸을 때, cherry-pick을 사용해 해당 commit을 가져옴으로써 살릴 수 있다.
git cherry-pick 사용하기
cherry-pick을 사용하는 방법에 대해 간단하게 알아보자.
우선 아래와 같은 상황에서 시작해보자.
그냥 막 작업하다보니 좀 지저분해졌는데, 우선 하고자 하는 것은 master브랜치에 record브랜치가 업데이트한 b.txt 파일의 정보가 당장 필요하다고 해보자.
이럴 때 저 update b.txt file이라는 메시지가 적힌 commit만 골라서 가져올 때 cherry-pick을 사용하면 된다.
# git cherry-pick <HASH>
git cherry-pick 309fe2b
# cherry-pick 여러개 적용
# git cherry-pick <HASH1> <HASH2> ...
로그를 보면 알겠지만 update b.txt file이라는 commit이 master 브랜치에 추가된 것을 볼 수 있다.
여기서 혹시나 cherry-pick을 해서 같은 파일을 커밋했기 때문에 충돌 나는 거 아냐?라고 의문을 가질 수 있겠지만
놀랍게도 merge를 그냥 해봤는데, 아무 에러 없이 잘 merge되었다.
추가적으로 만약 cherry-pick을 할 때 자동 커밋되는 게 싫다 하면 --no-commit 옵션을 사용하면 되는데, 많이 사용되는 옵션인지는 잘 모르겠다.
git cherry-pick 충돌 시 해결
그러나 혹시 본인이 작업 중이던 파일과 cherry-pick을 통해 가져온 commit이 동일하여 conflict가 발생할 수는 있다.
이때 해결방안으로는 두 가지 방법이 존재한다.
충돌 해결 후, cherry-pick 계속 진행
이건 rebase 명령어를 사용할 때와 비슷하다.
- 충돌 난 코드를 수정
- git add <path> 명령어로 수정된 코드 등록
- git cherry-pick --continue 명령어를 통해 충돌로 중지되었던 cherry-pick을 계속 진행
cherry-pick 중단
- git cherry-pick --abort 명령어를 사용해 cherry-pick을 중단하게 되면 그 이전 상태로 다시 돌아갈 수 있다.
댓글