development

체리 픽 후 git merge는 어떻게 작동합니까?

big-blog 2020. 5. 20. 08:22
반응형

체리 픽 후 git merge는 어떻게 작동합니까?


master지점 이 있다고 상상해 봅시다 .

그런 다음 newbranch

git checkout -b newbranch

그리고 두 개의 새로운 커밋을 newbranch: commit1commit2

그런 다음 마스터로 전환하고 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

반응형