developer tip

커밋을위한 Mercurial 체리 따기 변경

copycodes 2020. 12. 15. 19:29
반응형

커밋을위한 Mercurial 체리 따기 변경


내 코드를 많이 변경했으며 이러한 변경 사항 중 일부만 커밋하면됩니다. 수은으로 할 수있는 방법이 있습니까? darcs이것과 같은 기능이 있다는 것을 알고 있습니다.

나는 분 기간에 hg transplant이것을 할 수 있다는 것을 알고 있지만 다른 분기에서 변경 세트를 추가 할 때가 아니라 현재 분기에서 코드를 커밋하려면 이와 같은 것이 필요합니다.


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

  • darcs 레코드와 거의 동일한 방식으로 작동하는 레코드 확장 . 수은과 함께 배포됩니다.
  • 특정 변경 사항을 "보류"할 수있는 Shelve 확장 기능 으로 변경 사항의 하위 집합 (보류되지 않은 변경 사항) 만 커밋 할 수 있습니다.

Windows 용 TortoiseHg 1.x사용하는 경우이 기능은 즉시 사용 가능하게 구현됩니다 (확장 필요 없음).

  1. TortoiseHg 커밋 도구를 실행합니다.
  2. 변경 사항의 하위 집합 만 커밋하려는 파일을 선택합니다.
  3. 미리보기 창에서 Hunk Selection 탭을 클릭합니다.
  4. 커밋에 포함될 변경 덩어리를 두 번 클릭하거나 스페이스 바를 사용하여 전환합니다.

들어 TortoiseHg 2.X 의 덩어리 선택 탭은 이제 사라졌다. 대신 선반 도구가 있습니다. 이전 덩어리 선택보다 몇 가지 더 많은 기능이 있습니다. 이러한 새로운 기능에는 약간의 복잡성이 추가됩니다.

여기에 이미지 설명 입력

이 기능을 사용할 때 Mercurial Shelve 확장을 명시 적으로 활성화 할 필요가 없습니다. 스티브 Borho (리드 TortoiseHg 개발자)에 따라 다른 TortoiseHg 질문에 응답 : "우리는 직접에 선반 확장 및 호출의 로컬 복사본을 가지고있다."


들어 TortoiseHg 2.7 이상 ,이 기능이 개선되고있어 소개했다. 이제 Commit 도구에 직접 빌드됩니다.

커밋 도구에서 변경 선택의 예

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

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


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

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

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

첫 번째 예는 커밋 A, B 및 C를 스쿼시하는 것입니다. 첫 번째 init 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 팝, 또는 "에 팝"에 대한 패치를 지정할 수 있습니다. 이 경우 다음과 같습니다.

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

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

$ hg qfold -e 102.diff 103.diff

커밋 메시지를 변경할 수 있도록 편집기가 표시됩니다. 기본적으로 메시지는 별표로 구분 된 변경 사항 A, B 및 C에 대한 커미트 메시지의 연결입니다. 여기서 좋은 점은 hg qfoldbash를 사용하고 hg-completion 스크립트를 소스로 사용하는 경우 패치를 탭으로 완성 한다는 것입니다. 이것은 다음과 같은 역사를 남깁니다. 여기서 A + B + C는 우리가 관심을 갖는 3 개의 패치의 조합 인 단일 커밋입니다.

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

Another use case is if we have the same sort of history as before, but we want to drop patch B and merge A+C. This is pretty similar to above actually. When you get to the qfold step, you would simply fold in the last commit rather than the last 2 commits:

$ hg qfold -e 103.diff

This leaves the change for B in the patch queue, but it is not applied to the working copy and its commit is not in the history. You can see this by running:

$ hg qunapplied
102.diff

The history now looks like this, where A+C is a single commit that combines changes A and C:

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

A final use case might be that you need to apply only commit C. You'd do this by running the qimport as above, and you would pop off all patches you didn't want:

$ hg qpop -a

The -a flag means pop off all patches. Now you can apply just the one you do want:

$ hg qpush 103.diff

This leaves you with this history:

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

Once you are done with all this, you need to finish off the queue fiddling. This can be done with:

$ hg qfinish -a

So there we are. You can now run hg push and only commit exactly what you want, or hg email a coherent patch to the mailing list.


I feel like I'm missing something because nobody has suggested this already.

The normal "hg commit" command can be used to selectively choose what to commit (you don't have to commit all pending changes in the local working directory).

If you have a set of changes like so:

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

You can commit just two of those changes with...

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

Not super convenient from the command line because you have to hand-type the files to selectively commit (vs a GUI check-box process like tortoise) but it's about as straightforward as it gets and requires no extensions. And file-globbing can probably help reduce typing (as it would above, both committed files uniquely share "liferay" in their pathnames.


You can use the record extension, which is distributed with Mercurial.

You need to enable it in your ~/.hgrc file first, by adding it to the [extensions] section:

[extensions]
record=

Then, just type hg record instead of hg commit, and you will be able to select which changes to which files you want to commit.

You can also use the crecord extension which provides a nicer interface to review and select the changes. (It is not distributed with Mercurial, though, and I've seen it occasionally mess up a commit so it's not completely bug-free.)


Some time has passed. Seems the best option now is hg commit --interactive


I believe Mercurial Queues fills this role for Mercurial. There's a pretty good tutorial linked there.


Try qct (Qt Commit Tool). It has a "select changes" feature that starts up a 3-way merge tool for you to undo individual changes. After you commit, those changes you "undid" come back.


I use commit-patch. It's a script that lets you edit the diff before committing. It's really nice with Emacs's diff-mode and vc-mode.

In the past I used crecord, but it has bugs related to unicode (actually the record extension has the bugs, which crecord depends on).


First you must forget everything you ever knew about GUI's and return to the commandline. Next from the commandline do this:

hg stat > filelist.txt

This pipes all your modified files into a text file called filelist.txt

Next edit your filelist to include only the files you wish to commit.

Finally commit using the fileset sytnax:

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

ReferenceURL : https://stackoverflow.com/questions/854930/mercurial-cherry-picking-changes-for-commit

반응형