master
지점 이 있다고 상상해 봅시다 .
그런 다음 newbranch
git checkout -b newbranch
그리고 두 개의 새로운 커밋을 newbranch
: commit1 및 commit2
그런 다음 마스터로 전환하고 cherry-pick
git checkout master
git cherry-pick hash_of_commit1
를 살펴보면 gitk
우리하면 해당 참조 commit1 때문에 기술적으로 두 개의 서로 다른 커밋은, 그 체리 고른 버전은 서로 다른 해시를 가지고있다.
마지막으로 우리는 다음과 같이 합병 newbranch
합니다 master
.
git merge newbranch
서로 다른 해시를 가진이 두 커밋은 동일한 변경 사항이 두 번 적용되어야하므로 그 중 하나가 실패해야 함을 의미하지만 문제없이 병합되었습니다.
git은 병합하는 동안 실제로 커밋 내용을 현명하게 분석하고 변경 사항을 두 번 적용해서는 안되거나 이러한 커밋이 내부적으로 연결된 것으로 표시됩니까?
답변
짧은 답변
걱정하지 마십시오. 힘내가 처리합니다.
긴 대답
예를 들어 SVN 1 과 달리 Git은 커밋을 델타 형식으로 저장하지 않지만 스냅 샷 기반 2,3 입니다. SVN은 병합 된 각 커밋을 패치로 순진하게 적용하려고 시도하지만 (설명한 정확한 이유로 실패) Git은 일반적 으로이 시나리오를 처리 할 수 있습니다.
병합 할 때 Git은 두 HEAD 커밋의 스냅 샷을 새로운 스냅 샷으로 결합하려고 시도합니다. 코드 또는 파일의 일부가 두 스냅 샷에서 동일하면 (즉, 커밋이 이미 체리 선택 되었기 때문에) Git은이를 만지지 않습니다.
출처
답변
이러한 병합 후에는 역사에서 체리 피킹 커밋이 두 번있을 수 있습니다.
이것을 피하기위한 해결책 은 중복 (체리 피킹) 커밋이있는 브랜치에 대해 권장하는 기사 에서 인용 하기 전에 병합 전에 rebase를 사용합니다.
git cherry-pick 후 git merge : 중복 커밋 피하기
마스터 브랜치와 브랜치 b가 있다고 상상해보십시오.
o---X <-- master \ b1---b2---b3---b4 <-- b
이제 우리는 커밋 b1과 b3을 긴급히 필요하지만 b의 나머지 커밋은 필요하지 않습니다. 우리가하는 일은 마스터 브랜치와 체리 픽 커밋 b1과 b3을 체크 아웃하는 것입니다.
$ git checkout master $ git cherry-pick "b1's SHA" $ git cherry-pick "b3's SHA"
결과는 다음과 같습니다.
o---X---b1'---b3' <-- master \ b1---b2---b3---b4 <-- b
마스터에 대한 또 다른 커밋을 수행하면 다음과 같은 결과를 얻습니다.
o---X---b1'---b3'---Y <-- master \ b1---b2---b3---b4 <-- b
이제 브랜치 b를 마스터로 병합한다면 :
$ git merge b
우리는 다음을 얻을 것입니다 :
o---X---b1'---b3'---Y--- M <-- master \ / b1----b2----b3----b4 <-- b
이는 b1 및 b3에 의해 도입 된 변경 사항이 기록에 두 번 나타남을 의미합니다. 병합 대신 리베이스 할 수있는 것을 피하려면 :
$ git rebase master b
어느 것이 산출 될까요?
o---X---b1'---b3'---Y <-- master \ b2'---b4' <-- b
드디어:
$ git checkout master $ git merge b
우리에게 주어지다:
o---X---b1'---b3'---Y---b2'---b4' <-- master, b
David Lemon의 의견에 의해 수정 된 수정