Mercurial에서 병합을 취소하고 나중에 해당 분기로 다시 병합하려면 어떻게해야합니까?
두 개의 분기, default 및 branch1이 있습니다. 실수로 우리 팀의 한 사람이 branch1을 기본값으로 병합했습니다. branch1의 콘텐츠는 아직 기본값과 병합 할 준비가되지 않았습니다 (빌드 및 배포 환경의 주요 재 작업 포함).
우리는 병합을 제거하는 'hg backout'으로 실험을했습니다 (올바른 방법인지 확실하지 않음). 그런 다음 branch1의 변경 사항은 기본적으로 삭제됩니다. 괜찮지 만 branch1로 다시 병합 할 수는 없습니다.
이 문제를 어떻게 해결해야합니까?
여기에는이 작업을 수행 할 수있는 많은 시나리오가 있습니다. 각 시나리오를 헤드 라인으로 만들어 해당 사례에 맞는 시나리오를 찾을 수 있습니다. 나는 여전히 Mercurial을 배우고 있으며, 내가 말한 것이 잘못된 경우, 잘못된 용어를 사용하여 더 잘 할 수있는 경우에 대한 조언을 원합니다.
추가 변경 없음, 병합되지 않음 (푸시 / 풀링 없음)
프로그래머가 병합했지만 다른 작업을 수행하지 않았으며 어떤 식 으로든 변경 사항을 누구와도 공유하지 않았습니다.
이 경우 로컬 복제본을 버리고 안전한 저장소에서 새 복제본을 가져 오면됩니다.
병합이 아닌 공유되지 않은 로컬 변경
프로그래머는 합병되었고 그 합병을 기반으로 계속 작업했습니다. 병합 이후의 변경 집합은 유지되어야하지만 병합 자체는 제거되어야합니다. 변경 사항 (병합 + 다음 변경 세트)이 누구와도 공유되지 않았습니다.
이 경우 네 가지 중 하나를 수행합니다.
- REBASE 확장을 사용하면 변경 집합이 한 위치에서 다른 위치로 이동합니다. 변경 집합이 병합과 함께 도입 된 코드 변경을 기반으로하는 경우 차이점을 조정하기 위해 몇 가지 수동 작업을 수행해야합니다.
- MQ 확장을 사용하여 패치 큐에 보관할 변경 집합을 가져온 다음 다른 위치에 다시 밀어 넣으십시오. 그러나 이것은 병합에 따른 변경 측면에서 REBASE 확장과 동일한 문제가 있습니다.
- TRANSPLANT 확장을 사용하여 한 위치에서 다른 위치로 변경 사항을 "복사"하십시오. 그래도 처음 두 사람과 같은 문제가 있습니다.
- 다시 작업을 수행하십시오. 아마도 diffing 도구를 사용하여 삭제하려는 변경 세트에서 변경을 수행하고 올바른 위치에서 다시 수행하십시오.
병합 변경 집합 + 다음 변경 집합을 모두 제거하려면 몇 가지 옵션이 있습니다.
MQ 확장에서 strip 명령 사용
hg strip <hash of merge changeset>
복제 및 가져 오기 및 병합을 포함하지 않는 변경 집합의 해시를 지정합니다. 본질적으로 손상된 복제본에서 새 복제본으로 가져 와서 새 복제본을 만들고 원하지 않는 병합을 가져 오지 마십시오.
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'팁을 가져 오지 않은 경우에만 유용합니다.
나는이 정확한 문제가 있었다. 동료가 아직 불완전한 상태에서 실수로 내 브랜치를 기본 브랜치에 병합했습니다. 처음에는 브랜치를 기본값으로 병합하고 싶을 때까지 잘 작동하는 것처럼 보이는 병합을 취소했습니다. 필요한 파일은 병합시 삭제 표시되었습니다.
해결책은 동료의 실수를 고친 원본으로 돌아가서 다시 제거하는 것이 었습니다. 이로 인해 파일이 삭제 된 것으로 표시되지 않고 브랜치를 기본값으로 성공적으로 병합 할 수 있습니다.
'IT이야기' 카테고리의 다른 글
레일에서-%>와 %>의 차이 (0) | 2021.04.13 |
---|---|
StringBuilder 대 StringWriter 및 PrintWriter의 문자열 어셈블리 (0) | 2021.04.13 |
C- 구조체의 메모리 정렬 (0) | 2021.04.12 |
수행하기 위해 만들어진 F # 언어 (0) | 2021.04.12 |
Postgresql에서 누적 합계 계산 (0) | 2021.04.12 |