최근에 커밋을 cherry-pick
하라는 요청을 받았습니다.
그렇다면 git에서 커밋을 선택한다는 것은 무엇을 의미합니까? 어떻게 합니까?
질문자 :Rahul
최근에 커밋을 cherry-pick
하라는 요청을 받았습니다.
그렇다면 git에서 커밋을 선택한다는 것은 무엇을 의미합니까? 어떻게 합니까?
Git에서 체리 피킹은 한 브랜치에서 커밋을 선택하여 다른 브랜치에 적용하는 것을 의미합니다.
이것은 일반적으로 다른 분기에 많은 커밋을 적용하는 merge
및 rebase
와 같은 다른 방법과 대조됩니다.
커밋을 적용하려는 지점에 있는지 확인하십시오.
git switch master
다음을 실행합니다.
git cherry-pick <commit-hash>
주의:
공공 지점에서 선택하는 경우 다음을 사용하는 것을 고려해야 합니다.
git cherry-pick -x <commit-hash>
이것은 표준화된 커밋 메시지를 생성합니다. 이런 식으로 당신(그리고 당신의 동료)은 여전히 커밋의 출처를 추적할 수 있고 미래에 병합 충돌을 피할 수 있습니다.
커밋에 메모가 첨부되어 있으면 체리 픽을 따르지 않습니다. 그것들을 가져 오려면 다음을 사용해야합니다.
git notes copy <from> <to>
추가 링크:
이 인용문은 다음에서 가져왔습니다. Git으로 버전 관리 (정말 훌륭한 책, git에 관심이 있다면 구입하는 것이 좋습니다)
편집: 이 답변은 여전히 인상을 받고 있으므로 이에 대한 매우 멋진 실제 비디오 자습서를 추가하고 싶습니다.
git cherry-pick 사용 git cherry-pick commit 명령은 명명된 커밋에 의해 도입된 변경 사항을 현재 분기에 적용합니다. 새롭고 뚜렷한 커밋을 소개합니다. 엄밀히 말하면 git cherry-pick을 사용하면 저장소 내의 기존 기록이 변경되지 않습니다. 대신 역사에 추가됩니다. diff 적용 과정을 통해 변경 사항을 도입하는 다른 Git 작업과 마찬가지로 주어진 커밋의 변경 사항을 완전히 적용하려면 충돌을 해결해야 할 수도 있습니다 . git cherry-pick 명령은 일반적으로 저장소 내의 한 분기에서 다른 분기로 특정 커밋을 도입하는 데 사용됩니다. 일반적인 용도는 유지 관리 분기에서 개발 분기로 커밋을 전달 또는 백포트하는 것입니다.
$ git checkout rel_2.3 $ git cherry-pick dev~2 # commit F, below
전에:
후에:
Git의 체리 따기는 한 브랜치에서 다른 브랜치로 커밋을 적용하도록 설계되었습니다. 예를 들면 할 수 있습니다. 실수를 하여 잘못된 브랜치로 변경했지만 전체 브랜치를 병합하고 싶지 않습니다. 예를 들면 다음과 같습니다. 커밋을 되돌리고 다른 브랜치에서 체리 선택하십시오.
그것을 사용하려면 git cherry-pick hash
. 여기서 hash
는 다른 브랜치의 커밋 해시입니다.
전체 절차는 다음을 참조하십시오. http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
상황의 짧은 예, 체리 픽이 필요할 때
다음 시나리오를 고려하십시오. 두 개의 지점이 있습니다.
a) 릴리스1 - 이 분기는 고객에게 전달되지만 아직 수정해야 할 몇 가지 버그가 있습니다.
b) 마스터 - 예를 들어 릴리스2에 대한 기능을 추가할 수 있는 클래식 마스터 분기.
NOW : release1 에서 수정했습니다. 물론 master 에서도 이 수정 사항이 필요합니다. 그리고 이것은 체리 따기의 일반적인 사용 사례입니다. 따라서 이 시나리오에서 체리 픽은 release1 브랜치 에서 커밋을 가져와 마스터 브랜치에 포함하는 것을 의미합니다.
체리픽 이 하는 단계적인 일러스트레이션 과 이 일러스트레이션의 애니메이션을 준비했습니다 (마지막에 가깝습니다).
메모:
커밋 L'
은 사용자의 관점에서(커밋 = 스냅샷) L
의 정확한 복사본입니다.
기술적으로(내부적으로) 이것은 새롭고 다른 커밋입니다(예를 들어 L
K
대한 포인터(부모) L'
E
대한 포인터가 포함되어 있기 때문입니다.
체리픽은 Git 기능입니다. 누군가 한 브랜치의 특정 커밋을 대상 브랜치에 커밋하려는 경우 체리 픽이 사용됩니다.
git cherry-pick 단계는 다음과 같습니다.
git cherry-pick <commit id>
여기서 commit id는 다른 브랜치의 액티비티 id입니다.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
체리 픽이 리베이스와 비슷하거나 오히려 리베이스처럼 관리된다고 생각할 수 있습니다. 즉, 기존 커밋을 가져와 현재 있는 브랜치의 헤드를 시작점으로 하여 다시 생성한다는 뜻입니다.
rebase
는 부모 X가 있는 커밋을 가져와 실제로 부모 Y가 있는 것처럼 커밋을 재생성합니다. 이것이 바로 cherry-pick
이 하는 일입니다.
체리 픽은 커밋을 선택하는 방법에 관한 것입니다. pull
(rebase)을 사용하면 git이 분기로 가져온 내용 위에 로컬 커밋을 암시적으로 재생성하지만, cherry-pick
하면 일부 커밋을 명시적으로 선택하고 현재 분기 위에 암시적으로 다시 생성합니다.
따라서 수행하는 방식은 다르지만 내부적으로는 커밋 재생성과 매우 유사한 작업입니다.
현재 브랜치에 특정 커밋을 적용합니다.
이것은 다음을 의미합니다.
예: 커밋 A 고려
added newFileA modified main: + import './newFileA'
커밋 B
added newFileB modified main: + import './newFileB'
다른 브랜치에서 커밋 B 를 선택하면 다음과 같이 됩니다.
/newFileB /main : import './newFileA' import './newFileB'
커밋 B 에는 newFileB 와 main 이 포함되어 있지만 newFileA 는 포함되어 있지 않기 때문에 버그가 발생하므로 주의해서 사용하십시오.
복사(어딘가에서) 및 붙여넣기(어딘가로)와 비슷하지만 특정 커밋에 대한 것입니다.
예를 들어 핫픽스를 수행하려는 경우 cherry-pick
기능을 사용할 수 있습니다.
개발 분기에서 cherry-pick
을 수행하고 해당 커밋을 릴리스 분기에 merge
마찬가지로 릴리스 분기에서 마스터 cherry-pick
을 수행하십시오. 짜잔
프로젝트에서 개발자 팀과 함께 작업할 때 여러 git 브랜치 간의 변경 사항을 관리하는 것은 복잡한 작업이 될 수 있습니다. 때로는 전체 분기를 다른 분기로 병합하고 싶지 않고 하나 또는 두 개의 특정 커밋만 선택하면 됩니다. 이 과정을 '체리 따기'라고 합니다.
체리 따기에 대한 훌륭한 기사를 찾았습니다. 자세한 내용은 https://www.previousnext.com.au/blog/intro-cherry-picking-git에서 확인하세요.
커밋 ID 없이 병합하려면 이 명령을 사용할 수 있습니다.
git cherry-pick master~2 master~0
위의 명령은 마스터의 마지막 세 커밋을 1에서 3으로 병합합니다.
단일 커밋에 대해이 작업을 수행하려면 마지막 옵션을 제거하십시오.
git cherry-pick master~2
이렇게하면 마스터 끝에서 세 번째 커밋을 병합합니다.
공식 문서에서 발췌:
하나 이상의 기존 커밋이 주어지면 각 커밋이 도입하는 변경 사항을 적용하고 각각에 대한 새 커밋을 기록합니다. 이를 위해서는 작업 트리가 깨끗해야 합니다(HEAD 커밋에서 수정 사항 없음).
변경 사항을 적용하는 방법이 명확하지 않은 경우 다음이 발생합니다.
현재 분기 및 HEAD 포인터는 성공적으로 수행된 마지막 커밋에 유지됩니다.
CHERRY_PICK_HEAD ref는 적용하기 어려운 변경 사항을 도입한 커밋을 가리키도록 설정됩니다.
변경 사항이 깔끔하게 적용된 경로는 인덱스 파일과 작업 트리 모두에서 업데이트됩니다.
충돌하는 경로의 경우 인덱스 파일은 git-merge의 "TRUE MERGE" 섹션에 설명된 대로 최대 세 가지 버전을 기록합니다. 작업 트리 파일에는 일반적인 충돌 표시자 <<<<<< 및 >>>>>>>로 묶인 충돌에 대한 설명이 포함됩니다.
다른 수정 사항은 없습니다.
출처 : http:www.stackoverflow.com/questions/9339429/what-does-cherry-picking-a-commit-with-git-mean
Python에서 수동으로 예외 발생(던지기) (0) | 2021.11.11 |
---|---|
Flash CS4가 놓기를 거부합니다. (0) | 2021.11.11 |
주어진 키가 사전에 이미 존재하는지 확인 (0) | 2021.11.11 |
사전을 반복하는 가장 좋은 방법은 무엇입니까? [닫은] (0) | 2021.11.11 |
내 JavaScript 코드는 "요청된 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다" 오류를 수신하지만 Postman은 그렇지 않은 이유는 무엇입니까? (0) | 2021.11.10 |