"종종"병합하는 것이 좋습니까? 아니면 완료 후에 만 ​​기능 분기를 크게 병합하는 것이 더 낫습니까?


40

여러 가지 개발되고 말 AB뿐만 아니라 증가 "버그 수정"지점 C.

이제는 C"완료"되어 마스터로 병합되었습니다. A그리고 B아직 개발과 (아마도) 다른 버그 수정 분기 마스터로 병합하기 전에 고정되지 않습니다.

C새로운 기능 분기에서 가능한 빨리 병합하는 것이 좋습니다 ? 새로운 기능이 가능한 한 가깝게 유지되도록 master? 아니면 새로운 기능이 완료된 후에 만 ​​마스터로 병합되는 자체 "세계"에서 개발되도록하는 것이 더 낫습니까?

어쨌든 갈등이 생길 수 있으므로 문제를 해결하는 데 시간이 필요합니다.



5
기능 분기를 메인 라인으로 병합하는 것에 관한 @gnat, 기능이 개발되는 동안 메인을 기능으로 다시 병합하는 것이 "충돌을 조기에 해결"하는 것이 좋은지 궁금합니다.
paul23

1
@ paul23, 나는 그것이 실질적인 필요성이라고 말할 것입니다.
베린 로리 치

3
솔직히 모듈을 분리하고 잘 정의 된 작업 모델을 만드는 것과 같이 코드에서 적절한 디자인을 사용하기 시작했을 때 수많은 버전 관리 문제가 사라졌습니다. 병합하는 동안 문제가 너무 많이 발생하면 다른 심각한 문제가 발생할 수 있습니다. 좋은 디자인은 불필요한 충돌을 피하는 데 매우 도움이됩니다.
T. Sar-복원 자 Monica Monica

2
나중에 병합을 너무 아프게하지 않기 위해 "충분한"상태를 유지하기 위해 마스터로부터 정기적으로 병합하는 것이 좋습니다.
Thorbjørn Ravn Andersen

답변:


71

지점의 수명이 길수록 메인 지점에서 더 많이 분기 할 수 있고 더 복잡하고 최종 병합이 완료되면 병합이 더 복잡해집니다. 10 개의 작은 충돌은 1 개의 큰 충돌보다 해결하기 쉽고 실제로 개발자가 중복하거나 노력을 낭비하지 못하게 할 수 있습니다. 병합해야 감안할 masterA하고 B정기적으로; 하루에 한 번은 매우 일반적인 권장 사항이지만 지점에 많은 활동이 있으면 하루에 여러 번 병합 할 수 있습니다.

충돌 해결을 쉽게하는 것 외에도 C버그 수정 브랜치를 언급 합니다. 개발자는 버그로 이어지는 동작을 반복하지 않거나 잘못된 데이터를 기반으로 테스트를 작성하지 않도록 지점에 모든 최신 버그 수정을 갖기를 원합니다.

어쨌든 갈등이 생길 수 있으므로 문제를 해결하는 데 시간이 필요합니다.

충돌이 있음을 알고 있다면 다른 분기 전략을 채택 할 수 있습니다. 가능하면 같은 지점에서 같은 파일에 여러 변경 사항을 유지하고 충돌 횟수를 줄이거 나 제거하십시오. 스토리를 가능한 한 완전히 독립적으로 리팩토링하고 브랜치, 피처 및 스토리가 항상 상호 교환 가능한 것은 아닙니다.


33
리베이스는 종종 더 명확한 커밋 히스토리를 생성하므로 병합 또는 리 베이스.
chrylis

11
@chrylis : 두 가지 개발자가 같은 지점에서 일하는 것을 의미하는 "지점은 여러 이야기를 다루고있다"는 말을하면 rebasing 은 위험 할 수 있습니다 .
meriton-

9
공식 문서의 @meriton : 저장소 외부에있는 커밋을 리베이스하지 마십시오. 그 지침을 따르면 괜찮을 것입니다. 그렇지 않으면 사람들이 당신을 미워하고 친구 나 가족에게 경멸하게 될 것입니다. LOL
익스트림 바이커

6
@XtremeBiker : Git의 리베이스 변경 내역. Git은 이와 관련하여 실제와 같이 작동합니다. 역사를 바꾸려면 음모가 필요합니다. Git의 저장소에는 정기적으로 리베이스되는 브랜치가 있으며 매우 대중적인 브랜치입니다. 이것이 작동하는 이유는 음모가 있기 때문입니다.이 지점을 사용하는 모든 사람들은 특정 시간에 역사를 다시 쓰겠다고 동의하므로 모든 시간을 합병 할 수있는 위치에 있는지 확인합니다.
Jörg W Mittag

1
@ paul23 마스터에게 전달하기 전에 A와 B를 새로운 공유 지점에 전달하는 것을 진지하게 고려하십시오. 둘 다 급진적 인 정밀 검사 인 경우 마스터에 조합을 적용하기 전에 일련의 테스트를 위해 함께 원합니다. 확신이 든다면 하나를 직접 마스터에게 전달한 다음 다른 하나를 새로 업데이트 된 지점으로 전달할 수 있습니다. 병합이 잘못되거나 무언가를 다시 디자인해야 할 경우를 대비하여 두 번째 기능에서 원래 코드를 볼 수 있습니다.
Sinc

11

A, B를 다시 마스터로 병합하고 단일 코드 기반을 유지하려는 의도라면 마스터에서 너무 멀리 벗어나는 것은 좋은 생각이 아닙니다. A, B가 개발 될 때 버그 수정 및 기타 개발이 마스터로 병합 될 때 마스터에서 너무 오랫동안 벗어나면 확실히 충돌이 발생합니다.

나는 다음과 유사한 전략을 고려할 것입니다

  1. A, B를 담당하는 사람은 마스터를 면밀히 관찰하고 변경 사항을 병합해야합니다.
  2. 더 나은 방법은 자동화를 구축하고 테스트하는 경우 A, B가 마스터로 병합되고 매일 밤 테스트를 통과하는지 확인하십시오.
  3. 다른 답변에 대한 의견을 바탕으로 A, B가 개발하는 데 시간이 걸릴 수 있습니다. 이 경우 A, B를 서로 병합하여 결국 마스터로 다시 병합하는 데 큰 문제가 발생하지 않도록 고려할 수도 있습니다.
  4. 더 높은 수준에서 왜 2 개의 개별 개발 라인이 필요한지 생각해보십시오. 더 작은 병합으로 분류 할 수 있습니까? 별도의 마이크로 서비스로 나눌 수 있습니까?

5

일반적으로 종종 거대한 하나보다 낫다.

작고 빈번한 풀 요청이 거의 항상 좋습니다.

나는 초기에 더 작은 풀 요청을 수행하여 코드를 더 쉽게 병합 할 수 있지만 기능을 비활성화 된 상태로 두도록 구성 플래그를 주로 사용하기 시작했습니다. 풀 요청이 작을수록 더 많은 총 풀 요청이 있어도 코드를 쉽게 검토 할 수 있습니다. 모든 종류의 인간은 대규모 풀 요청에 대한 의미있는 검토를 수행 할 수 없습니다. 막대한 코드 변경의 가능한 모든 의미를 이해하기에는 정신 RAM이 너무 어렵습니다.

구성 플래그를 작성하는 데 추가 오버 헤드가 있으므로 더 작은 기능에서는 가치가 없습니다. 그러나 풀 요청은 어쨌든 작습니다.

그러나 기능을 한 번에 해제해야하는 상황이있을 수 있습니다. 그럼에도 불구하고 그 목적을 위해 만들어진 다른 지점에 대한 더 작은 풀 요청을 수행하는 것이 좋습니다.

내 동료의 대부분은 누군가가 대규모 풀 요청을 만들 때 신음하며 대부분의 경우에는 그렇습니다.

또한 때로는 커밋을 별도의 분기로 체리 선택해야합니다. 체리 피킹해야 할 것을 단일 커밋에 넣을 수 있으면 다른 지점으로 쉽게 옮길 수 있습니다. 실제로 커밋이 거의없는 것이 좋지만 체리가 따를 경우 표준 프로세스가 아닙니다.


1
기능 플래그는 비용이 많이들 수 있습니다 (45 분에 4 억 5 천만 달러). 이 예는 Bob 아저씨언급하고 있습니다 (그러나 기술적으로는 전혀 필요하지 않습니다).
피터 모텐슨

1
네, 결국 그것들을 제거하는 오버 헤드가 있지만, 일반적으로 그렇게 어렵지는 않습니다. 더 오래 유지할 수 있지만 플래그는 더 많은 사용법을 제공합니다. 우연히 또는 후속 조치를 취하지 않으면 상황이 나빠질 수 있음에 동의합니다. 큰 풀 요청을 검토하기가 어려워지면 상황이 나빠질 수 있습니다. 반면에 일부 사람들은 작업중인 앱에 구성 플래그와 같은 것을 추가 할 수있는 위치에 있지 않을 수 있습니다. 일반적으로 UAT 및 기능 롤아웃에 도움이됩니다.
마크 로저스

3

Martin Fowler의 리팩토링에서 그가주는 충고는 하루보다 더 오랫동안 지점을 가지지 못하게하는 것입니다. IIRC, 당신은 작은 변화를 만들고, 당신이 아무것도 깨지 않았는지 확인한 다음 다시 병합해야합니다.


2
글쎄 A, B응용 프로그램이 어떻게 작동하는지에 대한 근본적인 새로운 점검을 유지하십시오. 그들은 한 달 안에 "완료"되지 않습니다. 그러나 그들은 또한 그들이 끝나기 전에 쓸모가 없다.
paul23

8
그들은 완료되기 전에 쓸모가 없을 수도 있습니다. 그들은 완전한 결과를 향한 발걸음이되어 미래에 필요한 작업을 줄임으로써 가치를 제공합니다. 기능 토글, 추상화에 의한 분기 또는 마지막으로 사용자 인터페이스 부분을 수행하는 것과 같은 기술을 사용하여 불완전한 작업을 마스터에 안전하게 병합 할 수 있어야합니다.
bdsl

1
그렇기 때문에 마스터 브랜치의 변경 사항 위에 로컬을 리베이스하는 것이 장기 개발에 편리합니다. 그것이 바로 최신 떨어져 분기 된 것처럼 작업을 유지
NKCampbell

2

완료되었지만 사용할 준비가되지 않은 실제로 오래 지속 된 변경에 대한 또 다른 옵션은 변경 사항을 기능 플래그 뒤에 두어 마스터에 병합 할 수는 있지만 아무것도 중단 할 위험이 없다는 것입니다. 그런 다음 사용할 준비가되면 기능 플래그를 제거 할 수 있습니다.


1
기능 플래그 = 좀비 코드 (부활 할 때까지)?
피터 모텐슨

@PeterMortensen 글쎄, 당신은 가능한 빨리 플래그를 제거하는 것을 목표로하지만 특정 상황에서 작동 할 수 있습니다
Qwertie

3
@PeterMortensen 적어도 한 사람이 깃발을 켜면 안됩니다
Ian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.