2016-12-05 4 views
0

Bitbucket에서 호스팅되는 Mercurial 저장소를 포킹했습니다. 원본 저장소에 대한 쓰기 권한이 없습니다. 나는 포크에 여러 가지 커밋을했다. Mercurial에서 하나의 특정 커밋에 대해서만 pull 요청을하는 방법은 무엇입니까?

  • 를 저지 ---

    • D [최신]
    • C
    • B <이 만든 변경 내용 만 당겨 :의 그들 A, 즉 최신 첫 번째 B, C 및 D를 부르 자 [오래된]

    지금이 할 수있는 방법이 있나요 A, C 및 D를 무시하고, 독점적으로 B 커밋의 모든 변화를 끌어 오기 요청을 할?

  • 답변

    2

    먼저 그래프의 모양을 이해합시다. 분기 된 Repo의 팁이 x이고 분기가없는 선형 이력이 있다고 가정 해 봅시다. 그래서 역사는 다음과 같습니다

    [1000's of commits] -> parent(parent(x)) -> parent(x) -> x 
    

    이제 최신 하나되는 가장 오래된 및 D되는 네 개의 커밋 A으로, 즉 A, B, CD했다. 그 위에 포함되지, x는 그대로보다 역사 이전

    x -> A -> B -> C -> D 
    

    참고 때문에 우리가 논의하고있는 무슨에 대한 정보는 필요하지 않음 조각 : 지금 당신은 그래프 같은 것을 보인다.

    이제는 변경 집합 B 만 포함하는 끌어 오기 요청을 만들려고합니다. 주 리포가 B의 부모 인 A도 모르기 때문에 현재 상태에서는 불가능합니다. 부모가 될 때까지는 아이를 가질 수 없습니다.

    그래서 우리가 B 변경 요청의 풀 요청을 만들려면 rebasex에 만들어야합니다.

    rebase 의욕의 확장이며 당신은 우리가 확장 가능 일단의이 리베이스 보자 당신의 .hg/hgrc

    [extensions] 
    rebase = 
    

    에 다음 줄을 추가하여 설정할 수 있습니다. B의 부모가 x 때문에

    x -> A 
        \-> B -> C -> D 
    

    지금 당신이 끌어 오기 요청을 만들 수 있습니다

    hg rebase -s B -d x 
    

    이 발생합니다. C을 다시 A에 리베이스하여 더 깨끗한 상태를 유지할 수도 있습니다. 두 개의 브랜치가 생기고, 하나는 푸시 할 변경 집합을 포함하고 다른 하나는 다른 로컬 변경 집합입니다.다시 리베이스하는 것은 다음과 같습니다

    hg rebase -s C -d A 
    

    그리고 역사의 결과 상태는 다음과 같습니다 이제 쉽게 만 B 변경 집합을 포함하는 풀 요청을 만들 수 있습니다

    x -> A -> C -> D 
        \-> B 
    

    .

    관련 링크 :

    Rebase Extension