InfoGrab Docs

Git으로 변경 사항 체리픽

요약

커맨드 라인에서 git cherry-pick을 사용하면 기존 브랜치의 특정 변경 사항을 현재 브랜치에 복사합니다. GitLab UI에서 체리픽에 대한 자세한 내용은 변경 사항 체리픽을 참조하세요. 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:"...

커맨드 라인에서 git cherry-pick을 사용하면 기존 브랜치의 특정 변경 사항을 현재 브랜치에 복사합니다. 체리픽은 다음과 같은 경우에 유용합니다:

  • 새 기능을 포함하지 않고 이전 릴리스 브랜치에 버그 수정을 백포팅할 때.
  • 병합할 수 없는 브랜치의 작업을 재사용할 때.
  • 실험적인 변경 사항을 포함하지 않고 이전 릴리스에 소규모 기능을 백포팅할 때.
  • 개발 브랜치에 긴급 프로덕션 수정(핫픽스)을 적용할 때.
  • 포크에서 업스트림 저장소로 변경 사항을 복사할 때.

GitLab UI에서 체리픽에 대한 자세한 내용은 변경 사항 체리픽을 참조하세요.

커밋을 체리픽할 때 Git은:

  • 현재 브랜치에 동일한 변경 사항으로 새 커밋을 생성합니다.
  • 원본 커밋 메시지와 작성자 정보를 보존합니다.
  • 새 커밋 SHA를 생성합니다. (원본 커밋은 변경되지 않습니다.)
Mermaid 다이어그램 (18줄)
소스 코드 보기
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
    accTitle: Example of cherry-picking a commit
    accDescr: Commit B is copied from the develop branch to the main branch while leaving the original branch unchanged.

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"

git cherry-pick은 동일한 변경 사항이 있지만 서로 다른 보안 해시 알고리즘(SHA)을 가진 중복 커밋을 만들 수 있기 때문에 주의해서 사용하세요. 이로 인해 프로젝트 히스토리가 복잡해질 수 있습니다. 먼저 다음과 같은 대안을 고려하세요:

  • 브랜치의 변경 사항 대부분이 필요하고 브랜치 히스토리가 깨끗하면 전체 브랜치를 현재 브랜치로 병합하세요.
  • 원본 커밋에 새 브랜치에서 필요하지 않은 복잡한 의존성이 있는 경우 이전 커밋을 체리픽하는 대신 새 커밋을 만드세요.

다른 브랜치에 커밋 하나 적용#

현재 작업 브랜치에 단일 커밋을 체리픽하려면:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어:

    $ git log
    
    commit abc123f
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Fixes a regression we found yesterday
    
  2. 체리픽할 브랜치로 체크아웃합니다:

    git checkout release
    
  3. git cherry-pick 명령을 사용하여 피처 브랜치에서 release 브랜치로 커밋 abc123f를 복사합니다. abc123f를 확인한 커밋의 SHA로 교체하세요:

    git cherry-pick abc123f
    

Git은 abc123f 커밋의 변경 사항을 release 브랜치로 복사하고, 충돌이 발생하면 알림을 표시합니다. 충돌을 해결하고 체리픽 프로세스를 계속합니다. abc123f 커밋의 내용이 필요한 각 브랜치에 대해 반복합니다.

다른 브랜치에 여러 커밋 적용#

필요한 코드가 여러 커밋에 걸쳐 추가된 경우 각 커밋을 원하는 대상 브랜치로 체리픽합니다:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어 코드 변경이 하나의 커밋에 있고 개선된 테스트 커버리지가 다음 커밋에 있는 경우:

    $ git log
    
    commit abc123f
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Fixes a regression we found yesterday
    
    commit ghi456j
    Merge: 44444666666 cccccdddddd
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Adds tests to ensure the problem does not happen again
    
  2. 체리픽할 브랜치(release)를 체크아웃합니다:

    git checkout release
    
  3. release 브랜치로 커밋을 복사합니다.

    • 각 커밋을 개별적으로 release 브랜치로 복사하려면 각 커밋에 대해 git cherry-pick 명령을 사용합니다. abc123fghi456j를 원하는 커밋의 SHA로 교체하세요:

      git cherry-pick abc123f
      git cherry-pick ghi456j
      ...
      
    • SHA를 사용하여 시작과 끝을 표시하는 커밋 범위를 release 브랜치로 체리픽하려면 .. 표기법을 사용합니다. 이 명령은 abc123fghi456j 사이의 모든 커밋을 적용합니다:

      git cherry-pick abc123f..ghi456j
      

전체 브랜치의 내용 복사#

브랜치의 머지 커밋을 체리픽하면 브랜치의 모든 변경 사항이 현재 작업 브랜치에 복사됩니다. 머지 커밋을 체리픽하려면 -m 플래그가 필요합니다. 이 플래그는 어떤 부모 커밋을 사용할지 Git에 알려줍니다. 머지 커밋은 생성 방법에 따라 여러 부모 커밋을 가질 수 있습니다.

간단한 경우 -m 1은 첫 번째 부모를 사용하며, 이는 브랜치의 머지 커밋입니다. 두 번째 부모를 지정하려면 -m 2를 사용합니다. 이는 종종 피처 브랜치가 병합되기 전의 마지막 커밋입니다. 이 플래그는 Git이 현재 브랜치에 적용할 변경 사항을 결정합니다.

현재 작업 브랜치에 feature-1 브랜치의 머지 커밋을 체리픽하려면:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어:

    $ git log
    
    commit 987pqr6
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Merges feature-1 into main
    
  2. 체리픽할 브랜치를 체크아웃합니다:

    git checkout feature-2
    
  3. -m 옵션과 메인라인으로 사용할 부모 커밋의 인덱스와 함께 git cherry-pick 명령을 사용합니다. <merge-commit-hash>를 머지 커밋의 SHA로, <parent_index>를 부모 커밋의 인덱스로 교체하세요. 인덱스는 1부터 시작합니다. 예를 들어:

    # git cherry-pick -m <parent_index> <merge-commit-hash>
    git cherry-pick -m 1 987pqr6
    

이 명령을 실행하면 Git은 987pqr6 머지 커밋의 내용을 feature-2 브랜치에 복사합니다. 머지 커밋 987pqr6 대신 feature-1 브랜치의 마지막 커밋을 사용하려면 -m 2를 사용하세요.

관련 주제#

트러블슈팅#

체리픽 중 충돌이 발생하는 경우:

  1. 영향을 받는 파일에서 충돌을 수동으로 해결합니다.

  2. 해결된 파일을 스테이징합니다:

    git add <resolved_file>
    
  3. 체리픽 프로세스를 계속합니다:

    git cherry-pick --continue
    

체리픽 프로세스를 중단하고 이전 상태로 돌아가려면 다음 명령을 사용합니다:

git cherry-pick --abort

이 명령은 체리픽 프로세스 중에 변경된 모든 내용을 취소합니다.

Git으로 변경 사항 체리픽

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

커맨드 라인에서 git cherry-pick을 사용하면 기존 브랜치의 특정 변경 사항을 현재 브랜치에 복사합니다. GitLab UI에서 체리픽에 대한 자세한 내용은 변경 사항 체리픽을 참조하세요. 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:"...

커맨드 라인에서 git cherry-pick을 사용하면 기존 브랜치의 특정 변경 사항을 현재 브랜치에 복사합니다. 체리픽은 다음과 같은 경우에 유용합니다:

  • 새 기능을 포함하지 않고 이전 릴리스 브랜치에 버그 수정을 백포팅할 때.
  • 병합할 수 없는 브랜치의 작업을 재사용할 때.
  • 실험적인 변경 사항을 포함하지 않고 이전 릴리스에 소규모 기능을 백포팅할 때.
  • 개발 브랜치에 긴급 프로덕션 수정(핫픽스)을 적용할 때.
  • 포크에서 업스트림 저장소로 변경 사항을 복사할 때.

GitLab UI에서 체리픽에 대한 자세한 내용은 변경 사항 체리픽을 참조하세요.

커밋을 체리픽할 때 Git은:

  • 현재 브랜치에 동일한 변경 사항으로 새 커밋을 생성합니다.
  • 원본 커밋 메시지와 작성자 정보를 보존합니다.
  • 새 커밋 SHA를 생성합니다. (원본 커밋은 변경되지 않습니다.)
Mermaid 다이어그램 (18줄)
소스 코드 보기
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
    accTitle: Example of cherry-picking a commit
    accDescr: Commit B is copied from the develop branch to the main branch while leaving the original branch unchanged.

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"

git cherry-pick은 동일한 변경 사항이 있지만 서로 다른 보안 해시 알고리즘(SHA)을 가진 중복 커밋을 만들 수 있기 때문에 주의해서 사용하세요. 이로 인해 프로젝트 히스토리가 복잡해질 수 있습니다. 먼저 다음과 같은 대안을 고려하세요:

  • 브랜치의 변경 사항 대부분이 필요하고 브랜치 히스토리가 깨끗하면 전체 브랜치를 현재 브랜치로 병합하세요.
  • 원본 커밋에 새 브랜치에서 필요하지 않은 복잡한 의존성이 있는 경우 이전 커밋을 체리픽하는 대신 새 커밋을 만드세요.

다른 브랜치에 커밋 하나 적용#

현재 작업 브랜치에 단일 커밋을 체리픽하려면:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어:

    $ git log
    
    commit abc123f
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Fixes a regression we found yesterday
    
  2. 체리픽할 브랜치로 체크아웃합니다:

    git checkout release
    
  3. git cherry-pick 명령을 사용하여 피처 브랜치에서 release 브랜치로 커밋 abc123f를 복사합니다. abc123f를 확인한 커밋의 SHA로 교체하세요:

    git cherry-pick abc123f
    

Git은 abc123f 커밋의 변경 사항을 release 브랜치로 복사하고, 충돌이 발생하면 알림을 표시합니다. 충돌을 해결하고 체리픽 프로세스를 계속합니다. abc123f 커밋의 내용이 필요한 각 브랜치에 대해 반복합니다.

다른 브랜치에 여러 커밋 적용#

필요한 코드가 여러 커밋에 걸쳐 추가된 경우 각 커밋을 원하는 대상 브랜치로 체리픽합니다:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어 코드 변경이 하나의 커밋에 있고 개선된 테스트 커버리지가 다음 커밋에 있는 경우:

    $ git log
    
    commit abc123f
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Fixes a regression we found yesterday
    
    commit ghi456j
    Merge: 44444666666 cccccdddddd
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Adds tests to ensure the problem does not happen again
    
  2. 체리픽할 브랜치(release)를 체크아웃합니다:

    git checkout release
    
  3. release 브랜치로 커밋을 복사합니다.

    • 각 커밋을 개별적으로 release 브랜치로 복사하려면 각 커밋에 대해 git cherry-pick 명령을 사용합니다. abc123fghi456j를 원하는 커밋의 SHA로 교체하세요:

      git cherry-pick abc123f
      git cherry-pick ghi456j
      ...
      
    • SHA를 사용하여 시작과 끝을 표시하는 커밋 범위를 release 브랜치로 체리픽하려면 .. 표기법을 사용합니다. 이 명령은 abc123fghi456j 사이의 모든 커밋을 적용합니다:

      git cherry-pick abc123f..ghi456j
      

전체 브랜치의 내용 복사#

브랜치의 머지 커밋을 체리픽하면 브랜치의 모든 변경 사항이 현재 작업 브랜치에 복사됩니다. 머지 커밋을 체리픽하려면 -m 플래그가 필요합니다. 이 플래그는 어떤 부모 커밋을 사용할지 Git에 알려줍니다. 머지 커밋은 생성 방법에 따라 여러 부모 커밋을 가질 수 있습니다.

간단한 경우 -m 1은 첫 번째 부모를 사용하며, 이는 브랜치의 머지 커밋입니다. 두 번째 부모를 지정하려면 -m 2를 사용합니다. 이는 종종 피처 브랜치가 병합되기 전의 마지막 커밋입니다. 이 플래그는 Git이 현재 브랜치에 적용할 변경 사항을 결정합니다.

현재 작업 브랜치에 feature-1 브랜치의 머지 커밋을 체리픽하려면:

  1. 체리픽할 커밋의 SHA를 확인합니다. 커밋 히스토리를 확인하거나 git log 명령을 사용하세요. 예를 들어:

    $ git log
    
    commit 987pqr6
    Merge: 88888999999 aaaaabbbbbb
    Author: user@example.com
    Date:   Tue Aug 31 21:19:41 2021 +0000
    
        Merges feature-1 into main
    
  2. 체리픽할 브랜치를 체크아웃합니다:

    git checkout feature-2
    
  3. -m 옵션과 메인라인으로 사용할 부모 커밋의 인덱스와 함께 git cherry-pick 명령을 사용합니다. <merge-commit-hash>를 머지 커밋의 SHA로, <parent_index>를 부모 커밋의 인덱스로 교체하세요. 인덱스는 1부터 시작합니다. 예를 들어:

    # git cherry-pick -m <parent_index> <merge-commit-hash>
    git cherry-pick -m 1 987pqr6
    

이 명령을 실행하면 Git은 987pqr6 머지 커밋의 내용을 feature-2 브랜치에 복사합니다. 머지 커밋 987pqr6 대신 feature-1 브랜치의 마지막 커밋을 사용하려면 -m 2를 사용하세요.

관련 주제#

트러블슈팅#

체리픽 중 충돌이 발생하는 경우:

  1. 영향을 받는 파일에서 충돌을 수동으로 해결합니다.

  2. 해결된 파일을 스테이징합니다:

    git add <resolved_file>
    
  3. 체리픽 프로세스를 계속합니다:

    git cherry-pick --continue
    

체리픽 프로세스를 중단하고 이전 상태로 돌아가려면 다음 명령을 사용합니다:

git cherry-pick --abort

이 명령은 체리픽 프로세스 중에 변경된 모든 내용을 취소합니다.