힘내-마스터에 직접 작업하면 어떤 문제가 발생합니까?


25

git 브랜치 모델에 대한 많은 조언을 보았으며 가장 일반적인 의견은 마스터 브랜치에서 직접 변경하는 것이 좋지 않다는 것입니다.

우리 동료 중 한 명이 마스터 지점에서 직접 변경하는 것을 매우 기쁘게 생각하며 여러 대화에도 불구하고 변경하지 않을 것으로 보입니다.

이 시점에서 나는 마스터에게 직접 일하는 것은 나쁜 습관 인 동료를 설득 할 수 없지만 그의 작업 방식과 상충되는 것을 이해하고 다시 방문해야 할 때를 알고 싶습니다. 이 문제.


2
"직접 작업"을 정의하십시오. 마스터는 사용되어야하기 때문에 존재합니다. 그것이 무엇을위한 것이라고 생각합니까?
candied_orange

3
마스터에서 일하고 있습니까? 그렇다면 왜 지금 변화해야한다고 생각하십니까? 작동하지 않으면 어떤 문제가 있습니까? 사람들이 다른 사람들의 주장을 지적하도록 요구하는 대신, 우리는 당신이 당신의 문제를 해결하도록 도울 수 있습니다.
Thomas Owens

1
애자일 팀에서는 지속적인 통합과 함께 트렁크 개발을하고있는 것처럼 들립니다. 이와 같이 작업하려면 한 번에 하나의 제품에 대해 너무 많은 작업이 수행되지 않도록 WIP를 시행하고 기능 전환을 사용하여 불완전한 기능을 끈 상태에서 마스터를 해제 할 수 있도록해야합니다.
Mr Cochese

... 팀이 얼마나 큽니까?
ZJR

@MrCochese 나는 여기서 "정상"이라는 의미에서 트렁크 개발을 부르지 않을 것입니다. 내가 Git을 사용한 많은 장소들 중 어느 것도 그런 식으로 일하지 않았으며, 나는 그것을 낙담시키지 않을 것이다. 기능 분기가 더 잘 작동합니다.
Marnen Laibow-Koser

답변:


57

커밋이 직접 마스터로 푸시 될 때 몇 가지 문제가 있습니다

  • 진행중인 작업 상태를 원격으로 푸시하면 마스터가 손상되었을 수 있습니다.
  • 다른 개발자가 마스터에서 새 기능에 대한 작업을 시작하면 잠재적으로 고장난 상태로 시작합니다. 이것은 개발 속도를 늦춘다
  • 다양한 기능 / 버그 수정이 분리되어 있지 않으므로 진행중인 모든 개발 작업의 복잡성이 한 지점으로 결합됩니다. 이것은 모든 개발자들 사이에 필요한 커뮤니케이션의 양을 증가시킵니다
  • 코드 검토를위한 매우 좋은 메커니즘 인 풀 요청을 수행 할 수 없습니다.
  • 다른 개발자가 그동안 마스터 브랜치를 이미 가져 왔을 수 있으므로 일반적으로 커밋 / 변경 내역을 스쿼시 할 수 없습니다

11
야 봐봐! 기본적으로 다른 모든 사람들과 달리 실제로 질문에 대답했습니다. ++ SE.SE에 오신 것을 환영합니다!
RubberDuck

이들의 대부분은 마스터에서 직접 작업에서 파생 된 문제입니다 심하게 자체가 마스터에서 직접 작동하지.
Ant P

1
@AntP 귀하의 관점에서 어떤 문제를 예방할 수 있습니까?
Gernot

10

새로운 기능에는 프로덕션 환경으로 넘어 가기 전에 테스트 환경에 배포 할 수있는 자체 개발 브랜치가 필요 하다고 설명합니다 .

그렇지 않으면 영구적으로 절반 완성 된 기능 상태입니다. 절반 완성 된 기능을 프로덕션에 배포 할 수 없으므로 마스터 지점에서 직접 작업하는 경우 다른 사람이 버그 수정을 포함하여 다른 사람의 변경 사항이 프로덕션으로 이동하기 전에 기능이 완료 될 때까지 기다려야합니다.

기능에 독립적 인 분기를 사용한다는 것은 각각의 새로운 기능이 다른 기능과 독립적으로 테스트되고 배포 될 수 있음을 의미합니다.


"반쯤 완성 된 기능을 프로덕션에 배포 할 수 없습니다" – 이것은 전혀 사실이 아닙니다. – 메인 브랜치에서 직접 작업하고, 모든 커밋을 전달하고, "반쯤 완성 된 기능"을 자주 배포하고 아무 것도 중단하지 않는 것이 전적으로 가능합니다. . 지속적인 배포는 배포와 릴리스 분리를 ​​정확히 수행하는 것입니다. 또한 사람들이 일반적으로 부서진 기술적 솔루션으로 해결하는 다른 많은 조직 문제를 해결합니다. 때때로 이것은 기능 토글과 관련이 있지만 일반적으로 눈에 띄는 동작 변경없이 기능의 90 %를 빌드하고 배포 할 수 있습니다.
Ant P

@AntP : 당신이 설명하는 프로세스는 내가 "반 완료 기능"이라고 부르는 것이 아닙니다. 이러한 기능 중 하나를 생산 준비 및 사용할 수있는, 테스트, 또는이 기능 스위치 또는 그들이 같은 때까지 비슷한으로 숨겨져하고 있다 , 생산 준비 및 사용 가능한 테스트. 작동하지 않는 기능은 제공하지 않습니다.
Robert Harvey

반제품을 배포 할 수 없기 때문에 비 마스터 지점에서 새로운 기능을 개발해야한다고 주장했습니다. 그렇지 않습니다. 마스터에서 직접 새 기능을 개발하고 기능이 완료되기 전에 다른 개발을 유지하지 않고도 해당 기능과 관련된 모든 코드를 프로덕션에 제공 할 수 있습니다.
Ant P

1
@AntP : 기능 브랜치가 기술에서 제공 할 수없는 것은 특정 기능에 대해 수행 한 작업에 대한 완전한 설명입니다. 일부 상점 (특히 광산)에서 그러한 책임은 사치가 아니라 요구 사항입니다.
Robert Harvey

1
@AntP 내가 당신을 올바르게 이해한다면, 나는 그 단계를 거꾸로 생각합니다. 나는 좋은 이슈 트래커를 좋아하고 그것들을 광범위하게 사용하지만 VCS가 어떤 기능이나 코드 라인의 개발 이력 을 알려주기를 원합니다 . 이슈 트래커는 변화 의 비즈니스 측면에 대한 이야기를 들려 줄 수 있지만, VCS가 코드 자체를 추적하고 감사하는 데 도움을 줄 수 없다면 작업을 수행하지 않는 것입니다. 이것이 트렁크 기반 개발에 반대하는 한 가지 이유입니다. VCS를 어리석게 만들어서 보상 할 수있는 이점이 없습니다. (또한 취성 결합? 기능 코드 변경입니다.)
Marnen Laibow-Koser Mar

2

마스터는 잠재적으로 출시 가능해야합니다. 기간. 마스터에서 작업이 절반으로 완료되어서는 안됩니다 (기능 플래그로 비활성화되지 않은 경우)

그것으로 나는 일부 팀들이 그들의 흐름을 복잡하게하는 것을 보았다.

마스터에 통합 할 때 PR을 사용하지 않는 것은 실수입니다. 개발자는 통합이 발생할 때 선택할 힘이 없기 때문입니다.

단일 개발 지점은 가치가 거의 없습니다. 일반적으로 문제를 복잡하게 만듭니다. 많은 기능 지점이 많은 가치를 제공합니다.

각 환경 (dev, test, prod)에 대한 브랜치를 만드는 것은 실수입니다. 이것은 git의 범위를 벗어 났으며 릴리스 파이프 라인에서 처리해야합니다. 각 환경에 대한 분기가있는 경우 불가능한 모든 환경에 정확히 동일한 빌드를 배포해야합니다.

기능이 너무 크면 하루나 이틀 안에 기능을 수행 할 수 없습니다. 기능 분기에 대한 모든 작업은 별도의 분기에 있고 PR과 통합되어야합니다.


"정확하게 동일한 빌드를 모든 환경에 배포해야합니다."를 제외하고 말한 대부분의 내용에 동의합니다. 실제로 릴리스 파이프 라인은 일반적으로 다른 빌드를 다른 환경에 배포 한 다음 테스트가 통과함에 따라이를 홍보 할 수 있어야합니다. 다른 가지 (또는 적어도 다른 태그)가 아닌 경우 어떻게 처리합니까?
Marnen Laibow-Koser

어쩌면 나는 완전히 명확하지 않았다. 빌드가 환경에 배포되면 다시 빌드하지 않고 동일한 아티팩트를 다음 환경에 배치해야합니다.
Esben Skov Pedersen

반복 가능한 빌드가 있으면 다시 빌드할지 여부는 중요하지 않습니다. 반복 가능한 빌드가 없으면 더 큰 문제가 있습니다. :)
Marnen Laibow-Koser

...하지만 그렇습니다. 배포 된 커밋에 태그를 지정하여 다시 빌드하는지 여부에 관계없이 동일한 코드를 승격시킬 수 있다고 생각합니다.
Marnen Laibow-Koser

예. 그러나 대부분의 CI 서버는 즉시 빌드를 릴리스에 링크하여 배포를 쉽게 추적 할 수 있습니다. 올바르게 설정하면 실제로 git에서 배포를 추적 할 필요가 없습니다. 힘내는 scm입니다. 배포 도구가 아닙니다.
Esben Skov Pedersen

2
  • 마스터는 작업중인 최종 버전 인 생산 지점을 반영해야합니다.
  • 마스터에서 직접 작업한다는 것은 버그를 생성하면 커밋을 취소 / 삭제 / 재설정하는 것 외에 "돌아 가기"에 대한 다른 옵션이 없다는 것을 의미합니다. 이는 깔끔한 작업 방법이 아니며 괜찮 았습니다.
  • 물론, 개발의 첫 단계에서 아마도 직접 마스터 작업을 시작할 수 있지만, 무언가를 제공 한 후에는 개발, 테스트 또는 실험 브랜치를 사용하여 게시 된 완전한 작업 버전을 건드리지 않아야합니다.

2

먼저, git에서 모든 pull것이 문자 그대로 분기 작업이며 모든 push것이 병합 임을 지적하고 싶습니다 . master개발자의 컴퓨터에이에서 완전히 분리 된 지점입니다 master기술적 인 관점에서 동일한 서, 공유 중앙의 repo에. upstream내 목적에 더 잘 맞는 경우 로컬 버전의 이름을 바꾸 거나 다른 것으로 바꾸는 경우가 있습니다.

많은 조직에서 동료보다 지점을 더 효과적으로 사용하고 있다고 생각하기 때문에 실제로 지점에 대한 추가 이름을 만드는 것보다 조금만 더 노력하면 역사에 저장되지 않습니다. 동료가 하나의 원자 적 커밋으로 기능을 커밋하는 경우 기능 브랜치의 병합 커밋만큼 쉽게 제거 할 수 있습니다. 대부분의 기능 지점은 수명이 짧고 어쨌든 자주 병합되어야합니다.

즉, 그의 작업 스타일의 주요 단점은 두 가지입니다. 첫째, 미완성 기능에 대해 협업하기가 매우 어렵습니다. 그러나 협업이 필요한 시점에 지점을 만드는 것은 어렵지 않습니다.

둘째, 병합하기 전에 검토하기가 매우 어렵습니다. 이 시점에서 실제로 그를 설득 할 필요는 없습니다. github, gerrit 또는 gitlab과 같은 도구를 채택하고 풀 요청 코드 검토가 필요하고 모든 병합에 대해 자동화 된 테스트를 통과했습니다. 이와 같은 일을하지 않으면 솔직히 git을 최대한 활용하지 않고 동료가 그 잠재력을 보지 못하는 것은 아닙니다.


1
또한 개발자에게 매일 자신의 지점 머신을 푸시하는 것은 좋은 백업입니다.
Ian

첫 문장을 이해하지 못합니다. pull새 분기를 만드는 방법이나 push병합 작업이 어떻게 되는지 모르겠습니다 . 오히려, a는 pull이다 말 그대로 a는 fetcha로 이어 merge!
mkrieger1

@ mkrieger1 로컬 master과 다른 지점으로 간주하는 방법을 쉽게 알 수 있습니다 origin master. 기술적으로, 그들은 각각 자신의 역사를 가진 두 개의 다른 리모컨에 다른 지점입니다.
RubberDuck

@RubberDuck 그렇습니다. With pull: Before : 잠재적으로 다른 커밋을 가리키는 두 개의 브랜치-After : 동등한 커밋을 가리키는 두 개의 브랜치-브랜치가 생성되지 않으므로 "분기 작업"이라고하지 않습니다. 두 명령 중 하나라도 push원격에 새 분기를 만들 수 있기 때문에 호출 합니다. 하지 않는 것은 병합입니다.
mkrieger1

@ mkrieger1 당신 은 또한 병합 방향 을 고려해야합니다 .
RubberDuck

2

다른 답변은 이미 마스터에서 작동하지 않는 다양한 이점 (절연 기능, 항상 배송 가능한 코드 등)을 언급했습니다.

나를 위해 당신은 다른 문제가있는 것 같습니다. 분명히 모든 개발자가 동의하거나 사용하는 개발 프로세스가 없습니다 (또는 문제의 개발자가 프로세스를 완전히 무시하고 있음).

피처 브랜치가 마스터로 병합되었거나 다른 릴리스 브랜치가 있거나 완전히 다른 프로세스를 사용합니까?

"마스터 브랜치를 사용하지 마십시오"는 충분하지 않습니다.


2

우리 동료 중 한 명이 마스터 지점에서 직접 변경하는 것을 매우 기쁘게 생각하며 여러 대화에도 불구하고 변경하지 않을 것으로 보입니다.

이것은 더 많은 문제가 있다고 믿게합니다. 마스터 여부에 대한 작업은 제품 출시 방법,시기 및시기에 대한 더 큰 철학의 일부입니다.

"마스터 작업을해서는 안됩니다"와 함께 기능을 테스트하고, 서로의 작업을 테스트하고, 서로의 코드를 검토합니까? 수락 및 통합 테스트.

위의 내용이없고 그냥 "git"을하기 위해하고 있다면, master에서 작업하는 것이 좋습니다.


1

지점에서 직접 일하는 것에 대한 "나쁜 실천"은 없습니다. 그러나 프로세스를 가장 잘 지원하는 것을 결정해야합니다.

질문 1 : 마스터가 소프트웨어의 현재 릴리스 상태를 나타내야합니까? 그런 다음 글로벌 개발 브랜치를 소개하고 릴리스 개발 종료시 개발을 병합해야합니다.

질문 2 : 코드 검토 프로세스를 원하십니까? 그런 다음 끌어 오기 요청을 통해 마스터에 병합되는 "기능 분기"가 있어야합니다.

질문 3 : 프로덕션 (또는 테스트)에 아직 게시하지 않아야하는 다른 개발자와 중간 코드 상태를 공유해야합니까? 둘 이상의 개발자가 기능을 개발하는 경우입니다. 그런 다음 "기능 지점"을 소개해야합니다.


태그는 릴리스시 코드베이스의 상태를 나타내는 매우 실용적인 방법입니다. 힘내 쉽게 특정 태그를 체크 아웃합니다. dev 브랜치를 일종의 똥으로 만듭니다.
RubberDuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.