2014-03-12 6 views
0

일부 로컬 커밋을 수행했습니다.HG에서 가장 최근 커밋을 푸시는 방법

그러나 나는 으로 가장 최근의 것을 4977과 4978과 같이 푸시합니다. 이전의 것을 제외한.

4948 local commit 1 is the ancestor of all commits 

은 어떤 하나 HG

4978 local commit 4 
    | 
    | 
    | 
4977 local commit 3 
    | 
    | 
    | 
4976 local commit 2 
    | 
    | 
    | 
4948 local commit 1 

답변

2

Mercurial 리포지토리는 불변의 이력을 갖도록되어 있으므로 상자 밖에서는 불가능합니다. 그러나 이에 대한 해결 방법이 있습니다.

가능하면 가장 쉬운 방법은 histedit extension입니다. 그런 다음 명령 줄에서 histedit 하위 명령을 실행할 수있는 다음과 같은

[extensions] 
histedit = 

로 .hgrc (또는 mercurial.ini)를 수정하여 사용하고 다시 멀리 변경 집합으로보고 그것을 말할 필요가 당신 '

hg histedit 4948 

이 각각 변경 집합 옆에있는 단어 pick와 텍스트 편집기를 나타납니다 ...에 대한 관심을 다시. 더 이상 원하지 않는 변경 집합에 대해 pickdrop으로 변경하고 저장하고 종료하면 문제 변경 집합이 사라집니다.

로컬 저장소에서 변경 세트를 제거하고 리모컨으로 푸시되는 것을 방지합니다.

+0

+1 좋은 답변입니다.나는 histedit을 "해결 방법"이라고 부르지 않을 것입니다. 그것은 Mercurial 도구 상자의 다른 도구 일뿐입니다. –

+0

감사합니다. 그리고 당신 말이 맞아요.하지만 음, 기술적으로 결코 histedit를 해결 방법이라고 부르지 않았다고 말할 수 있습니까? ;) –

+0

그래, 다시 읽으면, 나는 네 답이 좋다고 생각해. "해결 방법"은 문제를 암시한다고 생각했지만, 그런 의미는 아닙니다. –

1

에 당신은 밖으로 모든 조상뿐만 아니라 범 밀어으로 커밋 밀어 수 없음을 우리가 어떻게 알 수 있습니다. 그러나, "접기"/ "붕괴"/ "스쿼시"를 함께 사용하면 원하지 않는 조상을 제거 할 수 있습니다. 표준 histedit extension을 사용합니다.

단순히

$ histedit 4948 

를 실행하면 편집기가 열어 볼 수 있습니다. 이 편집에는 histedit에 대한 지침으로 사용될 파일이 포함되어 있습니다. 기본적으로 모든 변경 집합은 변경되지 않지만 행의 시작 부분에서 키워드를 변경하여 변경할 수 있습니다. 또한 해당 명령을 다시 정렬하여 해당 커밋을 재정렬 할 수 있습니다.

행의 시작 부분에있는 키워드를 fold으로 변경하면 histedit에 커밋과 이전 커밋을 결합하도록 지시합니다. 그런 식으로 당신이

4978 local commit 4 
    | 
    | 
    | 
4977 local commit 3 
    | 
    | 
    | 
4948 local commit 1 

따라서 귀하의 역사를 변경할 수 있습니다 "배"당신이 local commit 3local commit 2에서 변경.

+0

나는 'fold'가 묻는 사람이 찾고있는 결과를 얻지 못할 것이라고 생각합니다. 원래 접힌 변경 집합의 변경 내용은 여전히 ​​존재하며 계속 변경됩니다. 또한, 텍스트 편집기에서 changeset를 포함하는 줄을 삭제한다고해서 changeset을 삭제하는 것은 histedit에게 알려지지 않을 것입니다. (그것은'drop'이 무엇을위한 것입니까?) 대신 histedit에 어떤 방식 으로든 그 변경 집합을 수정하지 말 것을 지시합니다. 내 대답을 보라. –

+1

@mo. 'drop'에 대해 상기시켜 주셔서 감사합니다! 당신은 OP가 원하는 것만 큼은 아니지만 그것이 조상없이 커밋을 푸시하고자 할 때 당신이 의미하는 바에 달려 있다는 점에 틀림 없습니다. 커밋은 * 상태 *이므로 조상 상태가없는 상태를 밀어 넣는 것은 의미가 없습니다 .-) –