2011-10-31 4 views
5

그래서 Git을 사용하여 branch-per-feature 워크 플로우에 대해 들어 봤습니다. 그리고 나는 또한 왜 this could be a bad idea이라는 몇 가지 이유를 읽었습니다.git 브랜치가 "오래되었다"는 어떤 해가 있습니까?

내 진짜 질문은 - 간단한 분기점 파서 같은 간단한 기능을 개발할 때이 분기를 다시 트렁크에 병합 한 후 해당 분기에 어떤 일이 발생했는지 (또는 발생해야하는지)? 그냥 거기 앉아 있니? 매우 구체적인 기능을 위해 만든 이후, 나는 돌아가서 지점을 사용해야하는 이유를 생각할 수 없습니다. 어떻게 든이 지점을 쓸데없는 것으로 표시해야합니까, 아니면 그냥 계속 나아가서 잊어 버려야합니까?

감사합니다.

+3

완료되면 지점을 삭제할 수 있습니까? ('git branch -d') –

+1

그래, git branch -d는 항상 안전하며 이후에 가비지 수집 될 수있는 모든 수정 사항을 잃을 수 없습니다. git branch -D는 다른 곳에서는 찾을 수없는 변경 사항을 포함하는 브랜치까지도 삭제합니다. 이것은 접근법이 완전히 막 다른 길 이었다는 것을 결정했을 때 유용합니다. 디스크 공간이 얼마나 싼지 감안할 때 git branch를 사용하는 것은 혐오 스러울 것입니다. -D – tialaramex

+0

브랜치가 커밋을 가리키는 포인터라는 것을 기억하는 데 도움이 될 수 있습니다. 일단 브랜치에서 작업을 끝내고 커밋을 병합했다면 더 이상 그 지점을 가리킬 필요가 없습니다. – Cascabel

답변

13

피쳐 브랜치를 사용할 때 머지 기능을 브랜치에서 개발했다는 ​​사실을 기억하고 싶습니다. 따라서 더 쉽게 기록을 탐색 할 수 있습니다. 기능 또는 버그별로 변경 사항을 그룹화하고 가장 중요한 사항을 쉽게 알 수 있습니다. 왜 변경이 수행 되었습니까?

내가 병합 할 때, 나는 의도적으로 git merge --no-ff으로 빠른 전달을 사용 중지합니다. 이것은 역사에서 지부의 구조를 유지합니다. 그런 다음 분기 레이블 (git branch -d branch_name)을 삭제할 수 있으며 병합 지점에 분기 이름이 포함되며 분기 세트가 정리됩니다.

대조적으로 분기에서 작업 할 때 업스트림 브랜치를 리베이스하는 것을 선호합니다. 이것은 브랜치의 역사를 멋지고 깨끗하게 유지하며, 업스트림 머지 노이즈 및 충돌 해결이 거의 필요 없습니다.일반적으로 병합하기 전에 업스트림을 리베이스하여 (분기 작성자가 충돌 및 깨진 테스트를 수정할 수 있기 때문에) 통합 작업을 쉽게하고 병합 클리너를 생성합니다.

이 방법은 더 이상 개발되지 않는 오래된 분기가 막히는 것을 방지하면서 분기의 내역을 유지합니다. gitk 또는 GitX로 역사를 시각화하는 것은 매우 유용합니다.

당신이 링크 된 기사의 기본 사항에 동의합니다. 동시에 더 많은 큰 기능을 가지기 때문에 충돌과 통합 문제가 발생할 가능성이 커집니다. 그 (것)들을 이렇게 유용한시키는 고립은 책임으로된다. 솔루션 중 하나는 크고 오래된 지형지 물을 가지지 않는 것입니다. 피쳐 브랜치를 완료하고 통합 할 수있는 작은 조각으로 파 내려하면 문제를 피할 수 있습니다. 이것은 코드를 검토해야하는 빈약 한 상황과 같이 다른 많은 이유로 유용합니다.

지형지 물을 본선에 지속적으로 통합 할 수 있다면 지형지 물은 유용하고 작동하며 테스트를 거쳐 문서화 된 작업을 수행해야합니다. 그것이 있다면, 그것들은 그들 자신의 가지들로 분리 될 수 있습니다.

나는 자유롭게 나는이에 너무 많이 읽을 수 있지만 문서의 가능성이 말하는 결함 중 하나가 나뭇 가지가 하지 기능 지명된다는 점이다 인정한다. 이는 각 지점이 "파란색 위젯 추가"보다는 "Jim이 작업하고있는 것"을위한 것임을 의미합니다. 그것은 발달 문제의 수 ...

  • 기능을 의미하고 가지
  • 가지 개별 기능
    • 대신에, 지사는 개인 놀이터
    • 함께하지 않은 개인 또는 팀 소유 있습니다 정의되지 않은 기능, 그들은 계속해서 갈 수있다.
  • 발전은 사일로에서 이루어진다
    • 개인이 많은 기술적 아니다

정기적으로

  • 개인이 통합 될 때까지
  • 개인이 자신의 변화에 ​​대해 얘기하지 않는 지점에 함께 작동하지 않습니다 서로 말하지 않는다 문제가 아니라 사회적 문제. 그 중 많은 부분은 Github와 같이 버전 관리와 강력하게 연결된 좋은 문제 추적기를 강력하게 사용하여 해결할 수 있습니다. 주요 변경 사항은 다음과 같습니다

    • 가지해야 정의 기능을 할 떨어져가는 그들이있을 수 있지만
    • 아무도 (기능 "을 소유하지 않습니다"작품의 무리를하고 전에 문제 을보고해야
    • 개발자

    두 번째 것은 대부분의 프로젝트 버그 추적 정책에 의해 권장되지 않습니다. 버그를보고하기 전에 패치를 준비해야한다는 충고는 매우 강력합니다.

    양호한 지점 관리에는 강력한 버전 제어 통합 및 환영 정책이 포함 된 양호한 문제 추적기로 인해 좋은 사회화가 필요합니다.

  • 3

    더 이상 필요하지 않으면 삭제하십시오. 나중에 깨닫는다면 다시 필요로합니다. 다시 만들 수 있습니다. 변경 사항을 다시 "트렁크"로 병합했기 때문에 아무 것도 손실되지 않습니다.

    0

    유일한 이유, 내가 볼 수있는, 당신이 주위를 유지하려는 것이다 것은 :

    • 당신은 당신이 마지막으로 근무 때의 역사를합니다.
    • 개발을 시작할 때 추측 할 수 있습니다.
    +1

    커밋을 가리키는 실제 분기를 사용하지 않고도 히스토리를 볼 수 있습니다. 지점을 유지하는 실질적인 이유는 없습니다. 지점을 가지고 작업이 완료되고 다른 지점으로 병합 될 때입니다. – poke

    +0

    동의. 그러나 분기 메시지가 커밋 메시지에서 수행 한 작업을 리버스 엔지니어링하는 것이 아니라 유용한 분기 이름을 보는 것이 훨씬 쉬울 것이라고 생각합니다. – Andy

    1

    두 가지 고려해야 할

    1. 어쩌면 당신이 그들을 방문하기 전에 마스터 (또는 어디든지)의 끝 부분에이 지점을 리베이스하는 습관을 가져야한다. 이런 식으로, KingCrush가 상기에서 제안한대로 엄격하게 중복되며, 문제가 발견되면 나중에 재현되도록 파괴 될 수 있습니다.

    2. 이름 바꾸기를 사용하면 특정 접두어로 다시 필요할 경우 잘 모르는 분기를 표시하여 쓸모가 없다는 것을 알고있을 때 분기 목록에서 빠르게 건너 뛸 수 있습니다. 기능 분지.

    이러한 기술을 혼합하여 사용할 수 있습니다. 예 : 항상 rebase 한 다음, branch foo의 이름을 landed-foo로 변경 한 다음, set interval (예를 들어, 하나의 릴리스 또는 30 일) 후에 landed-foo 브랜치를 삭제하십시오.

    리베이스 (및 리베이스 된 버전에 대한 테스트 실행)를하면 버그가 발생한 이후 발견 된 버그가 실제로 개발 된 코드에 있었고 영향으로 인한 것이 아닌지 확인할 수있는 방법이 없습니다 개발 후 병합하기 때문에이 경우에 한동안 분기를 유지해야 할 수도 있습니다. 이것은 침입 성/매우 큰 변화로 인해 자주 발생하며 질문 시나리오와는 다릅니다.

    +0

    Rebase가 항상 파괴되는 것은 아니므로,이 기능이 개발되었습니다. 올바르게 병합하는 데 아무런 해가 없으며 실제로 git는 광범위한 분기 및 병합을 처리하기 위해 개발되었습니다. 나중에 기록에 명확한 지점을 표시하면 해당 기능이 개별적으로 개발되었음을 알 수 있으며 필요한 경우 나중에 쉽게 식별 할 수 있습니다. 똑같은 방식으로 분기를 지우는 것이 완전히 안전합니다. 분기가 명령 내에서 커밋을 가리키는 포인터 일뿐입니다. 분기를 삭제해도 해당 분기가 속한 기록은 삭제되지 않습니다. 이력에는 항상 분기/병합이 표시됩니다. – poke

    3

    Git과 분기에 대한 좋은 점은 각 분기가 본질적으로 커밋을 가리키는 포인터라는 점입니다. 브랜치를 병합하면 브랜치를 구성하는 데 사용 된 커밋이 이제 주요 히스토리의 필수 부분이된다. 당신이 볼 수 있듯이

            main 
                 | 
        (main) -------x----x----x-x---x----x 
            \    /
        (your branch) \--x--x-x--x-x---/ 
    

    , 당신의 지점에서 커밋은 여전히 ​​안전 :

    이 시점에서
            your branch 
                main 
                 | 
        (main) -------x----x----x-x---x----x 
            \    /
        (your branch) \--x--x-x--x-x---/ 
    

    , 당신은 "자식 지점 -d"를 사용하여 분기를 삭제하는 경우는, 당신은 남아있어 . 바뀐 점은 "your branch"라는 포인터가 삭제되었다는 것입니다.

    main에 병합하지 않았다면 "git branch -d"가 실패했을 것입니다.

            main 
                | 
        (main) -------x----x----x-x---x--x 
            \ 
        (your branch) \--x--x-x--x-x 
    

    , 커밋은 "매달려"하고 다음의 자식을 제거 할 것이 단계에서 어떤 지점 포인터가 없기 때문에이 쓰레기를하지 : 당신이 그 시점에서 삭제 된 힘, 당신은 남아있을 것 수집.

    요약하면, 분기가 병합 된 경우 삭제할 수 있고 삭제해야합니다. 병합되지 않은 경우에는 안됩니다.

    관련 문제