변경 사항 선택하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Git에서 체리픽(cherry-picking)은 하나의 브랜치에서 단일 커밋을 가져와서
다른 브랜치의 최신 커밋으로 추가하는 것입니다. 소스 브랜치의 나머지
커밋은 대상에 추가되지 않습니다. 전체 브랜치의 내용은 필요하지 않지만
단일 커밋의 내용이 필요한 경우 커밋을 체리픽합니다. 예를 들어,

  • 기본 브랜치에서 이전 릴리스 브랜치로 버그 수정을 전달할 때.
  • 포크에서 업스트림 리포지토리로 변경 사항을 복사할 때.

GitLab UI를 사용하여 프로젝트 또는 프로젝트 포크에서 단일 커밋 또는
전체 머지 요청의 내용을 체리픽합니다.

이 예제에서는 Git 리포지토리에 developmain 두 개의 브랜치가 있습니다.
커밋 Bmain 브랜치의 커밋 E 이후에 develop 브랜치에서 체리픽됩니다.
커밋 G는 체리픽 이후에 추가됩니다:

gitGraph commit id: "A" branch develop commit id:"B" checkout main commit id:"C" checkout develop commit id:"D" checkout main commit id:"E" cherry-pick id:"B" commit id:"G" checkout develop commit id:"H"

머지 요청에서 모든 변경 사항 체리픽하기

머지 요청이 병합된 후, 머지 요청에서 소개된 모든 변경 사항을
체리픽할 수 있습니다. 머지 요청은 업스트림 프로젝트에 있거나
다운스트림 포크에 있을 수 있습니다.

사전 요구 사항:

  • 프로젝트에서 머지 요청을 편집하고 리포지토리에 코드를 추가할 수 있는
    역할을 가져야 합니다.
  • 귀하의 프로젝트는 merge method
    Merge Commit을 사용해야 하며, 이는 프로젝트의
    Settings > Merge requests에 설정되어 있습니다.

    GitLab 16.9 및 이후 버전에서는
    빠른 병합된 커밋을 체리픽할 수 있습니다. 단, 커밋이 스쿼시되거나
    머지 요청이 단일 커밋을 포함해야 합니다.
    항상 개별 커밋을 체리픽할 수 있습니다.

이를 수행하려면:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Code > Merge requests를 선택하고 머지 요청을 찾습니다.
  3. 머지 요청 보고서 섹션으로 스크롤하고 Merged by 보고서를 찾습니다.
  4. 보고서의 오른쪽 상단 모서리에서 Cherry-pick을 선택합니다:

    머지 요청 체리픽하기

  5. 대화상자에서 체리픽할 프로젝트와 브랜치를 선택합니다.
  6. 선택 사항. 이 변경 사항으로 새로운 머지 요청 시작을 선택합니다.
  7. Cherry-pick을 선택합니다.

단일 커밋 체리픽하기

여러 위치에서 GitLab 프로젝트의 단일 커밋을 체리픽할 수 있습니다.

프로젝트의 커밋 목록에서

프로젝트의 모든 커밋 목록에서 커밋을 체리픽하려면:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Code > Commits를 선택합니다.
  3. 체리픽하려는 커밋의 제목을 선택합니다.
  4. 오른쪽 상단 모서리에서 Options > Cherry-pick을 선택합니다.
  5. 체리픽 대화상자에서 체리픽할 프로젝트와 브랜치를 선택합니다.
  6. 선택 사항. 이 변경 사항으로 새로운 머지 요청 시작을 선택합니다.
  7. Cherry-pick을 선택합니다.

리포지토리의 파일 보기

프로젝트의 Git 리포지토리에서 파일을 볼 때, 특정 파일에 영향을 미치는 이전 커밋 목록에서 체리픽할 수 있습니다:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
  2. Code > Repository를 선택합니다.
  3. 커밋에 의해 변경된 파일로 가세요. 오른쪽 상단에서 History를 선택합니다.
  4. 체리픽할 커밋의 제목을 선택합니다.
  5. 오른쪽 상단에서 Options > Cherry-pick을 선택합니다.
  6. 체리픽할 프로젝트와 브랜치를 선택합니다.
  7. 선택 사항. 이 변경 사항으로 새 병합 요청 시작을 선택합니다.
  8. Cherry-pick을 선택합니다.

명령줄에서

git 명령줄 인터페이스를 사용하여 한 브랜치에서 다른 브랜치로 커밋을 체리픽할 수 있습니다.

이 예시에서, 기능 브랜치(feature)에서 다른 브랜치(develop)로 커밋을 체리픽합니다.

  1. 기본 브랜치를 체크아웃한 후, 그을 기반으로 새 develop 브랜치를 체크아웃합니다:

    git checkout main
    git checkout -b develop
    
  2. 기능 브랜치로 돌아갑니다:

    git checkout feature
    
  3. 변경 내용을 만들고, 커밋합니다:

    git add changed_file.rb
    git commit -m 'Fix bugs in changed_file.rb'
    
  4. 커밋 로그를 표시합니다:

    $ git log
    
    commit 0000011111222223333344444555556666677777
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
  5. commit 줄을 식별하고, 그 줄에서 글자와 숫자의 문자열을 복사합니다. 이 정보는 커밋의 SHA(Secure Hash Algorithm)입니다. SHA는 이 커밋에 대한 고유 식별자이며, 후속 단계에서 필요합니다.

  6. SHA를 알았으므로 다시 develop 브랜치를 체크아웃합니다:

    git checkout develop
    
  7. 커밋을 develop 브랜치에 체리픽하고, SHA를 자신의 커밋 SHA로 변경합니다:

    git cherry-pick SHA
    

체리픽한 커밋에 대한 시스템 노트 보기

GitLab UI 또는 API에서 병합 커밋을 체리픽할 때, GitLab은 관련 병합 요청 스레드에 시스템 노트를 추가합니다. 형식은 [USER] 가 브랜치 [BRANCHNAME] 에 커밋 [SHA] [DATE] 로 변경 사항을 추가했습니다:

병합 요청 타임라인에서의 체리픽 추적

시스템 노트는 새 커밋과 기존 병합 요청을 상호 링크합니다. 각 배포의 관련 병합 요청 목록에는 체리픽한 병합 커밋이 포함됩니다.

GitLab UI 또는 API 외부에서 체리픽된 커밋은 시스템 노트를 추가하지 않습니다.

관련 주제

문제 해결

체리픽할 때 다른 부모 커밋 선택하기

GitLab UI에서 병합 커밋을 체리픽할 때, 메인라인은 항상 첫 번째 부모입니다.

다른 메인라인으로 체리픽하려면 명령줄을 사용하세요.

다음은 두 번째 부모를 메인라인으로 사용하여 병합 커밋을 체리픽하는 간단한 예입니다:

git cherry-pick -m 2 7a39eb0