git“Rebasing의 황금률”이 꼭 필요한가?


22

나는 최근 GIT의 기능 브랜치 리베이스 전략에 반대하는 사람들과 토론을했습니다. 로컬, 개인 브랜치에 대해서만 리베이스를 사용하는 것이 허용되는 패턴 인 것 같지만,이 "소위 골든 리베 이싱 규칙"에 따라 동일한 기능 및 브랜치에서 작업하는 여러 사람이있을 때는 사용하지 않는 것이 좋습니다 (예 : https : : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

이것에 대한 합의가 있다는 것이 놀랍습니다. 나는 약 20 명의 개발자가 함께 작업하고 무엇을 추측했는지와 함께 완전한 rebasing 전략으로 3 년 동안 일했습니다.

프로세스는 기본적으로 다음과 같습니다.

  • 피처 브랜치를 만들고 "myfeature"라고 부르고 origin / myfeature로 푸시합니다.
  • 다른 사람들이 확인하고 작업 할 수 있습니다.
  • 때로는 마스터에서 rebase 할 수 있습니다 : "myfeature", git rebase origin / master ; 그렇습니다, 당신은 그것을 강제로 밀어야합니다.
  • 다른 사람들이 커밋을 추진하려고하면 어떻게됩니까? 그들은 그것을 rebase합니다 : git rebase origin / myfeature . 그래서 그들은 앞으로 빨리 가고 있으며 강제하지 않고 그것을 밀 수 있습니다.

존중할 유일한 원칙 은 기능 분기가 누군가가 소유 한다는 입니다. 소유자는 푸시 강제 할 수있는 유일한 사람입니다.

따라서 저는 인정합니다. 푸시 포스가 발생하자마자 오류가 발생할 위험이 있습니다. 사실입니다. 그러나 오류를 복구하는 방법은 여러 가지가 있으며 실제로 3 년 간의 개발 과정에서 많은 강제 푸시 오류를 보지 못했습니다.

그렇다면 왜 "골든 리베이스 규칙"이 널리 받아 들여지고 있습니까? 내가 놓친 다른 것이 있습니까? 나는 최소한의 조직이 필요하다는 것을 알고 있지만 (모든 전략에는 일부 조직이 필요합니다) 작동합니다.


내가 잊어 버린 것이 있지만 그 중요성이 중요합니다. 이전 경험에서 우리는 코드 검토 도구로 gerrit를 사용했습니다. 즉, 지점 소유자가 리베이스를 수행하는 동안 누군가가 커밋을 푸시하면 커밋이 원본 리포지토리로 직접 보내지 않고 gerrit로 푸시되므로 커밋이 손실 될 위험이 없습니다. 그리고 지점 소유자 만이 gerrit로부터 커밋을 제출할 권리가 있기 때문에 실수를 저지를 위험이 매우 낮습니다.
Joel

다른 사람의 기능 분기를 내 자신의 부서로 병합하면 어떻게됩니까?
Winston Ewert 2016 년

귀하의 기능이 다른 기능에 의존하는 경우 다른 기능에서 당신의 기능을 리베이스 할 수 있다고 생각합니다 : git rebase origin / otherFeature (목표는 히스토리를 선형으로 유지하는 것이기 때문에 병합보다는 리베이스라고 말합니다). 브랜치 사이에 점점 더 많은 종속성을 도입하면 모든 복잡성이 크게 증가한다는 것을 인정합니다.
Joel

답변:


10

강제 푸시 문제는 기능 브랜치 및 마스터에 관한 것이 아니라 마스터를 다른 마스터에게 푸시하는 것에 관한 것입니다. 동기화는 변경 사항으로 마스터를 덮어 쓰면서 팁에있는 내용을 무시합니다.

이 위험을 고려할 때 문제가 발생하지 않고 수리를 위해 완전히 사용해야하는 경우가 아니면 전혀 사용하지 않아야하는 이유가 있습니다. SCM 시스템은 무언가 잘못되었다고해서 이런 식으로 강요 될 필요가 없습니다 (이러한 첫 번째 방법은 백업을 복원하고 기록을 그대로 유지하기 위해 작업을 반복하는 것입니다).

아마도 문제는 왜 당신은 전혀 근거가 없습니까? 기능을 다시 마스터로 가져올 때 '깨끗한'기록을 원하십니까? 그렇다면 순수한 스타일의 이유로 분기와 관련된 모든 좋은 역사를 버리고 있습니다. IMHO 빨리 감기 병합도 모범 사례가 아니며, 모든 기록을 유지하여 나중에 위생 버전이 아닌 실제로 수행 한 작업을 확인할 수 있어야합니다.


물론 마스터를 끌어 당기고 기지를 밀고 강제로 밀어 붙일 수는 있지만 그것은 원자 적이 지 않습니다.
Kevin

@gbjbaanb 당신은 절대적으로 맞습니다. rebasing 전략은 스타일 이유 / 더 읽기 쉬운 역사에 관한 것입니다. 나는 그것이 더 낫거나 그렇지 않다고 주장하려고하지 않습니다. 그러나 그렇게하는 것이 가능하며 그것이 제가 높이고 싶은 요점입니다. 물론 마스터에서 강제 푸시에 대해 이야기하는 것이 아니라 기능 분기에서만 이야기했습니다.
Joel

4
IMHO rebase와 fast-forward merge의 디자인 기능은 실수였습니다. SCM은 기록을 유지하여 필요할 때 발생한 상황을 확인하고 관련 시점에 대한 스냅 샷을 생성합니다. 적어도 그것이 대부분의 사람들이 원하는 것입니다. Linus는 역사가 가능한 한 읽기 쉽도록 역사를 원했기 때문에 그의 이익을 위해 그것들을 넣었습니다. 이럴 그는 (즉, 단순로보기를 허용하지 기본 역사) 더 다루기 대신 두 버전 사이의 만드는 차이점에 더 많은 노력을 했어야
gbjbaanb

2
논문을 출판 할 때 첫 번째 초안을 출판합니까? 첫 번째 초안을 작성하는 데 사용하는 도구를 출판 용으로 편집하는 데 사용할 수 없다는 법률이 있습니까? 힘내 개발 도구입니다. 시리즈를 확실하고 확실하게 보존하려면 보존하십시오. 출판 용으로 편집하려면 편집하십시오. Git은 두 작업 모두에서 훌륭합니다.
jthill

5

Rebase는 대부분 화장품이라고 말하는 것처럼 필수는 아닙니다. 때로는 병합보다 훨씬 간단합니다. 따라서 "실제"값을 가질 수 있지만 "때로는"

리베이스를 잘못 사용하면 비용이 많이들 수 있습니다. 당황하지 않고 복구 절차를 찾아보기 만하면 데이터를 잃을 가능성은 없지만 "아무도 고칠 필요가 없습니다 ..."는 좋지 않습니다. 또한 기능을 추가하거나 버그 (또는 가족이있는 집)를 추가 할 수있을 때 연구 회복 및 테스트에 시간을 허비하지도 않습니다.

그 절충으로 인해 "거의 소수의 사람들이 리베이스와 강제 밀기를하는"결과는 그리 놀라운 일이 아닙니다.

일부 워크 플로는 위험을 줄일 수 있습니다. 예를 들어 "강제 할 수있는 분기와 할 수없는 분기를 기억하는 한"위험을 0으로 줄입니다. 실제로 그들은 위험을 정당화하기에 충분히 안전 할 수도 있지만, 사람들은 종종 더 큰 민속에 근거하여 선택을합니다. 그런 다음 다시 현실에서 이점은 매우 작습니다. 따라서 위험이 얼마나 작아야합니까?


3
"아직 아무도 고칠 필요가 없어요 ...".. Visual Source Safe를 사용하던 시절처럼 들립니다. 나는 git이 그것보다 낫다고 생각했다.
gbjbaanb

그렇기 때문에 사람들은 "날카로운 도구를 사용하지 마십시오! (강제 밀기)"와 같은 규칙을 만들어 피할 수없는 상처를 피할 수 있습니다!
Stripes

2
@gbjbaanb 그렇습니다. 제대로 사용하면 Git이 그것보다 낫습니다. Git이 지속적으로 개발을 우아하게 처리 할 수 ​​없다는 것에 대해 불평하는 것은 끊임없이 모든 것을 커밋하고 해시를 변경하면 말이 당기기에 훨씬 무겁기 때문에 캐리지보다 열등한 자동차에 대한 불평과 같습니다. 사람들이 그것을 잘못 사용한다고 주장하는 것은 도구의 잘못이 아닙니다 ...
Idan Arye

4
그것은 일종의 도구 결함입니다. 힘내는 날카로운 가장자리를 많이 노출하지만 때로는 날카 로워지는 경우가 종종 있습니다. 모든 날카로운 비트가 SINGLE 하위 명령 ( "cvs admin"? 시간이 지났습니다 ...)에있는 CVS와 비교하면 "이것은 당신을 나쁘게 만들 수 있습니다. "필요한 경우가 아니라면 사용하십시오." 또는 다칠 수있는 기능을 생략하는 다른 버전 제어 시스템.
Stripes

4
git이 유효한 디자인 선택을하지 않았다는 것은 아닙니다 (하위 명령으로 그룹 관련 기능을 수행하고 git이 오른쪽에서 더 복잡한 것을 해결하도록 허용하는 것을 선호합니다). 그러나 그것들은 CHOICES이며, 하나는 다른 사람이 다칠 수 있기 때문에 많은 유용한 기능을 제거하기 위해 다른 VCS를 선택하는 것이 중요 할 수 있습니다.
Stripes

2

다른 음성을 추가하려면

예, 설명대로 작업하면 사용 rebase및 강제 푸시에 문제가 없습니다 . 중요한 점은 다음과 같습니다 . 팀에 계약이 있습니다.

rebase특별한 합의가없는 경우 에 관한 경고 및 친구에 대한 경고 입니다. 일반적으로 git은 예를 들어 빨리 감기를 허용하지 않기 때문에 자동으로 보호합니다. rebase강제 푸시를 사용하면 해당 안전성이 무시됩니다. 다른 것이 있으면 괜찮습니다.

팀에서는 히스토리가 지저분해질 경우 기능 지사를 리베이스하는 경우도 있습니다. 우리는 오래된 브랜치를 삭제하고 새로운 이름으로 새로운 브랜치를 만들거나 비공식적으로 조율합니다 (작은 팀이기 때문에 가능합니다.


git 프로젝트 자체도 비슷한 일을한다. "pu"( "제안 된 업데이트")라고하는 정기적으로 재 작성되는 통합 브랜치가있다. 이 브랜치는 정기적으로 재생성되며 새로운 작업을 기반으로하지 않아야합니다.


1

따라서 저는 인정합니다. 푸시 포스가 발생하자마자 오류가 발생할 위험이 있습니다. 사실입니다. 그러나 오류를 복구하는 방법은 여러 가지가 있으며 실제로 3 년 간의 개발 과정에서 많은 강제 푸시 오류를 보지 못했습니다.

Git 사용자가 변경 가능한 공유 히스토리를 피하는 이유는 이러한 문제를 자동으로 피하거나 복구하지 않기 때문입니다. 현재하고있는 일을 알아야하며, 엉망인 경우 모든 것을 수동으로 수정해야합니다. 정확히 한 사람이 강제 푸시를 수행 하도록 허용 하는 것은 직관적이지 않으며 Git의 분산 디자인과 상반됩니다. 그 사람이 휴가를 가면 어떻게 되나요? 다른 사람이 지점을 일시적으로 소유합니까? 원래 소유자가하고 있던 일을 모두 밟지 않을 것임을 어떻게 알 수 있습니까? 오픈 소스 세계에서, 지점 소유자가 공식적으로 떠나지 않고 점차 커뮤니티에서 멀어지면 어떻게됩니까? 지점 소유권을 다른 사람에게 전달하기 위해 많은 시간을 잃을 수 있습니다.

그러나 진짜 문제는 이것입니다 : 당신이 엉망이고 그것을 즉시 깨닫지 못하면, 충분한 시간이 경과 한 후에도 오래된 커밋은 결국 사라질 것 입니다. 이 시점에서 문제는 복구 할 수 없을 수 있습니다 (또는 백업 스토리의 모양에 따라 최소한 복구하기가 매우 어려울 수 있습니다. 복제본뿐만 아니라 Git 리포지토리의 오래된 사본을 백업합니까?).

이것을 Mercurial의 Changeset 진화 작업 과 대조하십시오 (이것은 아직 완성되지 않았거나 안정적이지 않습니다). 변경 세트가 공개로 표시되지 않은 경우 누구나 원하는대로 히스토리를 변경할 수 있습니다. 이러한 개정 및 재건은 지점 소유자가 필요하지 않은 완전 불이익으로 밀고 당길 수 있습니다. 데이터가 삭제되지 않습니다. 전체 로컬 저장소는 추가 전용입니다. 더 이상 필요하지 않은 변경 세트는 더 이상 사용되지 않는 것으로 표시되지만 무기한으로 유지됩니다. 마지막으로, 당신의 역사를 엉망으로 만들 때 (일상적인 워크 플로의 정상적인 부분으로 취급 됨) 자동으로 정리하는 멋진 명령이 있습니다. 이것은 사람들이 공유 기록을 수정하기 전에 기대하는 일종의 UX입니다.


나는이 "git 철학"에 동의하고 철학은 때때로 해킹 될 수 있다고 생각한다. :) 더 심각한 것은, 의견에서 언급했듯이, 지금 3 년 전, 특히 사실상 백업 백업 도구 역할을하는 코드 검토 도구로 gerrit을 사용하여 잠재적 인 극적인 손실을 방지했습니다. 이제 브랜치를 "제어"할 때 rebase가 정상이라고 생각합니다. 오픈 소스 프로젝트에서도 기능을 개발하고 풀 요청을 열면 해당 PR을 "소유"하고 지점을 리베이스 할 권리가 있다고 생각합니다. ... (1/2)
Joel

..., 그리고 어떤 사람들이 그 PR을 수정하고 싶다면 먼저 그들이 저에게 말해야한다고 생각합니다. 그것은 의사 소통의 문제입니다. (2/2)
Joel

추신 : Changeset evolution 링크에 감사드립니다. 흥미 롭습니다
Joel

사실, rebase는 "최근 마스터부터 모든 작업을 처음부터 다시 작성하여 이전 작업을 모두 삭제합시다"라고 말합니다. 그렇게해도 괜찮다면 리베이스도 괜찮습니다.
Joel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.