Git

Cherry-pick의 활용법

Git 사용법

Posted by jopemachine on March 26, 2020 Updated on September 25, 2022

Cherry-pick의 활용법

원래 리포지토리 쪽으로 PR (Pull Request) 을 날린 게 여러 개의 커밋 (Commit) 들이 한 개의 커밋으로 취급되어 병합되었다. 다시 수정 사항이 생겨 커밋해놓고, PR을 날리려고 하는데 포크한 리포지토리에 작성한 커밋들이 새 커밋으로 취급되어 중복된 커밋을 포함하는 PR이 만들어지는 상황.

How to do - git cherry pick을 이용

1 - 임시 브랜치를 만든다.

git checkout -b temp 명령어로 temp 브랜치를 만들고, 체크아웃 (현재 브랜치 변경) 한다.

1
$ git checkout -b <new branch name>

2 - 이전 커밋으로 돌아간다.

git reset --hard 커맨드로 원래 리포지토리의 병합된 PR 커밋 이전으로 돌아간다. (중복되는 커밋들을 제거하기 위해)

1
$ git reset --hard <commit ID>

2020-03-26_10-39-41

3 - 이전 PR의 내용을 가져온다.

git cherry-pick 명령어로 원래 리포지토리에 병합된 커밋 내용 (이전 PR의 커밋 내용) 을 가져온다.

2020-03-26_10-39-41

1
$ git cherry-pick <commit ID>

git cherry-pick 명령어에 대해서는 아래 링크 참고

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

https://www.atlassian.com/git/tutorials/cherry-pick

4 - 이번 PR의 내용을 가져온다.

다시 git cherry-pick으로 기존 브랜치의 수정 사항 (이번 PR의 수정사항) 을 가져온다.

2020-03-26_10-39-41

1
$ git cherry-pick <commit ID>

가져와야할 커밋이 2개 이상인 경우 ..를 사용해 여러 개의 커밋을 동시에 가져올 수 있다.

이 때 아래의 명령어는 commit ID1을 포함하지 않음에 주의한다.

1
$ git cherry-pick <commit ID1>..<commit ID2>

ID1 부터 ID2 까지의 모든 커밋들을 가져오기 위해선,

1
$ git cherry-pick <commit ID1>^..<commit ID2>

위의 명령어를 사용해야 한다.

5 - 기존 브랜치를 제거하고, temp 브랜치를 기존 브랜치 이름으로 변경

git branch -d 으로 기존 브랜치를 제거하고, git branch -m 으로 temp 브랜치 이름을 기존 브랜치 이름으로 변경한다.

2020-03-26_10-39-41

1
2
// 브랜치 삭제
$ git branch -d <branch name to delete>
1
2
// 브랜치 이름 변경
$ git branch -m <new branch name>

6 - Push 한다.

git push --force로 기존 리포지토리에 푸쉬되어 있던 내용들을 덮어 쓴다.

2020-03-26_10-39-41

1
$ git push --set-upstream <branch name> --force

7 - 이제 정상적으로 PR을 날리면 끝!