Cherry-pick 변경 사항

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

GitLab 14.0에서 pick_into_project 기능 플래그가 제거되었습니다.

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

  • 기본 브랜치에서 이전 릴리스 브랜치로 버그 수정을 백포트합니다.
  • 포크에서 변경된 내용을 상위 저장소로 복사합니다.

GitLab UI를 사용하여 프로젝트 또는 프로젝트 포크로부터 단일 커밋이나 전체 병합 요청의 내용을 cherry-pick하세요.

이 예에서 Git 저장소에는 developmain 두 개의 브랜치가 있습니다. 커밋 Bmain 브랜치의 커밋 E 뒤에 develop 브랜치에서 cherry-pick됩니다. 커밋 G는 cherry-pick 이후에 추가됩니다:

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"

병합 요청에서 모든 변경 사항을 cherry-pick하기

병합 요청이 병합된 후, 해당 병합 요청에 의해 도입된 모든 변경 사항을 cherry-pick할 수 있습니다. 병합 요청은 상류 프로젝트 또는 하류 포크에 있을 수 있습니다.

필수 조건:

  • 병합 요청을 편집하고 리포지토리에 코드를 추가할 수 있는 프로젝트 내 권한이 있어야 합니다.
  • 프로젝트는 프로젝트의 Settings > Merge requests에서 설정한 병합 방법인 Merge Commit을 사용해야 합니다.

    GitLab 16.9 이상에서는 FF(fast-forwarded) 커밋이 단일 커밋으로 통합된 경우 또는 병합 요청에 단일 커밋이 있는 경우에만 GitLab UI에서 FF 커밋을 cherry-pick할 수 있습니다. 언제든지 단일 커밋을 cherry-pick할 수 있습니다.

수행 방법:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. Code > 병합 요청을 선택하고 병합 요청을 찾습니다.
  3. 병합 요청 보고 섹션으로 스크롤하여 병합자 보고를 찾습니다.
  4. 보고서의 오른쪽 상단에서 Cherry-pick을 선택합니다:

    병합 요청 cherry-pick

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

단일 커밋 cherry-pick하기

GitLab 프로젝트에서 여러 위치에서 단일 커밋을 cherry-pick할 수 있습니다.

프로젝트의 커밋 목록에서

프로젝트의 모든 커밋 목록에서 커밋을 cherry-pick하려면 다음을 수행합니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. Code > 커밋을 선택합니다.
  3. cherry-pick하려는 커밋의 제목을 선택합니다.
  4. 오른쪽 상단에서 옵션 > Cherry-pick을 선택합니다.
  5. cherry-pick 대화 상자에서 cherry-pick할 프로젝트와 브랜치를 선택합니다.
  6. 선택 사항. 이 변경으로 새로운 병합 요청 시작를 선택합니다.
  7. Cherry-pick을 선택합니다.

저장소의 파일 보기에서

프로젝트의 Git 저장소에서 파일을 보고 있을 때 개별 파일에 영향을 미친 이전 커밋 목록에서 cherry-pick할 수 있습니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. Code > 저장소를 선택합니다.
  3. 커밋에서 변경된 파일로 이동합니다. 오른쪽 상단에서 History를 선택합니다.
  4. cherry-pick하려는 커밋의 제목을 선택합니다.
  5. 오른쪽 상단에서 옵션 > Cherry-pick을 선택합니다.
  6. cherry-pick 대화 상자에서 cherry-pick할 프로젝트와 브랜치를 선택합니다.
  7. 선택 사항. 이 변경으로 새로운 병합 요청 시작를 선택합니다.
  8. Cherry-pick을 선택합니다.

명령줄에서

git 명령줄 인터페이스를 사용하여 하나의 브랜치에서 다른 브랜치로 커밋을 cherry-pick할 수 있습니다.

이 예에서는 피처 브랜치(feature)에서 다른 브랜치(develop)로 커밋을 cherry-pick합니다.

  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 브랜치로 커밋을 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 추적

시스템 노트는 새로운 커밋과 기존의 병합 요청을 상호 연결합니다. 각 배포의 관련 병합 요청 목록에는 cherry-pick된 병합 커밋이 포함됩니다.

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

관련 주제

문제 해결

cherry-pick할 때 다른 부모 커밋 선택하기

GitLab UI에서 병합 커밋을 cherry-pick할 때, 주선은 항상 첫 번째 부모입니다. 명령줄을 사용하여 다른 주선으로 cherry-pick하세요.

다음은 두 번째 부모를 주선으로 사용하여 병합 커밋을 cherry-pick하는 빠른 예시입니다:

git cherry-pick -m 2 7a39eb0