dvcs- "복제 지점"은 일반적인 워크 플로우입니까?


9

저는 최근 사무실에서 TFS (MS 매장)로 전환하는 것을 고려하고 있기 때문에 동료와 dvc를 논의하고있었습니다. 그 과정에서 나는 비록 그가 Mercurial을 사용하지만 "지점"이나 "체크 아웃"명령에 대해 들어 보지 못했다고 말했기 때문에 매우 혼란 스러웠다. 그가 어떻게 그들에 대해 알지 못했는지 궁금하고 dvcs 브랜치가 로컬 파일에서 "제자리에서"어떻게 작동하는지 설명한 후, 그는 매우 혼란 스러웠습니다.

그는 TFS의 작동 방식과 유사하게 "브랜치"를 생성하려고 할 때 복제하여이를 수행하므로 리포지토리 전체를 보유하고 있다고 설명했습니다. 이것은 나에게 정말로 이상해 보였지만, 내가 인정해야 할 이점은 파일이 분리되어 있기 때문에 두 가지를 동시에 보거나 작업 할 수 있다는 것입니다.

많은 온라인 리소스가이 "클론 투 브랜치"방법론을 포스터의 실망에 조장한다는 의견을보기 전에이 사이트를 검색하여이 요청을 받았는지 확인했습니다. 이것은 실제로 dvcs 커뮤니티에서 일반적입니까? 그리고 이런 식으로 갈 때의 장단점은 무엇입니까? 한 번에 여러 분기를 볼 필요가없고 전환이 빠르며 디스크를 채우는 모든 복제본이 필요하지 않기 때문에 절대 그렇게하지 않을 것입니다.


7
이것은 CVS와 SVN 워크 플로우에서

1
@JarrodRoberson- git작동 방식에 제약을받는 경우에만 해당됩니다 . 함께 hg이 일반적으로 첫 번째 워크 플로를 배우고 여전히 매우 유용 하나입니다.
Mark Booth

답변:


3

두 가지를 모두 볼 수 있다는 일반적인 장점 / 단점 외에는 그렇게하는 데 Mercurial 고유의 이점이 있다고 생각합니다.

분기를 생성하기 위해 복제하는 경우 변경 사항을 유지하지 않으려면 나중에 복제본을 삭제할 수 있습니다. 그것들을 병합하기로 결정했다면, 이런 방식으로 변경 사항을 분리하기로 결정했다는 사실은 다른 사람에게는 보이지 않습니다.

반대로, hg branch이름이 지정된 새 분기를 작성하는 데 사용하는 경우 분기 이름은 커밋 할 때 히스토리에 기록되고 다른 사람이 볼 수 있으며 나중에 혼동을 피하기 위해 상당히 고유해야합니다. 브랜치가 실험적인 기능을 개발하거나 변경이 적을 경우에는 적합하지 않을 수 있습니다.

명명 된 브랜치를 사용하여 소프트웨어의 출시 된 버전을 유지 관리하고 단기 기능이나 버그 수정을 개발하는 데 사용하는 경우,이 두 가지 브랜치를 별도로 유지할 방법이 없기 때문에 혼동하기 쉽습니다.

http://mercurial.selenic.com/wiki/StandardBranching 에서이를 자세히 설명합니다. Mercurial 1.8 이후 hg bookmark로 단기 지점의 일회용 이름 인 책갈피 ( ) 를 만들 수 있다는 점도 언급 할 가치가 있습니다 . 북마크를 밀거나 당기거나 이동하거나 삭제할 수 있습니다.


2
나는 Mercurial을 많이 사용하지 않았지만 Git에는이 문제가 없습니다. 나는 하루 종일 로컬로 분기 할 수 있고, 분기 개발에 합병하고 푸시하며 아무도 내 지점 이름을 볼 필요가 없습니다.
Andrew T Finnell

3
@AndrewFinnell : 그것은 실제로 그 질문에 맞지 않았지만, 그것이 반드시 문제는 아니라고 말하고 싶었습니다. Mercurial 작업에서 브랜치 (branch)라는 방식에는 몇 가지 장점이 있습니다. 예를 들어, 커밋이 원래 만들어진 분기를 알면 유용 할 수 있습니다.
benj

1
@ AndrewFinnell- 지명 된 브랜치 (branch)는 내가 정말로 그리워 하는 것들 git이다 hg. 또한 이름없는 분기의 자동 생성 git branch과 비교하여 분기를 만들 때마다 명시 적으로 기억해야 hg합니다.
Mark Booth

번들 스트립 확장을 사용하여 분기를 hg로 삭제할 수 있습니다. Mercurial은 "단계"를 통해 요즘 역사 수정을 더 잘 지원합니다
dukeofgaming

2

DVCS에서 커밋을 할 때마다 기술적으로 분기를 만들고 있습니다.이 저장소를 통합 저장소로 되돌릴 때마다 흥미로운 부분이 있습니다.

  • 커밋 중에 아무도 변경하지 않으면 DAG의 분기처럼 보이지 않습니다 (지향 비순환 그래프).
  • 커밋 중에 다른 사람이 변경 한 경우 DAG의 분기처럼 보이지만 이름이 지정되지 않습니다.

Bitbucket / github의 "포크"버튼을 기억하십시오. 포킹은 분기의 동의어로 간주 될 수 있으며 "포크"버튼의 기능은 해당 리포지토리를 계정에 복제 한 것입니다.

"지점으로 복제"의 유일한 장점은 기록의 두 지점에서 동시에 작업 할 수 있다는 것과 동료를 위해 아이러니 하게 작업 할 수 있다는 것입니다. 서로 다른 지점에서 동시에 작업 할 수있는 일반적인 워크 플로입니다 (앞뒤로 이동하지 않아도 됨). ).

동료에게 분기 방법을 배우도록 지시 하십시오. 매우 쉽습니다. 자습서가 있습니다.

D:\>mkdir lol

D:\>cd lol

D:\lol>hg init

D:\lol>hg branch
default

D:\lol>touch lol

D:\lol>hg add lol

D:\lol>hg commit -m "lol"

D:\lol>hg branch lol
marked working directory as branch lol
(branches are permanent and global, did you want a bookmark?)

D:\lol>hg branches
default                        0:35d562fafaf2

D:\lol>echo "lol" > lol

D:\lol>hg commit -m "New lol branch"

D:\lol>hg branches
lol                            1:9384f923e78d
default                        0:35d562fafaf2 (inactive)

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg update lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg merge lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

D:\lol>hg commit -m "lol merge"

D:\lol>hg branch
default

D:\lol>hg update lol
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

"지점에 복제"는 서로 다른 지사에서 동시에 작업 하거나 기록에 영구 분기를 만들지 않고 실험시도하고 기존 지사에 다시 통합 할 수있는 경우에 적합합니다. .

나는 개인적으로이 방법을 좋아하지 않으며 필요하다면 가지를하고 닫는 것을 선호합니다. 여기, 이것이 당신이하는 방법입니다 :

D:\lol>hg branches
default                        2:46420aca1612
lol                            1:9384f923e78d (inactive)

D:\lol>hg branch
lol

D:\lol>hg commit --close-branch -m "Obai, glorious lol branch"

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branch
lol

D:\lol>hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branches --closed
default                        2:46420aca1612
lol                            3:4b79c577e029 (closed)

이것이 DVCS 분기 의심을 없애기를 바랍니다. 여기서 지점은 더 이상 무섭지 않습니다.


0

개인적으로 디스크를 채우는 코드에 대해 개인적으로 걱정하지 않을 것입니다 ... 첫째, 코드 일뿐입니다. 둘째, 모든 복제본을 영원히 보관하지는 않을 것입니다.

이 방법론은 많은 온라인 리소스, 특히 Hg에 홍보됩니다. CI 환경에서는 추가 저장소 복제본보다 수명이 짧은 기능 분기를 사용하는 것이 훨씬 일반적입니다. 역사가 더 혼란스럽고 덜 혼란스럽고 아무것도 얻지 못하면이 작업의 이점을 보지 못합니다. 새 코드를 이전 코드와 나란히 보려면 ​​diff / merge 도구를 사용하여 두 커밋을 나란히 볼 수 있으며 변경 사항이 강조 표시되는 이점이 있습니다.


나는 이것을 프로덕션 환경에서 광범위하게 사용했습니다 hg. 여러 hg리포지토리 를 밀고 당길 수 있다는 것은 정말 강력한 협업 도구가 될 수 있습니다. Bare가 아닌 리포지토리 에서 가져올 수있는 경우에만 git이러한 종류의 워크 플로로 옵션을 제한 할 수 있습니다.
Mark Booth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.