문제

예를 들어, 코드를 많이 변경했는데 그 변경 사항 중 일부만 커밋하면 됩니다.머큐리얼에서 할 수 있는 방법이 있나요?나는 그것을 안다 darcs 이런 기능이 있습니다.

알아요 hg transplant 브랜치 간에 이 작업을 수행할 수 있지만 다른 브랜치에서 변경 세트를 추가할 때가 아니라 현재 브랜치에서 코드를 커밋하려면 이와 같은 것이 필요합니다.

도움이 되었습니까?

해결책

Chad가 언급 한 MQ는 한 가지 방법입니다. 더 경량 솔루션도 있습니다.

  • 기록 확장 DARCS 레코드와 거의 같은 방식으로 작동합니다. 그것은 Mercurial과 함께 배포됩니다.
  • 선반 확장 이를 통해 특정 변경 사항을 "선반"할 수 있으므로 변경 사항의 하위 집합 만 커밋 할 수 있습니다 (선반되지 않은 것).

다른 팁

당신이 사용하는 경우 거북이Hg 1.x 윈도우용, 이 기능은 아름답게 구현되었습니다 즉시 사용 가능(확장 필요 없음).

  1. TortoiseHg 커밋 도구를 실행합니다.
  2. 자신만 사용할 파일을 선택하십시오. 그것의 하위 집합을 커밋하고 싶습니다. 변경.
  3. 미리보기 창에서 덩어리 선택 탭을 클릭하십시오.
  4. 두 번 클릭하거나 스페이스바를 사용하여 어떤 변경 덩어리가 되어야 하는지 토글합니다. 커밋에 포함됩니다.

을 위한 거북이Hg 2.x, 이제 Hunk Selection 탭이 사라졌습니다.그 자리에는 선반 도구.이전 덩어리 선택보다 몇 가지 더 많은 기능이 있습니다.이러한 새로운 기능에는 약간의 복잡성이 추가됩니다.

enter image description here

이 기능을 사용할 때 Mercurial Shelve 확장을 명시적으로 활성화할 필요는 없습니다.Steve Borho(수석 TortoiseHg 개발자)에 따르면 다른 TortoiseHg 질문에 대한 응답: "우리는 선반 확장의 로컬 복사본을 가지고 있으며 이를 직접 호출합니다."


을 위한 거북이Hg 2.7+, 이 기능이 개선되어 다시 도입되었습니다.이제 Commit 도구에 직접 내장되었습니다.

example of change selection in the commit tool

왼쪽 파일 목록에서 최상위 파일이 선택되어 포함됨을 나타내고, 두 번째 파일은 포함되지 않으므로 선택 취소되고, 세 번째 파일인 Sample.txt가 채워져 있음(Null 확인란 표시기)을 확인하세요. 해당 파일에서 선택한 변경 사항만 커밋에 포함되기 때문입니다.

포함될 Sample.txt의 변경 사항은 이미지의 오른쪽 하단 변경 선택 부분에서 확인됩니다.제외될 변경 사항은 선택 취소되고 차이점 보기는 회색으로 표시됩니다.또한 선반 도구 아이콘은 여전히 ​​쉽게 사용할 수 있습니다.

Mercurial Deues 튜토리얼은이 사용 사례에 끔찍합니다. 내가 본 모든 예는 당신이 아직 커밋을하지 않았다고 가정하고 단일 패치를 새로 고치고 있다고 가정합니다. 대부분의 경우 이것은 그렇지 않으며, 당신은 당신이 함께 스쿼시하거나 다른 방식으로 변화하려는 2 ~ 3 개의 커밋을 가지고 있습니다.

이런 종류의 역사가 있다고 가정 해 봅시다.

---O---O---A---B---C

첫 번째 예는 a, b 및 C를 스쿼시하는 것입니다. 먼저 mq :

$ hg qinit

이제 커밋 A, B 및 C를 패치 큐에 "가져 오기"해야합니다. 그들이 마지막 3 커밋이라고 가정하자. "-n"개정 구문을 사용하여 그렇게 가져올 수 있습니다.

$ hg qimport -r -3:-1

이는 3 개의 패치에서 패치로 마지막 커밋으로 가져 오는 패치로 가져옵니다. 이 패치의 상태를 확인할 수 있습니다 hg qseries. 다음과 같이 표시해야합니다.

$ hg qseries
101.diff
102.diff
103.diff

여기서 숫자 101, 102 및 103은 커밋 A, B 및 C의 로컬 개정 번호에 해당합니다. 이제이 패치는 다음과 같습니다. 적용된, 이는 그들이 설명하는 변경 사항이 이미 작업 사본에 있다는 것을 의미합니다. 작업 복사본을 제거하고 커밋 기록에서 제거하여 사용하여 패치 형태로만 저장할 수 있습니다. hg qpop. 당신은 말할 수 있습니다 hg qpop; hg qpop 스택에서 C와 B를 변경하거나 "POP TO"로 패치를 지정합니다. 이 경우에는 다음과 같습니다.

$ hg qpop 101.diff
now at: 101.diff

이제 패치 대기열에 Commits B 및 C에 대한 패치가 있지만 적용되지 않습니다 (변경 사항은 "손실되었습니다" - 패치 큐 영역에만 존재합니다). 이제이 패치를 마지막 패치로 접을 수 있습니다. 즉, 변경 사항 A+B+C의 합과 동등한 새로운 커밋을 만듭니다.

$ hg qfold -e 102.diff 103.diff

이렇게하면 편집자가 표시되므로 커밋 메시지를 변경할 수 있습니다. 기본적으로 메시지는 별표로 분리 된 변경 A, B 및 C에 대한 커밋 메시지를 연결하는 것입니다. 여기에 좋은 것은 그게 그게입니다 hg qfold Bash를 사용하는 경우 패치를 탭하고 HG- 완성 스크립트를 공급할 수 있습니다. 이것은 A+B+C가 우리에게 관심을 갖는 3 개의 패치의 조합 인 단일 커밋 인 여기서 이와 같은 역사를 남깁니다.

---O---O---A+B+C

또 다른 사용 사례는 이전과 동일한 종류의 기록을 가지고 있지만 패치 B를 삭제하고 A+C를 병합하려는 경우입니다. 이것은 실제로 위와 매우 유사합니다. Qfold 단계에 도달하면 마지막 2 개 커밋이 아닌 마지막 커밋에서 단순히 접을 수 있습니다.

$ hg qfold -e 103.diff

이것은 패치 대기열에서 B의 변화를 남기지 만, 작업 사본에는 적용되지 않으며 그 커밋은 역사에 있지 않습니다. 실행을 통해 이것을 볼 수 있습니다.

$ hg qunapplied
102.diff

역사는 이제 다음과 같습니다. 여기서 A+C는 변경 A와 C를 결합한 단일 커밋입니다.

---O---O---A+C

최종 사용 사례는 Commit C 만 적용해야 할 수도 있습니다. 위와 같이 Qimport를 실행 하여이 작업을 수행하면 원하지 않는 모든 패치를 팝업 할 수 있습니다.

$ hg qpop -a

-A 플래그는 모든 패치가 튀어 나오는 것을 의미합니다. 이제 원하는 것을 적용 할 수 있습니다.

$ hg qpush 103.diff

이것은 당신 에게이 역사를 남깁니다 :

---O---O---C

이 모든 일을 마치면 대기열을 끝내야합니다. 이것은 다음과 같이 수행 할 수 있습니다.

$ hg qfinish -a

그래서 우리는 있습니다. 이제 실행할 수 있습니다 hg push 그리고 당신이 원하는 것을 정확하게 저지르십시오 hg email 메일 링리스트에 일관된 패치.

아무도 이미 이것을 제안하지 않았기 때문에 뭔가 빠진 것 같은 느낌이 듭니다.

일반적인 "HG Commit"명령을 사용하여 커밋 할 내용을 선택적으로 선택할 수 있습니다 (로컬 작업 디렉토리의 모든 보류중인 변경 사항을 커밋 할 필요는 없습니다).

그러한 변경 사항이있는 경우 :

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

당신은 그 중 두 가지만 커밋 할 수 있습니다 ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

파일을 선택적으로 커밋하기 위해 파일을 직접 유형해야하기 때문에 명령 줄에서 매우 편리하지는 않지만 (거북이와 같은 GUI 체크 박스 프로세스 vs) 확장이 필요하지 않으며 확장이 필요하지 않습니다. 그리고 파일 글로빙은 아마도 타이핑을 줄이는 데 도움이 될 수 있습니다 (위에있는 것처럼 커밋 된 파일은 PathNames에서 독특하게 공유합니다.

당신은 사용할 수 있습니다 기록 확장, 수은과 함께 배포됩니다.

당신은 당신의에서 그것을 활성화해야합니다 ~/.hgrc 먼저 파일에 추가하여 [extensions] 부분:

[extensions]
record=

그런 다음 입력하십시오 hg record 대신에 hg commit, 당신은 당신이 커밋하려는 어떤 파일을 변경할 것인지 선택할 수 있습니다.

당신은 또한 사용할 수 있습니다 크레코드 확장 변경 사항을 검토하고 선택할 수있는 더 좋은 인터페이스를 제공합니다. (그러나 그것은 Mercurial과 함께 배포되지 않았으며, 가끔 커밋을 엉망으로 만들어 완전히 버그가없는 것을 보았습니다.)

시간이 지났습니다. 지금은 최선의 선택입니다 hg commit --interactive

나는 믿는다 수은 대기열 Mercurial 의이 역할을 채 웁니다. 거기 있습니다 꽤 좋은 튜토리얼 거기에 연결되어 있습니다.

QCT (QT 커밋 도구)를 사용해보십시오. 개별 변경 사항을 취소 할 수있는 3 방향 병합 도구를 시작하는 "변경 사항 선택"기능이 있습니다. 당신이 커밋 한 후에, 당신이 당신이 "결심하지 않았다"는 변화가 돌아 오게됩니다.

나는 사용한다 커밋 패치. 커밋하기 전에 Diff를 편집 할 수있는 스크립트입니다. EMACS의 Diff-Mode 및 VC 모드가 정말 좋습니다.

과거에는 크레코드를 사용했지만 유니 코드와 관련된 버그가 있습니다 (실제로 레코드 확장에는 버그가 있으며 크레코드가 의존합니다).

먼저 GUI에 대해 알고있는 모든 것을 잊어 버리고 지휘관으로 돌아갑니다. 다음으로 명령 라인에서 다음을 수행합니다.

HG STAT> FILELIST.TXT

이것은 모든 수정 된 파일을 filelist.txt라는 텍스트 파일로 파이프합니다.

다음으로 FILELIST를 편집하여 커밋하려는 파일 만 포함하십시오.

마지막으로 파일 세트 sytnax를 사용하여 커밋합니다.

hg commit "set : 'listfile : test.txt'"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top