Hg: git's rebase와 같은 rebase를 하는 방법
Git에서 할 수 있는 일:
새 기능 작업 시작: git co-b newfeature-123 # (현지 기능 개발 지사)몇 가지 커밋(M, N, O)을 수행 마스터 A---B---C\신기능-123 M---N---O 업스트림 마스터에서 새 변경사항 가져오기: 기트풀(마스터가 ff-vmx로 업데이트됨) 마스터 A---B---C---D---E---F\신기능-123 M---N---O 마스터를 기본값으로 변경하여 새 기능최신 업스트림 변경 사항에 대비하여 개발할 수 있습니다. (새 기능-123에서)Gitrebase 마스터 마스터 A---B---C---D---E---F\신기능-123 M---N---O
저는 머큐리얼에서 같은 일을 하는 방법을 알고 싶고, 답을 찾기 위해 웹을 뒤졌지만, 제가 찾을 수 있는 최선은: gitrebase - can do that.
는 두 예를 합니다: 링크는두가예제공다니이합를.
저는 이것을 인정합니다: (예문의 수정사항을 제 자신의 수정사항으로 대체)
hgup - CFhg branch -f new feature-123hg 이식 -a-b 새로운 기능-123
프리베이스 M-N-O를 병합되지 않은 헤드로 남기고 업데이트된 메인 라인에서 분기하는 것을 나타내는 3개의 새로운 커밋 M', N', O'를 생성한다는 점을 제외하면 그리 나쁘지 않습니다.
기본적으로 문제는 다음과 같은 결과를 초래한다는 것입니다.
마스터 A---B---C---D---E---F\ \새 기능-123 \ M'---N'---O'\신기능-123 M---N---O
이것은 삭제해야 하는 로컬 원치 않는 커밋을 남기므로 좋지 않습니다.
- 같은 링크의 다른 옵션은 다음과 같습니다.
hgqimport -r M:Ohgqpop-ahgup Fhg 브랜치 신기능-123hgqpush-ahg qdel -r qbase:qtip
그러면 원하는 그래프가 생성됩니다.
마스터 A---B---C---D---E---F\신기능-123 M---N---O
하지만 이 명령들(6개 모두!)은 훨씬 더 복잡해 보입니다.
Gitrebase 마스터
저는 이것이 Hg에서 유일한 동등한 것인지 Git처럼 간단한 다른 방법이 있는지 알고 싶습니다.
VonC가 당신이 찾고 있는 답을 가지고 있습니다. 기지 확장입니다.그러나 mq나 rebase가 수은에서 기본적으로 활성화되지 않은 이유에 대해 생각해 볼 가치가 있습니다. 수은은 지워지지 않는 변화 세트에 관한 것이기 때문입니다.거의 매일같이 말씀하시는 방식으로 작업할 때는 다음과 같은 패턴을 취합니다.
1. Start working on a new feature:
$ hg clone mainline-repo newfeature-123
do a few commits (M, N, O)
master A---B---C
\
newfeature-123 M---N---O
2. Pull new changes from upstream mainline:
$ hg pull
master A---B---C---D---E---F
\
newfeature-123 M---N---O
3. merge master into my clone so that my new feature
can be developed against the latest upstream changes:
(from newfeature-123)
$ hg merge F
master A---B---C---D---E---F
\ \
newfeature-123 M---N---O---P
그리고 그것이 정말 필요한 전부입니다.만족할 때 메인 라인으로 쉽게 되돌릴 수 있는 새로운 기능 123 클론을 제공합니다.하지만 가장 중요한 것은, 저는 결코 역사를 바꾸지 않았다는 것입니다.누군가가 제 cset을 보고 그들이 원래 무엇에 대해 코딩되었는지, 그리고 제가 작업하는 동안 메인 라인의 변화에 어떻게 반응했는지 확인할 수 있습니다.모든 사람들이 그것이 가치가 있다고 생각하는 것은 아니지만, 저는 우리에게 우리가 일어났기를 바랐던 것이 아니라 실제로 일어난 일을 보여주는 것이 소스 제어의 일이라고 굳게 믿습니다. 모든 막다른 골목과 모든 리팩터는 지울 수 없는 흔적을 남겨야 합니다. 그리고 리베이스와 다른 역사 편집 기술들은 그것을 숨깁니다.
이제 내가 비누 상자를 치울 동안 VonC의 답을 고르세요.:)
기본 확장을 찾을 수 있습니다.(SummerOfCode 2008의 일부로 구현됨)
이러한 경우 로컬 변경사항을 "분리"하고 저장소를 메인스트림과 동기화한 다음 새 원격 변경사항 위에 개인 변경사항을 추가하는 것이 유용할 수 있습니다.이 작업을 rebase라고 합니다.
시작 위치:
대상:
변경사항을 적용하지 않고 저장소에 두 개의 분기가 있는 경우 다음 작업을 수행할 수 있습니다( 사용).
hg up newfeature-123
hg rebase -d master --keepbranches
(--keepbranches
원래 분기 이름을 상속합니다.)
Mojca는 다음을 언급합니다.
사용하는 것을 좋아합니다.
hg rebase --source {L1's-sha} --dest {R2's-sha}
하지만 제가 추가할 수 있는지 몰랐어요.--keepbranches
마지막에
hg rebase -d default --keepbranches
최신 HG를 설치했다고 가정하면 다음을 간단히 추가할 수 있습니다.
[extensions]
rebase =
~/.hgrc까지
할 수 .hg rebase
,hg pull --rebase
또는hg help rebase
.
저는 위의 답변들이 OP의 목표인 그의 업무 부서를 유지하는 것을 달성하지 못했다고 생각합니다. 단지 상위 부서에 대한 나중의 관점에 근거했을 뿐입니다.
이 그래프(그래프 로그 확장을 사용하여 생성됨)로 시작한다고 가정합니다.그래프로그에 대한 진지한 괴짜 사랑).
@ 9a4c0eb66429 Feature 3 commit 2 tip feature3
|
| o af630ccb4a80 default againagainagain
| |
o | 98bdde5d2185 Feature 3 branch commit 1 feature3
|/
o e9f850ac41da foo
commit을 feature3 브랜있에그고다커는을것시만베서밋싶다이, ▁if▁and▁i,▁i만▁를 실행하는 것으로 알고 있습니다.hg rebase -d default
과 같은결과를 .
@ 89dada24591e Feature 3 commit 2 tip
|
o 77dcce88786d Feature 3 branch commit 1
|
o af630ccb4a80 default againagainagain
|
o e9f850ac41da foo
임무 완수?난 그렇게 생각 안 해.문제는 feature3 브랜치의 커밋이 다시 기반이 되었을 때 feature3 브랜치가 삭제되었다는 것입니다.커밋이 애초에 피하려고 했던 기본 브랜치로 이동되었습니다.
Git에서 결과는 다음과 같습니다.
@ 9a4c0eb66429 Feature 3 commit 2 tip
|
o 98bdde5d2185 Feature 3 branch commit 1 **feature3**
|
o af630ccb4a80 default againagainagain
|
o e9f850ac41da foo
feature3 분기는 여전히 존재하며, 두 커밋은 feature3 분기에 여전히 있으며 기본적으로 표시되지 않습니다.작업 분기를 보존하지 않으면 병합과 기능적으로 어떻게 다른지 알 수 없습니다.
업데이트: 다음을 발견했습니다.--keepbranches
hgrebase에서 지원하는 플래그이며, 모든 것이 정상이라고 보고하게 되어 기쁩니다.사용.hg rebase -d default --keepbranches
저는 제가 갈망했던 Git 행동을 정확하게 재현합니다.나중에 가명 몇 개를 썼더니 아무도 상관하지 않는 것처럼 반박하고 있어요.
어떤 사람들은 모든 것의 모든 반복을 유지하는 것이 좋다고 생각하기 때문에, 저는 더 큰 오픈 소스 프로젝트의 경우 병합과 개발 반복으로 가득 찬 변경사항을 수락하면 혼란스러운 메인라인 수정 내역이 되고, 현재 버전이 어떻게 그곳에 도달했는지를 보는 데 있어 수정 내역이 덜 유용하게 될 것이라고 지적하겠습니다.
이것은 제출된 변경사항이 승인되기 전에 변경사항을 작성하지 않은 사용자가 검토할 때 잘 작동하므로 일반적으로 주요 변경사항이 디버깅되고 작동합니다.선의 원점으로 되돌아가면, 선이 속한 변화의 중간 지점이 아니라 선과 함께 진행되는 모든 변화를 볼 수 있습니다.
x265 기여자 페이지에서는 작업 중인 변경사항 집합을 다시 커밋하여 x265 프로젝트에 제출할 준비를 하는 방법을 설명합니다.(Tortoole 사용 포함)Gitgui의 커밋을 위한 stage/unstage diffunk)와 같이 개별 파일에서 일부 변경사항을 커밋하는 HG.
이 프로세스는 hg를 업스트림 팁으로 업데이트한 다음 작업 디렉토리에서 모든 변경 사항을 커밋되지 않은 상태로 가져오는 것입니다.제출할 내용의 일부가 아닌 것은 보류하고 나머지는 적절한 커밋 메시지와 함께 개별 커밋으로 나눕니다.
수정 중인 패치 세트의 이전 반복에서 커밋 메시지를 복사/붙여넣은 다음 편집할 수 있습니다.또는 이전 커밋(체리 피킹 언어)을 접목한 다음 하나씩 수정하여 이전 커밋 메시지를 편집의 시작점으로 삼을 수도 있습니다.
언급URL : https://stackoverflow.com/questions/2672351/hg-how-to-do-a-rebase-like-gits-rebase
'IT' 카테고리의 다른 글
최대 절전 모드에서 데이터베이스에서 시퀀스 정보를 가져올 수 없습니다. (0) | 2023.07.02 |
---|---|
vuex 스토어의 라우터 ID에 액세스하고 Axios get 메서드에 추가하려면 어떻게 해야 합니까? (0) | 2023.07.02 |
C 표준 보증 버퍼는 Null 터미네이터를 지나치지 않습니까? (0) | 2023.07.02 |
Python panda: 데이터 프레임 행을 한 행씩 채우기 (0) | 2023.07.02 |
프로젝트에서 엔티티 프레임워크의 최신 버전을 참조하고 있습니다... - 오류 (0) | 2023.07.02 |