programing

체리픽 작업 후 깃은 어떻게 합쳐집니까?

css3 2023. 7. 4. 22:02

체리픽 작업 후 깃은 어떻게 합쳐집니까?

우리가 가지고 있는 것을 상상해 봅시다.master분점.

그런 다음 다음 다음을 만듭니다.newbranch

git checkout -b newbranch

그리고 두 번의 새로운 약속을 합니다.newbranchcommit1commit2

그런 다음 마스터로 전환하여 제작합니다.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 하위 버전의 델타 건너뛰기
2 깃 베이직스
3 Git 객체 모델

이러한 병합 후 역사에서 선택된 커밋이 두 번 있을 수 있습니다.

병합하기 전에 중복(체리 선택) 커밋이 있는 분기에 사용을 권장하는 문서에서 이 I 인용을 방지하는 솔루션:

git 체리 픽 후 git 병합: 중복 커밋 방지

마스터 브랜치와 브랜치 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

데이비드 레몬의 논평에 의해 추정된 수정 사항 편집

언급URL : https://stackoverflow.com/questions/14486122/how-does-git-merge-after-cherry-pick-work