2010-06-10 3 views
3

Mercurial이나 Git을 사용할 때 hginit.com과 같이 작성한 코드의 중간 변경 사항을 추적하기 위해 자주 커밋 할 수 있습니다.Mercurial 또는 Git을 사용하는 경우 자주 파일을 커밋하는 것이 좋습니까?

그러나 우리가 프로젝트에서 일하고 자주 파일을 커밋한다고 가정 해 봅시다. 이제는 관리자가 기능의 일부를 나가기를 원하기 때문에 Push를해야하지만 Mercurial이나 Git에서 개별 파일이나 폴더를 푸시 할 방법이 없다고 들었습니다. 밀거나 아무것도 밀리지 않는다. 따라서 우리는 푸시하고 싶지 않은 모든 파일을 되돌려 야합니다. 또는 우리가 푸시되기 전까지 커밋하지 않아도됩니다. 커밋 한 직후에 푸시합니다.

답변

11

(당신은 의욕, 힘내 또는 다른 버전 관리 시스템을 사용하고 있는지)이 관리하는 가장 좋은 방법은 당신의 일 이러한 " 기능의 일부"에 해당하는 지점에서 수행되어 있는지 확인하는 것입니다. 작업의 일부가 다른 작업과 독립적으로 릴리스되어야 할 작은 기회가있는 경우 에 처음부터 고유 한 분기가 있어야합니다.

이 당신에게 단지 "를 기능의 일부를"밀어 수있는 유연성을 제공하고, "일부 기능의 "및 다른 "기능의 일부"모두 변화를 포함하는 경우에 훨씬 더 적합하다 같은 파일에.

여기에 Mercurial 또는 Git을 사용하는 것에 대한 좋은 점은 이러한 분기를 관리하는 것이 쉬운 일이 아니므로 을 생성하고 사용하는 데 드는 비용이 최소화된다는 것입니다.

이제 모든 것을 예측할 수있는 것은 아닙니다. 당신이 말한 상황에서 을 붙이면, 나가기가 쉽다. . 로컬에 100 개의 변경 집합이 있고 (아직 서버에 있지 않음) 단지 에 1 파일의 현재 내용을 푸시하려고한다고 가정합니다. 서버 리비전으로 돌아가는 저장소의 복제본을 만들고 파일을 덮어 쓰고 커밋하고 푸시하고 다시 통합하십시오. 의욕 이것은 다음과 같이 보일 것입니다 :

$ cd ~/project 
$ hg clone http://server/project/trunk trunk-oops 
$ cp trunk/shouldve-branched trunk-oops/shouldve-branched 
$ cd trunk-oops; hg addrem; hg ci -m "We need to organize better!"; hg push 
$ cd ../trunk; hg fetch ../trunk-oops 
+0

다음 RMDIR 트럭 죄송합니다? PC에서 마지막으로 "hg clone"과 "hg update"는 500MB와 비슷했기 때문에 위의 2 단계 (hg clone)를 수행하면 PC에서도 데이터가 커지지 않습니다. (단지 "hg update"를 수행하지 않도록하십시오. 그렇지 않으면 500MB 데이터를 가져 오게됩니까?) –

+2

공간이 문제가되는 경우 (또는 그렇지 않은 경우에도) 로컬로 복제하십시오. Mercurial은 하드 링크를 만들어 여분의 공간이 소모되지 않도록합니다. hg 클론 -rSERVER_REVISION_HASH 트렁크 트렁크 -0ops –

+0

무엇이 복제에 관한 것입니까? 나는 Mercurial이 git과 동일하지 않다는 것을 알고 있지만, 확실하게 다른 branch, cherry-pick/rebase (또는 hg analog)를 생성하여 원하는 것을 얻고 그것을 밀어 낼 수있다.). – Cascabel

4

가지에 개발.

릴리스 분기 및 기능 분기가 있어야합니다. 각 기능을 사용할 수있을 때 병합합니다.

3

자주 커밋하는 것이 좋습니다. 귀하의 경우에는 태깅을 시작하거나 더 자주 분기해야 할 필요가있는 것 같습니다.

1

이 확장하고 다른 사람이 말한 명확히하기 : 자주 커밋하고 밀어 유연한 것은 상호 배타적이지 않다.

미리 계획을 세우고 적응할 수 있도록 커밋을하고 싶습니다. 이는 두 가지를 의미합니다. 자주 커밋을해야하며, git처럼 자주 분기해야합니다. 커밋이 작 으면 나중에 작업의 일부분을 선택적으로 그룹화해야 할 경우 커밋을 재구성하는 것이 더 쉬울 것입니다. 그리고 당신의 가지가 잘 조직되어 있다면, 당신은 이미 당신이 강요하고자하는 지점을 이미 가지고있을 것입니다.

이 두 비교 : 당신이있는 그대로 그 세 가지 주제 중 하나를 해제하려면

One branch, few commits: 

- A1 - B1 - C1 - B2 - A2 - B3 - C3 (master) 

Many branches, many commits: 

    M1 - M2 (master) 
/
o - A1 - A2 - A3 - A4 - A5 - A6 (topicA) 
|\ 
| B1 - B2 - B3 - B4 - B5 - B6 - B7 (topicB) 
\ 
C1 - C2 - C3 - C4 - C5 (topicC) 

이제, 당신이해야 할 모든이 마스터와 밀어 병합됩니다! topicA의 절반을 해제하고 나머지 절반이 커밋 A1, A3, A4 및 A6에서 처리되는 경우 topicA를 리베이스하여 해당 커밋 4 개를 먼저 배치하고 마지막 4 개를 마스터로 병합 한 다음, 밀어. topicA (A2 및 A5)의 나머지 부분은 향후 작업을 위해 지연 될 수 있습니다.

M1 - M2 ------------- X (master) 
/     /
o - A1 - A3' - A4' - A6' - A2' - A5' (topicA) 

(같은 내용으로 인해 자식과 함께 ... 'A1하여 두 커밋을 표시하지만 다른 부모는 실제로 다른 커밋합니다. 커밋)

관련 문제