다른 작업을 수행하는 동안 커밋되지 않은 변경 사항을 제쳐두고 어떻게해야합니까?


98

커밋되지 않은 변경 사항이 많고 대신 다른 작업을 수행하는 동안 제쳐두고 싶다면 나중에 (몇 일 후) 다시 돌아와 작업을 계속하십시오. 이를 수행하는 가장 쉬운 워크 플로는 무엇입니까? (지금까지 Mercurial의 기본 기능에 대한 경험 만 있습니다). 내 일반적인 방법은 복제를 사용하여 새 분기를 만드는 것이었지만 더 좋은 방법이있을 수 있습니다.

답변:


133

몇 가지 옵션이 있습니다.

  1. 선반 항목을. 이렇게하면 변경 사항이 저장되고 작업 디렉토리에서 제거되므로 분기를 계속할 수 있습니다. 변경 세트를 생성하지 않습니다.

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    업데이트 / 편집 : 최신 버전의 수은을 사용해야 할 수 있습니다.

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    여전히을 --name대신 사용할 수 -n있지만 수은은 --name더 이상 좋아하지 않는 것 같습니다 . 또한 --all더 이상 필요하지 않으며 실제로 수은이 그 이상을 두려워 할 것입니다.

  2. 패치mq. 이것은 어떤 측면에서 선반에 비해 너무 다르지 않지만 다르게 작동합니다. 최종 결과는 동일하며 변경 사항이 제거되며 나중에 선택적으로 다시 적용 할 수 있습니다. 푸시되면 패치는 논리적 변경 세트이며, 팝되면 다른 곳에 저장되며 변경 세트 기록의 일부가 아닙니다.

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. 로컬로 커밋하고 이전 변경 세트로 업데이트하고 계속 작업하고 익명 분기 (또는 여러 헤드)를 사용합니다. 그런 다음 변경하려면 헤드를 병합 할 수 있습니다. 변경을 원하지 않는 경우 변경 세트를 제거 할 수 있습니다 .

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. 명명 된 분기에 커밋합니다. 그러면 워크 플로가 옵션 3 (준비되면 병합 또는 제거)과 동일하게됩니다.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

개인적으로 저는 변경 세트를 제거하거나 부분 코드를 체크인하는 것을 신경 쓰지 않기 때문에 옵션 3 또는 4를 사용합니다 (결국 푸시되지 않는 한). 필요한 경우 다른 사용자로부터 로컬 변경 세트를 숨기기 위해 새로운 단계 항목 과 함께 사용할 수 있습니다.

또한 rebase병합으로 코드 기록에 아무것도 추가하지 않는 병합을 피하기 위해 명령을 사용하여 변경 집합을 이동합니다. 병합은 중요한 분기 (예 : 릴리스 분기) 간의 활동이나 수명이 더 긴 기능 분기의 활동을 위해 저장하는 경향이 있습니다. histedit변경 세트를 압축하는 데 사용 하는 명령 도 있습니다. 여기서 "수다 스러움"이 값을 감소시킵니다.

패치 대기열도이를 수행하는 일반적인 메커니즘이지만 스택 의미 체계가 있습니다. 패치를 푸시하고 팝하지만 스택의 다른 패치 "아래"에있는 패치는 그 위에있는 패치도 푸시해야합니다.

경고 , 이러한 모든 옵션과 마찬가지로 보류 / 대기 / 분기 한 임시 변경 사항 이후 파일에 더 많은 변경 사항이있는 경우 보류 해제 / 밀기 / 병합시 병합 해결이 필요합니다.


훌륭한 답변과 유용한 예에 감사드립니다. hg 북마크를 사용하는 것도 옵션인지 알고 있습니까?
Erik

@Erik 아마도 가능하지만 사용 경험이 없습니다.
아담 Houldsworth

2
책갈피는 옵션 3에 도움이되는 데 사용할 수 있습니다. 책갈피를 사용하여 변경 사항을 숨기기 위해 작성한 개정에 레이블을 지정할 수 있습니다. 그들은 스스로 작업을 할 수 없습니다.
Steve Kaye

옵션 --all이 인식되지 않습니다. 어쨌든 모든 변경 사항을 보류하는 것은 기본 동작입니다.
naXa

@naXa 안녕 친구, 내 명령 중 하나가 (버전이 변경되었습니다 아마도 때문에), 대답을 편집 주시기 바랍니다 및 :-) 필요하다면 나는 그것을 승인 할 것이다 어긋 나서 약간의 경우
아담 Houldsworth

23

개인적으로 지금까지 게시 된 답변이 마음에 들지 않습니다.

  1. 나는 단지이 각 프로젝트를 좋아하기 때문에 분기 클론처럼하지 않는 디렉토리를. 동시에 다른 디렉토리에서 작업하면 편집자의 최근 파일 기록이 완전히 엉망이됩니다. 나는 항상 잘못된 파일을 변경합니다. 그래서 더 이상 그렇게하지 않습니다.
  2. 나는 shelve빠른 수정을 위해 사용 합니다 (내가 잘못된 지점에 있다는 것을 알게되면 커밋되지 않은 변경 사항을 다른 지점으로 옮기기 위해). 당신은 며칠에 대해 이야기하고 있습니다.
  3. mq이런 평범한 상황에는 너무 복잡 하다고 생각합니다

가장 좋은 방법은 변경 사항을 시작하고 거기에서 작업하기 전에 변경 세트로 돌아가서 변경 사항을 커밋하는 것입니다. 몇 가지 사소한 문제가 있습니다. 설명하겠습니다.

변경 세트 A가 있다고 가정합니다. 변경을 시작하는 것보다. 이 시점에서 잠시 따로 보관 해 두십시오. 먼저 작업을 수행하십시오.

hg ci -m "Working on new stuff"

원하는 경우 나중에 쉽게 돌아올 수 있도록 책갈피를 추가 할 수 있습니다. 저는 항상 익명의 지점에 대한 책갈피를 만듭니다.

hg bookmark new-stuff

이러한 수정 이전의 변경 집합으로 돌아 가기

hg update A

여기에서 작업하고 변경 세트 C를 생성합니다. 이제 2 개의 헤드 (B 및 C)가 있으므로 푸시하려고 할 때 경고가 표시됩니다. 해당 분기의 헤드를 지정하여 하나의 분기 만 푸시 할 수 있습니다.

hg push -r C

또는 new-stuff분기 단계 를 비밀로 변경할 수 있습니다 . 비밀 변경 세트는 푸시되지 않습니다.

hg phase -r new-stuff --secret --force

자세한 답변 주셔서 감사합니다! 나는 그 (일반적인?) 문제에 대한 사람들의 워크 플로우를 읽는 것을 정말 좋아합니다.
Erik

나는 그것이이 상황 에만mq 너무 복잡 하다고 생각 하지만, 이것을 포함하여 충분히 넓은 범위를 가지고있어서 그것에 유창 해지기 위해 시간을 투자하는 동안 가치가 있습니다.
Norman Gray

12

커밋되지 않은 로컬 변경 사항을 유지하려면 가장 쉬운 방법은 패치 파일로 저장하는 것입니다.

hg diff > /tmp/`hg id -i`.patch

이전 상태로 돌아 가야 할 때 :

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

나는 스트립 /tmp하고 hg id -iWindoze에서도 작동합니다.
anatoly techtonik 2014-08-08

그리고 hg up거기에 필요하지 않습니다.
anatoly techtonik 2014-08-08

1
@techtonik 다른 개정판에 패치를 적용하면 어떤 일이 발생합니까? 특히 패치 된 파일이 수정 된 경우.
mapcuk

Mercurial은이를 병합하려고 시도 할 것이며 어쨌든 갈등을 처리해야합니다.
anatoly techtonik

6

리포지토리를 여러 번 복제 할 수 있습니다. 나는 루트 클론을 갖는 경향이 있고 거기에서 여러 자녀가 ​​있습니다. 예:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4 개의 자식은 모두 루트에서 복제되고 루트에서 푸시 / 풀링됩니다. 그런 다음 루트는 네트워크 / 인터넷 어딘가에있는 마스터 리포지토리에서 푸시 / 풀링합니다. 루트는 일종의 개인 준비 영역 역할을합니다.

따라서 귀하의 경우에는 새 저장소를 복제하고 작업을 시작하면됩니다. '보관 된'작업은 다른 저장소에 그대로 둡니다. 그렇게 간단합니다.

유일한 단점은 디스크 공간 사용량입니다.하지만 그것이 우려된다면 DVCS를 전혀 사용하지 않을 것입니다.) 아, 그리고 그것은 Visual Studio "최근 프로젝트"목록을 오염시킵니다.

[다음 댓글 편집] :-

결론적으로 ... 당신이하는 일은 완전히 훌륭하고 정상적입니다. 다음 사항이 참일 때 작업하는 가장 좋은 방법이라고 생각합니다. 1) 수명이 짧습니다. 2) 다른 개발자와 협업 할 필요가 없습니다. 3) 변경 사항이 커밋 될 때까지 PC를 떠날 필요가 없습니다. / 푸시 시간.


브랜치를 사용하지 않는 이유는 무엇입니까? 이것이 그들이 목적이며 리포 클로닝보다 훨씬 빠릅니다.
Adam Houldsworth

내 질문에서 나는 다음과 같이 말했습니다. 일반적인 방법은 복제를 사용하여 새 분기를 만드는 것이었지만 더 좋은 방법이있을 수 있습니다.
Erik

1
@AdamHouldsworth, 엄밀히 말하면 이들은 가지입니다 ... 단지 수명이 짧은 것들입니다. 단기 작업을 위해 명명 된 브랜치를 만드는 것은 완전히 어리석은 짓입니다. 그것은 오래 지속되는 작업 이야기를위한 가지라는 목적을 남용합니다.
nbevans

@NathanE 단기 작업을위한 명명 된 브랜치가 "완전히 어리 석다"고 생각한다면 익명의 브랜치, 쉘빙 또는 패치 큐도 다른 경량 옵션으로 사용됩니다. 제 생각에는 재 복제는 다른 옵션에 비해 똑같이 어리석은 일입니다. 잠재적 인 이점 중 하나는 두 개의 VS 인스턴스에서 두 세트의 코드를 열어 두는 것입니다. 나를 섬 기지 마십시오. 설명을 위해 저는 비추천자가 아니 었습니다.
Adam Houldsworth

@NathanE 그들은 또한 "장수 한 일의 이야기"에 대한 배타적이지 않습니다. 그것은 당신이 지속적인 통합을 따를 때 그들이 잘하는 것입니다. 문서 에서 바로 : "개발 라인이 갈라지면 분기가 발생합니다", 다른 작업을 위해 작업 항목을 보류하는 경우 수명에 관계없이 분기처럼 들립니다.
Adam Houldsworth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.