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>
|
3 - 이전 PR의 내용을 가져온다.
git cherry-pick
명령어로 원래 리포지토리에 병합된 커밋 내용 (이전 PR의 커밋 내용) 을 가져온다.
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의 수정사항) 을 가져온다.
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 브랜치 이름을 기존 브랜치 이름으로 변경한다.
1
2
| // 브랜치 삭제
$ git branch -d <branch name to delete>
|
1
2
| // 브랜치 이름 변경
$ git branch -m <new branch name>
|
6 - Push 한다.
git push --force
로 기존 리포지토리에 푸쉬되어 있던 내용들을 덮어 쓴다.
1
| $ git push --set-upstream <branch name> --force
|
7 - 이제 정상적으로 PR을 날리면 끝!