IT이야기

Mercurial에서 병합을 취소하고 나중에 해당 분기로 다시 병합

cyworld 2021. 4. 13. 21:49
반응형

Mercurial에서 병합을 취소하고 나중에 해당 분기로 다시 병합하려면 어떻게해야합니까?


두 개의 분기, default 및 branch1이 있습니다. 실수로 우리 팀의 한 사람이 branch1을 기본값으로 병합했습니다. branch1의 콘텐츠는 아직 기본값과 병합 할 준비가되지 않았습니다 (빌드 및 배포 환경의 주요 재 작업 포함).

우리는 병합을 제거하는 'hg backout'으로 실험을했습니다 (올바른 방법인지 확실하지 않음). 그런 다음 branch1의 변경 사항은 기본적으로 삭제됩니다. 괜찮지 만 branch1로 다시 병합 할 수는 없습니다.

이 문제를 어떻게 해결해야합니까?


여기에는이 작업을 수행 할 수있는 많은 시나리오가 있습니다. 각 시나리오를 헤드 라인으로 만들어 해당 사례에 맞는 시나리오를 찾을 수 있습니다. 나는 여전히 Mercurial을 배우고 있으며, 내가 말한 것이 잘못된 경우, 잘못된 용어를 사용하여 더 잘 할 수있는 경우에 대한 조언을 원합니다.

추가 변경 없음, 병합되지 않음 (푸시 / 풀링 없음)

프로그래머가 병합했지만 다른 작업을 수행하지 않았으며 어떤 식 으로든 변경 사항을 누구와도 공유하지 않았습니다.

이 경우 로컬 복제본을 버리고 안전한 저장소에서 새 복제본을 가져 오면됩니다.

병합이 아닌 공유되지 않은 로컬 변경

프로그래머는 합병되었고 그 합병을 기반으로 계속 작업했습니다. 병합 이후의 변경 집합은 유지되어야하지만 병합 자체는 제거되어야합니다. 변경 사항 (병합 + 다음 변경 세트)이 누구와도 공유되지 않았습니다.

이 경우 네 가지 중 하나를 수행합니다.

  1. REBASE 확장을 사용하면 변경 집합이 한 위치에서 다른 위치로 이동합니다. 변경 집합이 병합과 함께 도입 된 코드 변경을 기반으로하는 경우 차이점을 조정하기 위해 몇 가지 수동 작업을 수행해야합니다.
  2. MQ 확장을 사용하여 패치 큐에 보관할 변경 집합을 가져온 다음 다른 위치에 다시 밀어 넣으십시오. 그러나 이것은 병합에 따른 변경 측면에서 REBASE 확장과 동일한 문제가 있습니다.
  3. TRANSPLANT 확장을 사용하여 한 위치에서 다른 위치로 변경 사항을 "복사"하십시오. 그래도 처음 두 사람과 같은 문제가 있습니다.
  4. 다시 작업을 수행하십시오. 아마도 diffing 도구를 사용하여 삭제하려는 변경 세트에서 변경을 수행하고 올바른 위치에서 다시 수행하십시오.

병합 변경 집합 + 다음 변경 집합을 모두 제거하려면 몇 가지 옵션이 있습니다.

  1. MQ 확장에서 strip 명령 사용

    hg strip <hash of merge changeset>
    
  2. 복제 및 가져 오기 및 병합을 포함하지 않는 변경 집합의 해시를 지정합니다. 본질적으로 손상된 복제본에서 새 복제본으로 가져 와서 새 복제본을 만들고 원하지 않는 병합을 가져 오지 마십시오.

    hg clone damaged -r <hash of first parent> .
    hg pull damaged -r <hash of second parent>
    

다른 사용자에게 푸시 된 병합, 클론 제어

프로그래머가 마스터 리포지토리, 다른 사람 또는 프로그래머 리포지토리에서 가져온 누군가에게 푸시했습니다. 그러나 개발자 그룹과 마찬가지로 모든 저장소를 제어 할 수 있습니다.에서와 같이 더 많은 작업이 완료되기 전에 모든 사람에게 연락하고 대화 할 수 있습니다.

이 경우 1 단계 또는 2 단계를 수행 할 수 있는지 확인할 수 있지만 많은 곳에서 수행해야 할 수 있으므로 많은 작업이 필요할 수 있습니다.

병합 변경 집합을 기반으로 한 작업을 수행 한 사람이 없으면 1 단계 또는 2 단계를 사용하여 정리 한 다음 마스터 저장소로 푸시하고 모든 사람에게 마스터 저장소에서 새 복제본을 가져 오도록 요청합니다.

Merge pushed, you do n't have control over clones

프로그래머가 mergeset을 푸시했는데 누가 병합 변경 집합을 가질 지 알 수 없습니다. 즉, 당신은 그것을 근절에 성공하면 당신의 저장소, 여전히 다시 나타납니다있는 사람에서 길 잃은 푸시.

병합 변경 집합을 무시하고 전혀 발생하지 않은 것처럼 두 분기에서 작업하십시오. 이것은 매달린 머리를 남길 것입니다. 그런 다음 나중에 두 가지를 병합 할 때이 헤드에 대해 null 병합을 수행하여 제거 할 수 있습니다.

  M         <-- this is the one you want to disregard
 / \
*   *
|   |
*   *
|   |

두 지점에서 계속 작업하십시오.

|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

그런 다음 나중에 원하는 두 가지를 병합합니다.

  m
 / \
*   *
|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

그런 다음 널 병합을 수행하여 매달린 머리를 제거 할 수 있습니다. 불행히도 TortoiseHg를 통해서를 제외하고는 어떻게해야할지 모르겠습니다. 분기 중 하나에서 변경 사항을 취소 할 수있는 확인란이 있습니다.

TortoiseHg를 사용하여 유지하려는 병합 (맨 위, 소문자 m)으로 업데이트 한 다음 아래에 매달려있는 병합 헤드를 선택하고 마우스 오른쪽 버튼으로 클릭 한 다음 "병합 대상 (기타) 개정에서 모든 변경 사항 취소"를 선택합니다. : 대상에서 변경 사항 취소


우리는 병합을 제거하는 'hg backout'으로 실험을했습니다 (올바른 방법인지 확실하지 않음). 그런 다음 branch1의 변경 사항은 기본적으로 삭제됩니다. 괜찮지 만 branch1로 다시 병합 할 수는 없습니다.

병합 취소를 위해 백 아웃을 사용합니다. 리 머지 할 수는 없지만 "백 아웃 병합"을 할 수 있습니다. 즉, 리머지를 원할 때 "백 아웃 된 병합 변경 집합 ..."커밋에서 'hg 백 아웃'을 만든 다음 분기를 다시 병합합니다.

예:

  7     M       remerge
  6   /   \
  5   *   |     hg backout 3 (backout backout)
  4   |   *     fix error 
  3   *   |     hg backout 2
  2   M   |     fail merge
    /     \
  1 *     *
    |     |

훌륭한 의견을 보내 주신 모든 분들께 감사드립니다! 우리는 문제를 해결하기 위해 서두르고 있었고 우리 그룹은 Mercurial에 상대적으로 새로운 것이기 때문에 매우 실용적인 솔루션을 사용했습니다.

리포지토리 서버에서 새 리포지토리를 생성 한 다음 병합 직전 개정판까지 이전 리포지토리를 복제했습니다. 그런 다음 새 복제본을 서버에 푸시하고 모든 사람에게 새 링크를 보냈습니다. 다행히 우리는 아주 작은 개발 팀입니다.

아마도 문제를 해결하는 가장 조잡한 방법은 아니지만 효과가있었습니다. :)


병합을 멋지게 취소 할 수는 없습니다. IMO,이를 처리하는 가장 좋은 방법은 병합을 포기하고 병합 전부터 변경 집합을 계속하여 매달린 머리 (제거 할 수 있음)를 남겨 두는 것입니다. 병합 이후에 다른 변경 사항이 발생한 경우 새 "좋은"헤드에 다시 적용 할 수 있습니다.


이 대답은 당신이 이미 밀 었다고 가정합니다.

이것은 당신이 방금 잊은 것에 따라 (적어도 하나의) 해결되지 않은 머리를 초래할 것입니다. 누가 어떤 지점에서 밀 었는지에 따라 더 많이.

나는 HG를 사랑하고 그것을 열렬히 사용하지만, 그들의 가지에 대한 아이디어는 의도적으로 불변의 역사와 결합 될 때 누군가를 괴롭힐 수 있습니다.

나는 보통 이러한 이유로 분기 병합을 수행하기 전에 저장소의 백업을 (로컬로) 복제합니다. 나는 항상 당기기 전에 확인합니다.

Eric Raymond 당신이 설명한 것과 같은 상황에서 (희망적으로) 도움이 될 수있는 DVCS에 구애받지 않는 무언가작업 하고 있습니다. 그러나 나는 그가 HG 지원을 한두 주 동안 완전히 구현할 것이라고 생각하지 않습니다. 그래도 볼만한 가치가 있습니다.

그러나 아무도 'ooopsie'팁을 가져 오지 않은 경우에만 유용합니다.


나는이 정확한 문제가 있었다. 동료가 아직 불완전한 상태에서 실수로 내 브랜치를 기본 브랜치에 병합했습니다. 처음에는 브랜치를 기본값으로 병합하고 싶을 때까지 잘 작동하는 것처럼 보이는 병합을 취소했습니다. 필요한 파일은 병합시 삭제 표시되었습니다.

해결책은 동료의 실수를 고친 원본으로 돌아가서 다시 제거하는 것이 었습니다. 이로 인해 파일이 삭제 된 것으로 표시되지 않고 브랜치를 기본값으로 성공적으로 병합 할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/4152480/how-can-i-back-out-a-merge-in-mercurial-and-later-remerge-with-that-branch

반응형