변경 사항 Cherry-pick
Git에서 cherry-picking은 하나의 브랜치에서 단일 커밋을 가져와 다른 브랜치의 최신 커밋으로 추가하는 것입니다. 소스 브랜치의 나머지 커밋은 대상에 추가되지 않습니다. 전체 브랜치의 내용이 아닌 하나의 커밋 내용이 필요한 경우 커밋을 cherry-pick합니다. 예를 들어:
- 기본 브랜치에서 버그 수정을 이전 릴리스 브랜치로 Backport합니다.
- 분기에서 변경 사항을 상위 저장소로 복사합니다.
GitLab UI를 사용하여 프로젝트나 프로젝트 분기에서 단일 커밋이나 전체 병합 요청의 내용을 cherry-pick할 수 있습니다.
이 예에서 Git 리포지토리에는 develop
와 main
두 개의 브랜치가 있습니다. 커밋 B
는 main
브랜치의 커밋 E
이후에 develop
브랜치에서 cherry-pick됩니다. 커밋 G
는 cherry-pick 후에 추가됩니다:
병합 요청에서 모든 변경 사항을 Cherry-pick
병합 요청이 병합된 후에는 병합 요청에서 도입된 모든 변경 사항을 cherry-pick할 수 있습니다. 병합 요청은 상위 프로젝트나 하위 포크에 있을 수 있습니다.
준비 사항:
- 병합 요청을 편집하고 리포지토리에 코드를 추가할 수 있는 프로젝트 역할이 있어야 합니다.
-
프로젝트는 Settings > Merge requests에서 설정한 Merge Commit 병합 방법을 사용해야 합니다.
GitLab 16.9 이상에서, fast-forward된 커밋은 squash된 경우나 병합 요청에 하나의 커밋이 포함된 경우에만 GitLab UI에서 cherry-pick할 수 있습니다. 언제든지 단일 커밋을 cherry-pick할 수 있습니다.
다음을 수행하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Code > Merge requests를 선택하고 병합 요청을 찾습니다.
- 병합 요청 보고서 섹션으로 스크롤하여 Merged by 보고서를 찾습니다.
-
보고서의 오른쪽 상단에서 Cherry-pick을 선택합니다:
- 대화상자에서 cherry-pick하려는 프로젝트와 브랜치를 선택합니다.
- 선택 사항: 이러한 변경 사항으로 새 병합 요청 시작을 선택합니다.
- Cherry-pick을 선택합니다.
단일 커밋을 Cherry-pick
GitLab 프로젝트의 여러 위치에서 단일 커밋을 cherry-pick할 수 있습니다.
프로젝트의 커밋 목록에서
프로젝트의 모든 커밋 목록에서 커밋을 cherry-pick하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Code > Commits를 선택합니다.
- cherry-pick하려는 커밋의 제목을 선택합니다.
- 오른쪽 상단에서 Options > Cherry-pick을 선택합니다.
- cherry-pick 대화상자에서 cherry-pick하려는 프로젝트와 브랜치를 선택합니다.
- 선택 사항: 이러한 변경 사항으로 새 병합 요청 시작을 선택합니다.
- Cherry-pick을 선택합니다.
저장소의 파일 보기에서
프로젝트의 Git 리포지토리에서 해당 파일을 보는 경우, 개별 파일에 영향을 미치는 이전 커밋 목록에서 cherry-pick할 수 있습니다:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Code > Repository를 선택합니다.
- 커밋에 영향을 주는 이전 커밋 목록으로 이동합니다. 오른쪽 상단에서 History를 선택합니다.
- cherry-pick하려는 커밋의 제목을 선택합니다.
- 오른쪽 상단에서 Options > Cherry-pick을 선택합니다.
- cherry-pick 대화상자에서 cherry-pick하려는 프로젝트와 브랜치를 선택합니다.
- 선택 사항: 이러한 변경 사항으로 새 병합 요청 시작을 선택합니다.
- Cherry-pick을 선택합니다.
명령줄에서
git
명령줄 인터페이스를 사용하여 하나의 브랜치에서 다른 브랜치로 커밋을 cherry-pick할 수 있습니다.
이 예에서 기능 브랜치(feature
)의 커밋을 다른 브랜치(develop
)로 cherry-pick합니다.
-
기본 브랜치를 체크아웃한 후 그것을 기반으로 새로운
develop
브랜치를 체크아웃합니다:git checkout main git checkout -b develop
-
기능 브랜치로 변경합니다:
git checkout feature
-
변경 사항을 수행한 다음 이를 커밋합니다:
git add changed_file.rb git commit -m 'Fix bugs in changed_file.rb'
-
커밋 로그를 표시합니다:
$ git log commit 0000011111222223333344444555556666677777 Merge: 88888999999 aaaaabbbbbb Author: user@example.com Date: Tue Aug 31 21:19:41 2021 +0000
-
commit
라인을 식별하고 해당 라인의 문자열을 복사합니다. 이 정보는 커밋의 SHA(Secure Hash Algorithm)입니다. SHA는 이 커밋의 고유 식별자이며 이후 단계에서 필요합니다. -
이제 SHA를 알고 있으므로
develop
브랜치로 다시 전환합니다:git checkout develop
-
develop
브랜치로 커밋을 cherry-pick하고SHA
를 커밋 SHA로 변경합니다:git cherry-pick SHA
Cherry-pick된 커밋의 시스템 노트 보기
GitLab UI 또는 API에서 병합 커밋을 cherry-pick하면 GitLab은 관련 병합 요청 스레드에 시스템 노트를 추가합니다. 포맷은 [USER]
picked the changes into the branch [BRANCHNAME]
with commit** [SHA]
[DATE]
입니다:
시스템 노트는 새로운 커밋과 기존 병합 요청을 상호 참조합니다. 각 배포의 관련 병합 요청 목록에는 cherry-pick된 병합 커밋이 포함됩니다.
GitLab UI 또는 API 외부에서 cherry-pick된 커밋은 시스템 노트를 추가하지 않습니다.
관련 주제
문제 해결
cherry-pick 시 다른 부모 커밋 선택
GitLab UI에서 merge 커밋을 cherry-pick할 때, mainline은 항상 첫 번째 부모입니다. 다른 mainline을 사용하려면 명령줄을 사용하세요.
다음은 두 번째 부모를 mainline으로 사용하여 merge 커밋을 cherry-pick하는 빠른 예시입니다:
git cherry-pick -m 2 7a39eb0