2010-08-02 2 views
1

SVN에서와 같이 보입니다. 병합을 수행하면 사용자가 체크인 한 개정이 없습니다. 모든 "커밋"에는 사용자가 변경 한 코드 만 있어야합니다.Mercurial (hg)에서 Git과 동일하게 커밋 된 리비전에 수정되지 않은 코드 만있을 수 있습니까? (병합)

하지만 Mercurial에서는 그렇지 않습니다. "병합"커밋은 사용자가 커밋하지만 일반적으로 다른 사람이 변경 한 내용을 포함합니다. 그리고 그 커밋이 자동화 된 테스트에서 오류를 일으켰다면, 코드베이스를 깨뜨린 "병합"일 수도 있습니다. 즉, 다른 변경이 당신의 코드에서 작동하지 않거나 그 반대 일 수도 있습니다. (그러나 다른 변경 사항은 (1) 테스트에서 멀리 떨어져 있지 않았기 때문에 (2) 테스트가 일괄 처리되고 - 테스트 102가 1 시간 동안 실행되고 3 회 푸시 그 시간 내에 마지막으로 푸시 된 버전 만 테스트 됨)

이 동작은 Git과 동일합니까?

그래서 테스트 자체를보고 원인을 확인하고 수정해야합니다.하지만 누가 테스트해야합니까? - 당신이나 당신 팀원입니까? 이 동작의

첫 만남은 ... 가지 이상한 느낌

답변

3

이 그것을 않습니다 누구든 최선을 다하고됩니다 병합. 그러나 당신은 bisect 수 나무와 다음 blame 문제를 일으킨 사람. 또한 책임이있는 사람들의 생각이 있다면 그들에게 그것을 보라고 지시해야합니다. 테스트를 올바르게 작성했다면 잘못된 점을 알려야합니다. 두 가지 모두 기능을 수행 할 수 없다면 외교적이어야하며 결정을 내려야합니다.

0

나는 당신이 무엇에 관해서인지 이해하지 못합니다. 두 개의 개발 라인에 합류 할 때 (병합을 수행 할 때) 병합 커밋을 만들 것입니다. 즉, 두 행의 역사를 결합하는이 행동을 나타내는 수정입니다. Git과 Mercurial에서 이러한 커밋은 양쪽 부모를 기억합니다. Subversion에서 이러한 개정은 모든 파일에 대한 개정을 모두 기억합니다 (올바르게 이해하면).

대부분의 경우 병합 커밋은 이되며 은 자동으로으로 생성됩니다. Git에서 (그리고 Mercurial에서도) 3-way merge를 사용했다. 여기서 3 번째 포인트 (개발/분기의 병합 된 두 라인의 팁 외에)는 공통 조상이다. SVN 또는 svnmerge와 같은 타사 도구를 사용하지 않고서 만 병합 기반을 계산하는 데 필요한 정보를 저장합니다 (버전 1.5 이후 버전). Git과 Mercurial은 버전을 전체적으로 병합하는 반면 Subversion은 파일을 병합하는 것으로 알고 있습니다.

때때로 자동화 된 병합이 실패하고 은 수동으로 충돌을 해결하고, 병합 완료를 커밋해야합니다. 이것은 모든 버전 제어 시스템에서 발생할 수 있습니다.

자동 병합이 성공했는지 실패했는지에 상관없이 자체 병합 작업 (Git과 Mercurial의 병합 커밋)으로 인해 버그가 발생할 수 있습니다. 예를 들어 한쪽이 일부 기능에 대해 호출 규칙을 변경하고 다른 쪽이 이전 API가있는 다른 호출 사이트를 추가하는 상황을 예로 들어 보겠습니다. 자동 병합은 성공할 수 있지만 병합에는 개발 라인 두 개 모두 오류가 없더라도 오류가 발생합니다.

그럼에도 불구하고 git bisect은 버그를 도입 한 것이 병합 커밋 (병합 행위)임을 알 수 있습니다.

+0

아마 전에 SVN이나 CVS를 사용하지 않았습니까?나는 그 시스템에서 병합이 별도의 커밋이 아니라고 생각한다. –

+0

버전 관리 시스템 (버전 1.5 이전의 CVS 및 Subversion)에서 병합은 별도의 개정판 이었지만 병합이라는 것을 기억하지 못했습니다. 즉, 두 줄의 개발을 병합 한 것입니다 (예 :'cvs update -j ... -j ...'는 커밋을 생성하고, IIRC). –

관련 문제