체리 픽 후 git merge는 어떻게 작동합니까?
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은이를 만지지 않습니다.
출처
1 Subversion의 Skip-Deltas
2 Git 기초
3 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의 의견에 의해 수정 된 수정
참고URL : https://stackoverflow.com/questions/14486122/how-does-git-merge-after-cherry-pick-work
'development' 카테고리의 다른 글
UIImageView에서 이미지 변경을 애니메이션으로 만드는 방법은 무엇입니까? (0) | 2020.05.20 |
---|---|
가장 우아한 방법으로 팝업 표시 (0) | 2020.05.20 |
AngularJS 지시어 란 무엇입니까? (0) | 2020.05.20 |
PostgreSQL 용 GUI 도구 (0) | 2020.05.20 |
절대 위치 div를 확장하여 부모 div 높이 확장 (0) | 2020.05.20 |