나는 Subversion 괴짜입니다. 왜 Mercurial이나 Git 또는 다른 DVCS를 고려해야합니까?


300

분산 버전 제어 시스템 (DVCS)의 이점을 이해하려고합니다.

나는 Subversion Re-educationMartin Fowler 의이 기사 가 매우 유용하다는 것을 알았습니다 .

Mercurial 및 기타 DVCS는 변경 세트 및 로컬 커밋을 사용하여 새로운 코드 작업 방식을 장려합니다. 지옥 및 기타 협업 문제를 병합하지 못합니다.

우리가 실험을 진행하지 않는 한 지속적인 통합을 연습 하고 개인 브랜치에서 혼자 일하는 것은 선택 사항이 아니기 때문에 우리는 이것의 영향을받지 않습니다. 우리는 모든 주요 버전에 대해 브랜치를 사용하여 트렁크에서 병합 된 버그를 수정합니다.

Mercurial은 중위를 가질 수 있습니다

Linux와 같은 대규모 프로젝트에는 이것이 유용 할 수 있지만 소규모의 협력적인 팀 (5 ~ 7 명)에서는 그 가치가 보이지 않습니다.

Mercurial은 더 빠르며 디스크 공간이 덜 차지하며 전체 로컬 사본은 더 빠른 로그 및 차이 작업을 허용합니다.

SVN에서 작업중 인 매우 큰 프로젝트에서도 속도 또는 공간 문제를 알지 못했기 때문에 걱정하지 않아도됩니다.

전 SVN 괴짜들로부터 개인적인 경험이나 의견을 찾고 있습니다. 특히 변경 세트 개념과 측정 한 전반적인 성능 향상에 관한 것입니다.

업데이트 (1 월 12 일) : 이제 시도해 볼 가치가 있다고 확신합니다.

업데이트 (6 월 12 일) : 나는 Mercurial에 키스했고 그것을 좋아했다. 그의 체리 현지 맛이 커집니다. 나는 그것을 시도하기 위해 Mercurial에 키스했다. SVN 서버가 신경 쓰지 않기를 바랍니다. 너무 잘못 느꼈습니다. 너무 옳았다. 내가 오늘 밤 사랑에 빠졌다는 의미는 아닙니다 .

최종 업데이트 (7 월 29 일) : Eric Sink 의 다음 책인 Version Control (예 : 버전 제어) 을 검토 할 권한이있었습니다 . 그는 나를 설득하기 위해 마쳤다. 나는 Mercurial에 갈 것이다.


8
나는 또한 이것에 매우 관심이 있습니다. Subversion은 버전 제어 (CVS 등에서 온 것)에 대해 생각하도록 배운 방식에 맞습니다. 그럼에도 불구하고 Mercurial과 Git을 사용하여 오픈 소스 프로젝트에 대한 버그 수정을 시도했지만 아직 변환되지 않았습니다.
Berin Loritsch

29
질문에 +1 오늘날에는 분산 방식이 중앙 집중식에 비해 단순하고 빠르며 단순하고 자연스럽고 문제가 없으며 90 % 더 밝아지는 화물 컬트 가되었습니다 . 반드시 그렇지는 않습니다. 그것들은 서로 다른 도구이며 각각은 어떤 상황에서는 장점이 있고 다른 상황에서는 단점이 있습니다.
Joonas Pulakka

17
@Sharpie : svn, git그리고 hg몇 년 동안 사용하면서 , 나는 그들의 장단점을 잘 알고 있습니다. git이 중에서도 가장 강력 하지만 더 강력한 것이 자동으로 더 나은 것을 의미하지는 않는다는 점을 인식하는 것이 중요합니다 . Emacs는 웹 브라우저에서 실행되는 모든 자바 스크립트 텍스트 편집기보다 확실히 강력 하지만 이상하게 도이 주석을 자바 스크립트 브라우저 텍스트 편집기에 쓰고 있습니다! 단순성 , 심지어 어리 석음은 많은 상황에서 가치가 있습니다. 중앙 집중식 svngit-svn로컬 과 같은 것을 사용하면 두 세계의 최고를 제공합니다.
Joonas Pulakka

9
@ 샤피 : 당신이 좋아하는 것이 좋습니다. 그러나 한 남자의 프로는 다른 남자의 죄입니다. 일부 사람들은 하나의 표준 트렁크가있는 단일 중앙 저장소의 선명도를 매우 중요하게 생각합니다. 다음은 Google이 2000 년이 넘는 모든 프로젝트의 소스 코드 를 수억 개의 코드 라인이 포함 된 단일 코드 트렁크에 유지 하고 5000 명 이상의 개발자가 동일한 리포지토리에 액세스하는 방법에 대한 프레젠테이션입니다 . 모든 책상에서 5000 대의 서버와 2000 년의 프로젝트 역사를 원하십니까?-)
Joonas Pulakka

21
Katy Perry 참조의 경우 -1 ;)
Amadiere

답변:


331

참고 : 현재 질문에 대한 답변 은 "편집" 을 참조하십시오.


우선 Joel Spolsky의 Subversion Re-education 을 읽으십시오 . 나는 당신의 질문 대부분이 거기에 대답 될 것이라고 생각합니다.

또 다른 추천, 힘내에 리누스 토발즈 (Linus Torvalds) '토론 : http://www.youtube.com/watch?v=4XpnKHJAok8 . 이 다른 질문도 대부분의 질문에 대답 할 수 있으며 매우 재미있는 질문입니다.

BTW, 제가 재밌는 점 : 브라이언 피츠 패트릭 (Brian Fitzpatrick)과 벤 콜린스-서스 먼 (Ben Collins-Sussman)조차도 서브 버전을 만든 최초의 제작자 중 한 사람은 수은보다 열등한 서브 버전 (그리고 일반적으로 DVCS)을 언급하는 구글 대화에서 "그것에 대해 미안하다"고 말했다.

이제 IMO와 일반적으로 팀 역학은 모든 DVCS와 함께보다 자연스럽게 발전하며 다음과 같은 사항을 암시하므로 오프라인 커밋이 가능하다는 이점이 있습니다.

  • 서버와 연결에 의존하지 않으므로 시간이 더 빨라집니다.
  • 인터넷 커밋 (또는 VPN)을 통해 커밋 할 수있는 장소에 종속되지 않습니다.
  • 모든 사람은 서버뿐만 아니라 모든 것 (파일, 기록)의 백업을 가지고 있습니다. 누구나 서버가 될 수 있음을 의미합니다 .
  • 다른 사람의 코드를 엉망 으로 만들지 않고 필요한 경우 강박 적으로 커밋 할 수 있습니다 . 커밋은 로컬입니다. 커밋하는 동안 서로의 발가락을 밟지 않습니다. 커밋만으로 다른 사람의 빌드 나 환경을 깨뜨리지 않습니다.
  • "커밋 액세스"가없는 사람은 커밋 할 수 있으며 (DVCS에서 커밋하는 것은 코드 업로드를 암시하지 않기 때문에) 기여에 대한 장벽을 낮추고 변경 사항을 통합 자로 통합할지 여부를 결정할 수 있습니다.
  • DVCS는 이것을 서브 버전에서 커밋 레이스 (Commit Races)로 만들어 의사 소통을 강요하지만 업무를 방해함으로써 자연스러운 의사 소통을 강화할 수 있습니다.
  • 기고자는 팀을 구성하고 자체 병합을 처리 할 수있어 결국 통합 자에 대한 작업이 줄어 듭니다.
  • 기고자들은 다른 사람들에게 영향을 미치지 않고 자신의 지점을 가질 수 있습니다 (그러나 필요한 경우 공유 할 수는 있습니다).

당신의 요점에 관하여 :

  • DVCSland에는 지옥 합병이 존재하지 않습니다. 처리 할 필요가 없습니다. 다음 요점을 참조하십시오 .
  • DVCS에서 모든 사람은 "브랜치"를 나타냅니다. 즉, 변경 사항을 가져올 때마다 병합됩니다. 명명 된 지점은 또 다른 것입니다.
  • 원하는 경우 지속적인 통합을 계속 사용할 수 있습니다. IMHO가 필요하지 않은 이유는 무엇입니까? 왜 복잡성을 더해야합니까? 문화 / 정책의 일부로 테스트를 유지하십시오.
  • Mercurial은 어떤 경우에는 빠르며, git은 다른 경우에는 빠릅니다. 실제로는 일반적으로 DVCS가 아니라 특정 구현 AFAIK에 달려 있습니다.
  • 모든 사람은 당신뿐만 아니라 항상 완전한 프로젝트를 가질 것입니다. 분산 된 것은 로컬에서 커밋 / 업데이트 할 수있는 것과 관련이 있으며, 컴퓨터 외부에서 공유 / 취득하는 것을 푸시 / 풀링이라고합니다.
  • 다시 Subversion Re-education을 읽으십시오. DVCS는 더 쉽고 자연 스럽지만 다르지만, cvs / svn === 모든 버전의 기본이라고 생각하지 마십시오.

DVCS 로의 마이그레이션을 전파하는 데 도움을주기 위해 Joomla 프로젝트에 몇 가지 문서를 제공했으며 여기에서 중앙 집중식과 분산 형 을 나타내는 다이어그램을 만들었습니다.

중앙 집중식

대체 텍스트

일반적인 배포

대체 텍스트

최대한으로 배포

대체 텍스트

다이어그램에는 여전히 "중앙 집중식 저장소"가 있으며 이는 "중앙 집중식 저장소"가 단지 저장소이기 때문에 중앙 집중식 버전 관리 팬이 가장 좋아하는 논쟁 중 하나입니다. 모두 동의합니다 (예 : 공식 github repo)하지만 언제든지 필요할 수 있습니다.

다음은 DVCS를 사용하는 오픈 소스 프로젝트 (예 : 대규모 협업 프로젝트)의 일반적인 워크 플로우입니다.

대체 텍스트

Bitbucket.org 는 수은과 다소 비슷한 깃 허브 입니다. 팀이 5보다 작 으면 무료로 사용할 수 있습니다.

DVCS 사용을 확신 할 수있는 가장 좋은 방법은 DVCS를 시험해 보는 것입니다. svn / cvs를 사용해 본 경험이있는 모든 DVCS 개발자는 그 가치가 있으며 그것이 없이도 어떻게 살아남 았는지 모른다는 것을 알게 될 것입니다.


편집 : 두 번째 편집에 대답하기 위해 DVCS를 사용하면 다른 워크 플로우가 있음을 반복 할 수 있습니다. 모범 사례로 인해 시도하지 말아야 할 이유를 찾지 않는 것이 좋습니다. 사람들은 OOP가 아니라고 주장 할 때 느낌이 듭니다. 패러다임 XYZ로 항상하는 일로 복잡한 디자인 패턴을 해결할 수 있기 때문에 필요합니다. 어쨌든 혜택을 누릴 수 있습니다.

사용해보십시오. "개인 지점"에서 작업하는 것이 실제로 더 나은 옵션 인 방법을 알 수 있습니다. 마지막이 참인 이유에 대해 내가 알 수있는 한 가지 이유는 커밋에 대한 두려움을 잃어 버릴 수 있기 때문 입니다.

"지옥 병합"과 관련하여 "우리가 실험하지 않는 한"이라고 말하면 "실험중인 v2.0에서 동시에 실험 + maintenanceg + 작업 중일지라도"라고 말합니다 . 앞서 말했듯이 지옥을 합병하는 것은 존재하지 않습니다.

  • 커밋 할 때마다 이름없는 브랜치를 생성하고 변경 사항이 다른 사람의 변경 사항을 충족 할 때마다 자연스럽게 병합됩니다.
  • DVCS는 각 커밋마다 더 많은 메타 데이터를 수집하므로 병합하는 동안 충돌이 줄어 듭니다. 따라서 "지능형 병합"이라고 할 수도 있습니다.
  • 병합 충돌에 부딪 치면 다음을 사용할 수 있습니다.

대체 텍스트

또한 프로젝트 크기는 중요하지 않습니다. Subversion에서 전환했을 때 실제로 혼자 작업하는 동안 실제로 이점을 보았습니다. 모든 것이 올바르게 느껴졌습니다. 체인지 (개정,하지만 코드베이스의 상태에서 고립 당신이 커밋을 포함하는 특정 파일에 대한 변경 사항의 특정 세트 정확히)는, 당신은 당신이 파일의 특정 그룹에하던 일을 의미 정확히 시각화하자 전체 코드베이스가 아닙니다.

변경 세트 작동 방식 및 성능 향상 나는 github 네트워크 그래프에 설명 된 svn의 mootools 프로젝트 스위치 .

전에

대체 텍스트

대체 텍스트

당신이보고있는 것은 개발자가 다른 사람의 코드를 손상시킬 염려없이 커밋하면서 자신의 작업에 집중할 수 있다는 것입니다 .DVCS : 먼저 커밋 한 다음 푸시 / 풀 한 다음 업데이트 한 후 다른 사람의 코드를 깨뜨릴 염려가 있습니다. ) 그러나 병합이 더 똑똑하기 때문에 병합 충돌이 발생하더라도 (종종 드물지만) 수정하는 데 5 분 이하 만 소요됩니다.

당신에게 추천하는 것은 수은 / 깃털 사용법을 알고있는 사람을 찾아서 직접 설명해주는 것입니다. 데스크톱 및 비트 버킷 계정에서 머큐리얼을 사용하는 동안 명령 행에서 일부 친구들과 약 30 분을 머 금고 병합하는 방법을 보여주고, 어리석은 시간에 문제를 해결하는 방법을 알기 위해 갈등을 만들어 보았습니다. 그들은 DVCS의 진정한 힘입니다.

마지막으로 Windows 사람들과 함께 작업하는 경우 git + github 대신 mercurial + bitbucket을 사용하는 것이 좋습니다. Mercurial도 조금 더 간단하지만 git은 좀 더 복잡한 저장소 관리 (예 : git rebase )에 더 강력합니다 .

몇 가지 추가 권장 사항 :


18
큰 대답이지만 OP와 같은 보트에있는 우리들에게는 한 가지 질문 만 있습니다. 지옥 합병이 존재하지 않는 방법을 설명 할 수 있습니까? 통합 업체 또는 컨트 리뷰 터가 포크가 오래되었을 때 동일한 조치를 수행 할 필요가 없습니까?
Nicole

17
좋은 대답입니다. 참고 사항 : Spolsky는 좋은 점이있을 수 있지만, 그 점을 재료 판매로 사용하여 제품을 판매하려고 노력하고 있음을 명심하십시오.
Martin Wickman

5
재교육 페이지를 읽었으며 여러 가지 이유로 관련성이 없다는 것을 알았습니다. 주제에 대한 개인적인 견해로 질문을 편집하겠습니다.

15
Git이 Subversion 클라이언트 역할을 할 수 있다는 점도 지적 할 가치가 있습니다. 즉, 모든 사용자를 한 번에 Git으로 변환 할 필요는 없습니다. 일부 팀원은 원하는 경우 Git을 사용할 수 있으며 개별 워크 플로가 향상됩니다 (특히 병합이 훨씬 쉬워 짐).
greyfade

6
DVCS는 @Pierre 가 개별 프로그래머의 소프트웨어 변경 사항 을 병합 하지만 실제로 소프트웨어를 기존 단위 테스트를 컴파일하거나 통과 시키지는 않습니다. 당신은 여전히이 작업을 수행하는 다른 소프트웨어가 필요 할 때마다 소스 변경하고 최선 우리가 요즘은 CI-엔진을 사용하여 (제대로 그 일을)되어 있습니다

59

당신이 말하는 것은 본질적으로 단일 지점에 머물러 있다면 분산 버전 제어가 필요하지 않다는 것입니다.

그것은 사실이지만 그것은 당신의 일하는 방식에 대한 불필요하게 강한 제한이 아니며 여러 시간대의 여러 위치에 잘 맞지 않는 제한입니까? 중앙 서브 버전 서버는 어디에 위치해야하며 어떤 이유로 서버가 다운 된 경우 모두 집에 가야합니까?

DVCS는 Subversion에 있으며 Bittorrent는 ftp에 있습니다.

(기술적으로, 법적으로는 아님). 아마도 그렇게 생각한다면 왜 그렇게 큰 도약인지 이해할 수 있을까요?

나를 위해 git으로 전환하자마자 결과는

  • 백업이 더 쉬워졌습니다 ( "git remote update"만하면됩니다)
  • 중앙 저장소에 액세스하지 않고 작업 할 때 작은 단계를 쉽게 수행 할 수 있습니다. 중앙 리포지토리를 호스팅하는 네트워크로 돌아올 때 작업하고 동기화하면됩니다.
  • 빠른 허드슨 빌드. 업데이트보다 git pull을 사용하는 것이 훨씬 빠릅니다.

따라서 왜 비트 토 런트가 ftp보다 나은지 고려하고 귀하의 입장을 재고하십시오 :)


참고 : ftp가 더 빠르며 비트 토렌트보다 유스 케이스가 있다고 언급되었습니다. 이것은 좋아하는 편집기가 유지 관리하는 백업 파일이 버전 제어 시스템보다 더 빨리 사용하는 것과 같은 방식으로 적용됩니다.


나는 실제 프로젝트로 시도하기로 결정했습니다.

좋은 생각. "정말 이거 좋아요!"라는 사고 방식으로 시작해야합니다. "나는 이것을하고 싶지 않습니다!"대신. 배울 것이 많다. git을 선택하면 github에는 많은 온라인 도움말이 있습니다. hg를 선택하면 Joel은 좋은 온라인 자료를 작성했습니다. bzr을 선택하면 Canonical은 좋은 온라인 자료를 많이 가지고있을 것입니다. 다른 사람?

3
흠 그것은 비트 토런트가 FTP보다 낫다고 생각한다고 가정합니다 ...
Murph

2
@Murph, 저도 그렇고 블리자드도 동의합니다 (대규모 온라인 동기화를 처리하는 방법을 알고 있습니까?). wowwiki.com/Blizzard_Downloader

2
@Murph, 서버에서 토렌트 서버를 시작하고 클라이언트에서 토렌트 클라이언트를 시작합니다. 어렵지 않다. 변경된 파일 만 업데이트하면 즉시 구입해야합니다. 또한 ftp 대신 rsync가 증분 업데이트를 위해 구입할 수있는 것을 고려 했습니까?

46

분산 버전 제어 시스템의 킬러 기능은 분산 부분입니다. 저장소에서 "작업 사본"을 체크 아웃하지 않고 저장소의 전체 사본을 복제합니다. 다음과 같은 강력한 이점이 있습니다.

  • 다음과 같은 인터넷 액세스가없는 경우에도 버전 제어의 이점을 누릴 수 있습니다. 불행히도 DVCS가 대단한 이유로 과도하게 사용되거나 과장되어 있습니다. 우리는 개구리가 비가 내리기 시작할 때마다 인터넷에 연결하지 않고도 코딩을합니다.

  • 로컬 리포지토리가 가장 중요한 이유는 커밋 기록이 마스터 리포지토리로 푸시되기 전에 커밋 기록을 완전히 제어 할 수 있기 때문 입니다.

버그를 수정하고 다음과 같은 결과를 얻었습니다.

r321 Fixed annoying bug.
r322 Argh, unexpected corner case to annoying bug in r321!
r323 Ok, really fixed corner case in r322
r324 Oops, forgot to remove some debugging code related to r321
...

등등. 그와 같은 역사는 지저분합니다. 실제로는 하나의 수정 만 있었지만 이제는 구현이 디버깅 문의 추가 및 제거와 같이 원치 않는 아티팩트를 포함하는 많은 커밋 사이에 퍼져 있습니다. SVN과 같은 시스템에서 대안은 역사를 깨끗하게 유지하기 위해 모든 것이 작동 할 때까지 커밋 (!!!) 하지 않는 것입니다. 그럼에도 불구하고 실수는 사라지고 머피의 법칙은 많은 양의 작업이 버전 관리에 의해 보호되지 않을 때 당신을 잔인하게 기다리고 있습니다.

소유 하고있는 리포지토리의 로컬 복제본이 있으면 "fix it"및 "oops"커밋을 "bug fix"커밋으로 계속 롤링하여 기록을 다시 쓸 수 있으므로이 문제를 해결합니다. 하루가 끝나면 다음과 같은 하나의 정리 커밋이 마스터 리포지토리로 전송됩니다.

r321 Fixed annoying bug.

어느 쪽이 좋을까.

분기 모델과 결합하면 기록을 다시 쓸 수있는 기능이 훨씬 강력 해집니다. 개발자는 지점 내에서 완전히 격리 된 작업을 수행 한 다음 해당 지점을 트렁크로 가져올 때 모든 종류의 흥미로운 옵션을 사용할 수 있습니다.

  • 일반 바닐라 병합을 수행하십시오 . 사마귀와 모든 것을 가져옵니다.

  • DO가 REBASE를 . 브랜치 히스토리를 정렬하고, 커밋 순서를 재정렬하고, 커밋을 던져 내고, 커밋을 함께 결합하고, 커밋 메시지를 다시 쓰거나 커밋을 편집하거나 새 커밋을 추가 할 수 있습니다! 분산 버전 제어 시스템은 코드 검토를 깊이 지원합니다.

지역 리포지토리에서 동료 프로그래머의 건강과 미래의 자아를 위해 내 역사를 편집 할 수있는 방법을 알게되면 SVN을 끊었습니다. 내 Subversion 클라이언트는 이제 git svn입니다.

개발자와 관리자가 커밋 히스토리에 대한 편집 제어를 수행하면 프로젝트 히스토리가 개선되고 깨끗한 히스토리를 사용할 수있어 프로그래머로서의 생산성에 큰 도움이됩니다. "기록 다시 작성"에 대한이 모든 이야기가 당신을 두려워한다면, 그것이 중앙 저장소, 공용 저장소 또는 마스터 저장소가 무엇인지 걱정하지 마십시오. 역사는 누군가가 다른 사람들이 끌어들이는 저장소의 지점으로 가져갈 때까지 다시 쓰여질 수 있습니다. 이 시점에서 역사는 돌판에 새겨진 것처럼 취급되어야합니다.


6
역사를 다시 작성 : 그것은 단지 Git 일입니까? 아니면 Mercurial에서도 쉬운가요? (그렇다면 정말로 시작해야합니다.)
Paul D. Waite

3
이 작업을 수행 할 때 Linux 커널 규율을 알고 있어야합니다. 즉 공개적으로 게시 한 브랜치를 리베이스 (또는 히스토리 재 작성)하지 마십시오. 단기 사용을 위해 공개 된 브랜치가있는 경우 (linux-next와 같이 자주 버려지는 브랜치로 병합하거나 다른 사람이 로컬 사본을 검토 한 후 버리는 경우) 해당 브랜치를 리베이스 할 수 있습니다. 다른 사용자는 해당 지점의 관례가 지점을 기반으로 할 수 있고 다른 사람의 장기 지점으로 병합해서는 안된다는 점을 명심해야합니다.
Ken Bloom

4
내부 네트워크에 완전히 액세스하지 않고도 인터넷에 액세스 할 수 있습니다. 여행 할 때 자주 발생합니다.

5
DVCS 의 속도 가 나오는 곳이기 때문에 인터넷 액세스가 필요하지 않은 것은 매우 큰 문제 입니다. 네트워크를 통해 패킷을 보내 자마자 연결 상태에 상관없이 프로세스 속도가 느려집니다.
Adam Lassek

6
@Paul, Mercurial에서는 이것이 가능 하다는 것을 이해 하지만 기본 기능이나 철학은 아닙니다.
Benjol

18

dukofgamings 답변은 가능한 한 좋을 것입니다. 그러나 다른 방향에서 접근하고 싶습니다.

우리가 말한 것이 절대적으로 사실이라고 가정하고 모범 사례를 적용하면 DVCS가 해결하도록 설계된 문제를 피할 수 있다고 가정 해 봅시다. 이것은 DVCS가 당신에게 유리하지 않다는 것을 의미합니까? 사람들 은 모범 사례를 따르는 데 악취 가납니다. 사람들은 엉망 이 될 것 입니다. 그렇다면 왜 일련의 문제를 해결하도록 설계된 소프트웨어를 피하고 대신 사람들이 미리 예측할 수없는 일을하도록 선택하면 안 될까요?


2
실제로 나는이 주장을 DCVS 에 반대하여 제안 할 것이다 . 우리 회사는 최근 CVS에서 Mercurial로 전환했습니다. 사람들은 CVS에있을 때 더 자주 병합하는 동안 다른 사람들의 변경을 지우고 있습니다.
Juozas Kontvainis

@JuozasKontvainis : 나는 수은을 잘 모르지만 자식에서는 부모로 HEAD가없는 병합을 포함하는 푸시를 허용하지 않으므로 사용자가 마스터의 최신 변경 사항이 포함되지 않은 변경 사항을 푸시하지 못하게 할 수 있습니다. 나는 수은과 비슷한 것이 있다고 확신한다.
naught101

@ naught101 : 실제로 회사에서 해당 설정을 활성화했습니다. 프로그래머가 자신의 변경 사항을 로컬로 커밋 한 다음 푸시를 시도합니다. 그는 서버에서 푸시하기 전에 병합이 필요하다는 응답을받습니다. 서버에서 업데이트를 가져 와서 병합 커밋을 시도합니다. 이 시점에서 나는 그 사람들이 어떻게 병합 커밋을했는지 정확히 알지 못하지만 병합 커밋을 여러 번 수행하면 기본적으로 서버에서 얻은 변경 사항이 지워졌습니다.
Juozas Kontvainis

1
사람들이 변경 사항을 가져 와서 병합 할 때 서버에서 얻은 변경 사항을 실제로 삭제 한 것처럼 들립니다 (가능한 경우). 물론 서버의 변경 세트가 여전히 있으므로 저장소를 변경 이전 상태로 재설정 할 수 있습니다.
철학자

1
실제로, 그것은 다음과 같이 들립니다 : randyfay.com/content/avoiding-git-disasters-gory-story 당신이하고있는 일을 모른다면 git repo에 무엇이 잘못 될 수 있는지에 대한 비판적 기사.
gbjbaanb

9

예, 큰 커밋을 Subversion에 병합해야 할 때 아파요. 그러나 이것은 또한 훌륭한 학습 경험으로, 여러분은 합병을 피하기 위해 모든 것을 가능하게합니다. 다시 말해, 자주 체크인 하는 법을 배웁니다 . 초기 통합은 함께 배치 된 모든 프로젝트에 매우 좋습니다. 모두가 그렇게하는 한, Subversion을 사용하는 것은 큰 문제가되지 않습니다.

예를 들어, Git 은 분산 작업 을 위해 설계되었으며 사람들이 자신의 프로젝트에서 작업하고 나중에 최종 병합을 위해 자체 포크를 만들도록 권장합니다. OP가 요구하는 "작고 협력적인 팀"의 지속적인 통합을 위해 특별히 설계된 것은 아닙니다 . 오히려 반대입니다. 생각해보십시오. 당신이하고있는 모든 작업이 동일한 코드에서 함께 작업하는 동일한 방에 앉아 있다면 멋진 분산 기능을 사용할 수 없습니다.

따라서 CI를 공동으로 사용하는 팀의 경우 분산 시스템을 사용하는지 여부는 그다지 중요하지 않다고 생각합니다. 그것은 맛과 경험의 문제로 귀결됩니다.


2
Git은 전 세계의 분산 작업을 위해 설계되었으며 사람들이 자신의 프로젝트를 수행하고 자신의 포크를 만들도록 권장합니다. OP가 요구하는 "소규모 및 공동 작업 팀"의 지속적인 통합을 위해 특별히 설계된 것은 아닙니다 .
Martin Wickman

4
더 작고 쉬운 갈등을 해결하기 위해 무엇을 추측하십시오. 그러나 두 명의 ppl이 코드의 동일한 부분을 변경하는 경우 팀에 계획 문제 가 있으며 VCS로 해결할 수 없습니다. 배포 여부
Martin Wickman

4
OP는 CI를 사용하여 함께 배치 된 팀에 있습니다. 이것은 그들이 많은 작은 체크인을 자주하는 것을 의미합니다 (하루에 몇 번). 이것을 감안할 때, dvc를 사용하는 것이 특별한 이점을 제공 해야하는 이유는 없으며 거대한 병합이 발생하여 합병이 발생하지 않는 이유는 없습니다. 분산 팀에 svn을 권장하지는 않지만 여기서는 그렇지 않습니다.
Martin Wickman

2
@MartinWickman-Mercurial은 빠르고 저렴하게 커밋, 브랜칭 및 병합하도록 설계되었습니다. 지속적인 통합에 적합합니다. 개인적으로 앨리스가 자신의 변경 사항을 분기 할 수 있고 Bob이 변경 사항을 가져 와서 해당 지점으로 변경하여 중앙 서버를 만지거나 어디서나 변경 사항을 푸시하지 않고도 문제를 확인할 수 있다고 제안합니다. 소규모의 협업 팀이 일할 수 있도록
철학자

2
내 $ 0.02. 다양한 프로젝트에 Subversion, Mercurial 및 Git을 사용했습니다. Subversion은 지속적으로 통합하는 매우 긴밀하게 통합 된 그룹에 가장 적합한 선택 인 것 같습니다. Mercurial은 SVN에서 병합 문제가 발생할 때마다 더 많은 코드 변경으로 하루에 한 번만 빌드 할 수있는 그룹에 더 적합합니다. Git은 실제로 빌드를 만들기 위해 코드를 함께 밀어 넣지 않고도 며칠 / 주로 갈 수있는 팀이있는 사람들에게가는 길처럼 보입니다.
브라이언 Knoblauch

8

자신의 지식에 지속적으로 도전해야하기 때문입니다. 당신은 전복을 좋아합니다. 수년 동안 그것을 사용했기 때문에 이해할 수 있고 그것에 대해 매우 기뻤지 만 여전히 그것이 가장 적합한 도구라는 것을 의미하지는 않습니다.

나는 그것을 사용하기 시작했을 때 당시 최고의 선택이라고 생각합니다. 그러나 다른 도구는 시간이 지남에 따라 나오고 이제는 내 자신의 여가 시간 프로젝트에도 git을 선호합니다.

그리고 서브 버전에는 몇 가지 단점이 있습니다. 예를 들어 디스크의 디렉토리 이름을 바꾸면 리포지토리에서 이름이 바뀌지 않습니다. 파일 이동이 지원되지 않으므로 파일을 복사 / 삭제 작업으로 이동하여 파일 이동 / 이름 변경이 어려울 때 변경 사항을 병합합니다. 병합 추적은 실제로 시스템에 구축되는 것이 아니라 해결 방법으로 구현됩니다.

힘내는 이러한 문제를 해결합니다 (파일이 이동했는지 자동으로 감지하는 것을 포함하여 사실이라고 말할 필요조차 없습니다).

반면 git에서는 subversion처럼 개별 디렉토리 수준에서 분기 할 수 없습니다.

그래서 제 대답은 대안을 조사하고 그것이 당신이 잘 알고있는 것보다 당신의 요구에 더 잘 맞는지 확인한 다음 결정해야합니다.


실험 대안은 자동이어야합니다.

git은 특정 휴리스틱을 사용하여 파일이 이동했는지 확인하지만 완벽하지는 않습니다.
gbjbaanb

동의합니다. 아동들이 사용하는 새로운 도구를 싫어하더라도 적어도 새로운 것을 시도하도록 강요하는 것이 중요하다고 생각합니다.
Tjaart

7

성능과 관련하여 Git 또는 다른 DVCS는 한 지점에서 다른 지점으로 전환하거나 한 개정에서 다른 개정으로 이동해야 할 때 SVN보다 큰 이점을 제공합니다. 모든 것이 로컬에 저장되므로 SVN보다 훨씬 빠릅니다 .

이것만으로도 나를 바꿀 수 있습니다!


git checkout은 매우 빠릅니다.

지점 / 변경 집합 사이에 점프, 그 지적 +1은 매우 빠른
dukeofgaming

3

대신 "모범 사례를 적용하여 DVCS가 필요하지 않다"는 아이디어에 매달리지 마십시오. SVN 워크 플로우는 하나의 모범 사례와 함께 하나의 워크 플로이고 GIT / Hg 워크 플로는 다른 워크 플로, 다른 모범 사례로

git bisect (및 주요 저장소에 미치는 모든 영향)

Git에서 매우 중요한 원칙은을 사용하여 버그를 찾을 수 있다는 것 git bisect입니다. 이렇게하려면 작동 한 것으로 알려진 마지막 버전과 실패한 것으로 알려진 첫 번째 버전을 가져오고 Git의 도움으로 버그를 일으키는 커밋을 알아 내기 위해 이진 검색을 수행합니다. 이를 위해서는 전체 개정 내역에 버그 검색을 방해 할 수있는 다른 버그가 상대적으로 없어야합니다 (믿거 나 말거나 실제로 실제로 작동하며 Linux 커널 개발자는 항상이 작업을 수행합니다).

git bisect기능 을 달성하려면 자체 기능 분기 에서 새 기능을 개발하고 리베이스하고 기록을 정리하십시오 (따라서 히스토리에 작동하지 않는 개정 본이 없음-각 부분별로 변경 사항이 있음) 문제를 해결하기 위해)를 누른 다음 기능이 완료되면 작업 기록이있는 기본 지점으로 병합합니다.

또한이 작업을 수행하려면 기능 분기를 시작하는 기본 분기 버전에 대한 규율이 ​​있어야합니다. master관련되지 않은 버그가있을 수 있으므로 현재 브랜치 상태에서 시작할 수는 없습니다. 따라서 커널 커뮤니티의 조언은 최신 안정 버전의 커널 (큰 기능의 경우)에서 작업을 시작하거나 작업을 시작하는 것입니다. 최신 태그 출시 후보에서

또한 기능 분기를 서버로 푸시하여 중간 진행 상황을 백업 할 수 있으며, 기능 분기를 서버로 푸시하여 다른 사람과 공유하고 기능이 완료되기 전에 기능을 완료하기 전에 피드백을 유도 할 수 있습니다. 프로젝트의 모든 사람 *이 처리해야하는 코드베이스의 영구적 인 기능으로 코드를 전환하십시오.

gitworkflows의 매뉴얼 페이지 힘내 위해 설계 워크 플로우에 좋은 소개합니다. 또한 Git이 X보다 나은 이유는 git 워크 플로에 대해 설명합니다.

대규모 분산 프로젝트

좋은 연습과 좋은 디자인 습관을 가진 고도의 협업 팀에서 중위가 필요한 이유는 무엇입니까?

Linux와 같은 프로젝트에는 지리적으로 분산 된 사람들이 너무 많아서 회의실을 공유하는 소규모 팀만큼 협력하기가 어렵습니다. (사람들이 모두 같은 건물에 있어도 Microsoft Windows와 같은 대형 제품을 개발할 때는 팀이 너무 커서 중위없이 중앙 집중식 VCS 작업을 수행 할 수있는 협업 수준을 유지하기에는 너무 큽니다.)


나는 당신의 첫 포인트를 얻지 못합니다. 당신은 몇 가지 참조가 있습니까? 마지막 프로젝트와 관련하여 프로젝트를 별도의 구성 요소로 나눕니다. 나는 그런 대형 프로젝트를 한 적이 없었습니다. 같은 프로젝트 에서 얻은 최대 개발자 수는 수십 명입니다.

@ 피에르. 프로젝트를 별도의 구성 요소로 나누는 것이 합리적입니다. 리눅스는 모 놀리 식 커널이기 때문에 본질적으로 모든 장치 드라이버는 본질적으로 별도의 프로젝트 임에도 불구하고 동일한 저장소에서 개발되어야 함을 의미합니다. 동시에, 그들은 더 숙련 된 건축가가 이러한 모든 드라이버에 영향을 미치는 광범위한 변경을 수행 할 수 있기를 원하므로 다른 저장소로 나누는 것은 고통이 될 것입니다. 따라서 git (및 중위)은 이러한 다양한 문제를 관리하는 데 적합합니다.
Ken Bloom

SVN 대 Git 및 Mercurial 워크 플로에 대해 Martin Fowler가 말한 내용을 읽는 데 관심이있을 수 있습니다. martinfowler.com/bliki/VersionControlTools.html
Ken Bloom

2
버그를 찾기 위해 SVN에서 정기적으로 이분법을 사용합니다. Git과의 유일한 차이점은 자동이 아니라는 것입니다. 그러나 이것만으로는 우리가 전환하기에 충분하지 않습니다.
Xavier Nodet

1
소규모 팀의 git bisect 관련성은 거의 없습니다. 다른 사람들의 수백 가지 변경 사항이 한 번에 병합되어 문제를 일으키는 커널에 적합하지만 팀이 5 인 경우 일반적으로 2-3 가지 잠재적 범인 패치를 모두 제거 할 수 있습니다. 로그.
blucz

2

왜 함께 사용하지 않습니까? 현재 프로젝트에서는 CVS를 사용해야합니다. 그러나 기능 개발을 위해 로컬 git 리포지토리도 유지합니다. 다양한 솔루션을 시도하고 작업중 인 버전을 자신의 컴퓨터에서 유지할 수 있기 때문에 이것은 두 세계에서 가장 좋습니다. 이를 통해 코드를 엉망으로 만들 때 이전 버전의 기능으로 롤백하거나 여러 가지 접근 방식을 시도 할 수 있습니다. 중앙 저장소가 있으면 중앙 저장소가 있다는 이점이 있습니다.


그러나 DVCS를 사용하여 중앙 리포지토리를 설정할 수 있습니다 (CVCS와 마찬가지로 엄격하게 권한을 제어 할 수 있습니다. 그렇다면 어떤 이점이 있습니까?
naught101

사실이지만 Windows 환경에있는 경우 중앙 git 리포지토리를 설정하기 어려울 수 있습니다. 나는 그것이 내가 생각할 수있는 유일한 것 같아요. 회사 수준에서 CVS를 사용해야했기 때문에 실제로 많은 선택을 할 수 없었습니다.
Vadim

1

DVCS에 대한 개인적인 경험은 없지만 여기서 답변과 링크 된 문서에서 수집 한 내용에서 DVCS와 CVCS의 가장 근본적인 차이점은 사용 된 작업 모델입니다.

DVCS

DVCS의 작업 모델은 당신이 고립 된 개발을 하고 있다는 것 입니다 . 새 기능 / 버그 수정을 다른 모든 변경 사항과 별도로 팀의 다른 팀에 릴리스하기로 결정할 때까지 개발하고 있습니다. 그때까지는 다른 사람이 방해받지 않기 때문에 원하는 체크인을 할 수 있습니다.

CVCS

CVCS (특히 Subversion)의 작업 모델은 공동 개발을 수행하고 있다는 것 입니다. 다른 모든 팀원과 직접 협력하여 새 기능 / 버그를 개발하고 있으며 모든 변경 사항을 모든 사람이 즉시 사용할 수 있습니다.

다른 차이점

svngit/ 사이의 다른 차이점 ( hg예 : 수정본 대 변경 세트)은 부수적입니다. Subversion은 개정판을 기반으로 DVCS를 작성하거나 Git / Mercurial은 변경 세트를 기반으로 CVCS를 작성할 수 있습니다.

나는 특정 도구를 권장하지 않을 것입니다. 주로 당신 (그리고 당신의 팀)이 가장 편안한 작업 모델에 달려 있기 때문입니다.
개인적으로 CVCS 작업에는 아무런 문제가 없습니다.

  • 불완전하지만 컴파일 가능한 상태로 만드는 데 아무런 문제가 없으므로 물건 체크인에 대한 두려움이 없습니다.
  • 병합 지옥을 경험했을 때 svngit/ 모두에서 발생했을 상황이었습니다 hg. 예를 들어, 일부 소프트웨어의 V2는 V3을 개발하는 동안 다른 VCS를 사용하여 다른 팀에서 유지 관리하고있었습니다. 때때로, 버그 수정은 V2 VCS에서 V3 VCS로 가져와야하는데, 이는 기본적으로 V3 VCS에서 매우 큰 체크인 (모든 변경 사항이 단일 변경 세트에 있음)을 의미했습니다. 이상적이지 않다는 것을 알고 있지만 다른 VCS 시스템을 사용하는 것은 관리 결정이었습니다.

나는 고립 된 개발이 실제로 DVCS의 작동 모델이라고 생각하지 않습니다. DVCS의 중요한 기능 중 하나는 팀의 다른 구성원이 로컬 변경 사항을 가져 오거나 로컬 저장소를 복제 할 수 있다는 것입니다. 당신이 좋아하는 때 변경 사항이 커밋 항상 사용할 수, 그리고 당신의 버그가 대량 파괴를 일으킬 수 없습니다.
철학자

@philosodad : 다른 사람들이 해당 코드의 상태를 모르고 내 저장소에서 코드를 가져 오는 경우 여전히 혼란을 일으킬 수 있습니다. 유일한 차이점은 누구의 책임인지입니다. 그리고 내 코드가 항상 사용 가능한 것은 아닙니다 . 그것은 여전히 ​​내 시스템이 외부 액세스를 위해 구성되었는지에 달려 있습니다.
Bart van Ingen Schenau

사람들이 저장소에서 코드를 가져와 자신의 코드와 병합하면 대량 문제 없이 독립적으로 롤백 할 수 있습니다. 이 시스템의 주요 기능을 코드베이스에 대한 액세스를 거부하고 무력화하는 결정을 내릴 경우 둘째, 확인, 당신은 할 수 강제로 자신에 격리. 그것은 고립 된 개발을 위해 모델링 되는 시스템과는 많이 다릅니다 . DVCS는 아닙니다. DVCS의 작업 모델에 대한 이해는 간단하지 않습니다.
철학자

1
@ philosodad : 나는 그것을 더 잘 이해하기 시작한다고 생각합니다 .CVCS에서와 마찬가지로 모두가 엉망을 얻을 수는 있지만 더 이상 당신의 잘못이 아닙니다. :-)
Bart van Ingen Schenau

글쎄요 ... 그러나 일반적으로 Alice는 먼저 복제하거나 분기 한 다음 변경 사항 병합하여 버그가있는 코드를 처음 보지 않은 것처럼 가장 쉽게 만들 수 있습니다.
철학자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.