[Git Cheat Sheet] git cherry-pick , 필요한 커밋만 pick 하고 싶을 때

YounGyeom·2021년 8월 7일
0

Git

목록 보기
2/2
post-thumbnail

git을 통해 협업을 하다 보면 팀에서 정한 브랜치 전략에 따라 브랜치를 관리하게 될것이다. 다양한 방식이 있을 수 있겠지만 우리 팀은git-flow 전략을 택했다. 해당 브랜치 관리 전략에 따라 메인 브랜치를 masterdevelop으로 나누고 master 브랜치를 라이브 서버에 배포되는 브랜치develop 브랜치를 다음 출시 버전에 대비하여 개발하는 브랜치로 나눠서 작업하게 됐다. 그리고 develop에서 분기한 feature기능 개발 브랜치로 뒀다.

이렇게 용도에 따라 브렌치를 나눠서 작업하는 것은 큰 실수를 방지할 수 있어서 유용하다. 하지만 가끔 바쁘게 작업할 때 브렌치의 종류가 너무 많다보니 브렌치를 헷갈려서 잘못 커밋 하는 문제가 발생할 수도 있다.

예를들어서 이번 경우에는 내가 한 커밋과 다른 팀원의 커밋이 섞여서 충돌이 일어났는데 내가 한 작업은 명확하게 알지만 팀원의 작업은 어떤 것은 지워도 되고 어떤 것은 안되는지 알 수 없어서 곤란했다.

이런 상황을 바로잡기 위한 몇가지 해결책이 있었다.

  1. 브렌치의 기준이 되는 base를 다시 잡아주는 git rebase
  2. git log에서 특정한 commit만 선택적으로 현재 HEAD가 가리키는 브랜치(특정 commit의 추가를 원하는 브랜치)에 적용시킬 때 사용하는 git cherry-pick

git cherry-pick

git cherry-pick은 git log에서 특정한 commit만 선택적으로 현재 HEAD가 가리키는 브랜치(특정 commit의 추가를 원하는 브랜치)에 적용시킬 때 사용할 수 있는 명령어이다.

다른 branch에 있는 commit을 내 branch로 옮기는 것이 아니라 새로운 commit을 생성하는 것이라고 보면 된다.

git cherry-pick <commit_hash>

명령어 이름이 참 재밌는데 마치 체리바구니에서 고품질의 체리 하나만 골라 담는 모습이 상상된다. 필요한 특정 commit만 골라서 브렌치에 담는 모습과 닮아서 해당 이름이 붙여진 것이 아닐까 추측해본다.

예를들어서 설명하기 위해서 팀의 브렌치 내역을 가져왔다.

세명이서 작업하다보니 브렌치가 많이 지저분하다. 1번과 2번 도형으로 표시한 부분만 참고하면 좋을 것 같다.

1번 도형안의 feature/mobileMediaQuery가 처음 분기한 지점을 따라가보면 develop이 있는 것을 확인할 수 있다. 그리고 다시 develop으로 merge 된 것을 볼 수 있다.

여기서 develop 으로 충돌없이 merge 가 된 것을 확인한 후 해당 브렌치를 master로 보내고 싶었는데 해당 과정에서 충돌이 일어났다. 팀원과 협의하여 충돌 부분을 함께 찾아낼 수도 있었으나 각자의 일정이 있는 관계로 혼자서 해결할 방법을 찾아내야했다.

여기서 나는 feature/mobileMediaQuery 안의 특정한 commit 내역만 master에 merge하면 됐었다. 그런데 feature/mobileMediaQuery 브렌치 자체가 develop 에서 분기되었기 때문에 develop안에 merge 되어 있는 다른 작업 내용이 따라와서 충돌을 일으키는 것 같았다.

따라서 master 에서 새로운 브렌치를 만들어서 해당 commit 내역만 git cherry-pick 으로 가져오기로 했다.

1개의 commit hash만 가져올 경우

git cherry-pick cdeec2b

나처럼 하나의 commit만 가져올거면 위와같이 원하는 특정 commit hash 1개만 적용하면 된다.

여러개의 commit hash를 가져오고 싶을 경우

git cherry-pick cdeec2b 15ae34cf

여러개를 가져오고 싶을 경우 위와같이 해당하는 commit hash를 이어서 작성해주면 된다.

해당하는 범위의 commit hash를 가져오고 싶을 경우

git cherry-pick cdeec2b..b223ec14

해당하는 범위의 commit hash를 모두 가져 오고 싶을 경우에는 위와 같은 명령어를 입력하면 된다. 이 경우 첫번째로 작성한 commit hash(위의 예시에서는 cdeec2b)는 cherry-pick이 적용되지 않는것을 볼 수 있다.

merge commit 을 가져오고 싶을 경우

git cherry-pick -m 1 <merge commit hash>

cherry-pick 이후

cherry-pick 이후 git status 를 이용해 내역을 확인해보면 git이 친절하게 "You are currently cherry-picking commit cdeec2b" 라고 알려주는 것을 볼 수 있다.

conflict

merge 할때 merge conflict가 발생하는 것처럼 위와같이 충돌이 일어나서 해결해야 하는 경우가 있다.

  1. git cherry-pick --continue

conflict가 발생한 지점을 고치고 다시 진행시키는 경우에 사용한다.

  1. git cherry-pick --abort

cherry-pick을 중단하고 실행 전 상태로 돌아가고 싶을 경우 사용한다.

이번 경우에 특별히 사용했지만 같은 내용의 commit이 여러 개 생기기 때문에 그렇게 권장하는 방법은 아니라고 한다. 각자의 상황에 맞게 특수한 경우에만 선택적으로 사용하는 것이 좋을 것 같다.

Reference

cherry-pick으로 원하는 commit 가져오기

삐멜 소프트웨어 엔지니어

Bitbucket

profile
keep it fresh!

0개의 댓글