푸시 포스 브랜치를 git하는 것이 잘못입니까?


11

기능 브랜치에서 작업 할 때 작업을 검토하고 메인 브랜치에서 통합하기 전에 대화 형 리베이스사용하여 브랜치의 커밋정리 하려고합니다 .

기능을 개발하는 동안 중간 작업을 원격 저장소에 백업 수단으로 푸시하고 싶습니다. 즉, 하드 드라이브 충돌시 전체 기능 분기가 손실되는 것을 원하지 않습니다.

그러나 이것은 종종 git push --forcerebase 후에 원격 저장소에 대해 수행해야한다는 사실로 이어 집니다. 일반적으로 눈살을 찌푸리는 동작입니다. 또는 연결된 github 페이지에서 다음과 같이 말합니다.

커밋 기록을 변경하면 리포지토리를 사용하는 다른 모든 사람이 일을 어렵게 만들 수 있으므로 이미 리포지토리로 푸시했을 때 커밋을 리베이스하는 것은 나쁜 습관으로 간주됩니다.

이 충돌을 해결하는 (일반적으로 수용되는) 정책이 있습니까?

왜 이것이 복제본이 아닌지 git "Golden Rule of Rebasing"이 꼭 필요한가?

정책이에 원하는 사이의 갈등을 해결하기위한 제 질문은 여기에 요청 원격 저장소에 백업 작업을 하고 작업을 리베이스 다른 질문이 충돌하고 어떤 사람들은 갈등이 전혀 존재 생각하는 이유를 묻는 것을 부정하려고하는 동안, 따라서 왜 강제력을 강요하지 않는지 "필수적"인지 묻습니다.



1
@gbjbaanb WIP 커밋을 수행하는 경우 리베이스는 하루 동안 많은 커밋이 발생하지 않도록 매우 유용합니다. 나는 종종 작은 변화를 저지르기 위해 필요한 경우 "기억 상태에 대한 취소"옵션을 갖습니다.이 중 대부분은 레포의 주요 역사와 관련이 없거나 소음입니다 (그래서 rebase가 매우 유용한 이유입니다).
enderland

1
@gbjbaanb 그것은 내가 생각하는 의견의 문제입니다. 많은 팀들이 역사를 깨끗하게 유지하기 위해 리베이스 전략을 사용합니다.
Chiel ten Brinke

1
@enderland 모든 사람들은 아름다운 역사를 원합니다. 링크에서 볼 수 있듯이 여전히 잘못된 (그리고 위험한) 일입니다. 토발즈는 그것을 넣지 말아야했고, 커밋이 디스플레이에 "압축"되도록 허용 했어야했다.
gbjbaanb

1
@gbjbaanb 그러나 ... 그는하지 않았으므로 우리는 우리가 가진 것과 함께 일해야합니다. 나에게 각 기능 분기에서 30 개 이상의 개별 및 증분 커밋 대신 마스터 분기에 단일 커밋을 갖는 것이 훨씬 더 유용합니다. 그러나 모든 사람들은 다른 워크 플로우를 갖게 될 것입니다.
enderland

답변:


5

자신에게 물어볼 핵심 질문 :

  • 마스터로 다시 병합 한 후 원격 지점을 유지합니까?

마스터로 병합 한 후 원격 기능 분기를 삭제하면 이미 히스토리가 손실됩니다. 병합 / PR을 만들기 전에 지점을 스쿼시 / 리베이스한다고 가정하면이 기록을 잃게됩니다. 이 경우 모든 푸시 푸시는 github을 백업으로 사용할 수있게합니다.

히스토리를 유지하고 강제 푸시하지 않으려는 상황은 원격 지점이 병합 된 후 지속 되고 일시적으로 만 존재하는 경우입니다.

비 기반 지점을 유지할 것인지 묻는다고 가정하십니까? 아니요, AFAIC. 그럼에도 불구하고 강제로 푸시하면 이론적으로 동일한 지점으로 푸시 한 다른 사용자의 커밋이 손실 될 수 있습니다

여러 사람이 동시에 해당 지점으로 밀고있는 것 같습니다. 당신이 의미 할 수는 분기에 역사에 대해 관심.

중간 작업에 대신 할 수있는 일은 해당 지점의 포크를 만드는 것입니다. 이를 병합 한 다음 병합하기 전에 모든 커밋을 단일 커밋으로 리베이스 할 수 있습니다. 따라서 커밋을 기능 브랜치에 병합 할 때는 커밋이 하나만 있습니다 (전체 브랜치의 리베이스 히스토리 포함).


"마스터로 다시 병합 한 후 원격 지점을 유지합니까?" 비 기반 지점을 유지할 것인지 묻는다고 가정하십니까? 아니요, AFAIC. 그럼에도 불구하고 강제로 푸시하면 이론적으로 동일한 지점으로 푸시 한 다른 사용자의 커밋이 손실 될 수 있습니다.
Chiel ten Brinke

@ChieltenBrinke 나는 그것에 대해 약간 편집했습니다. 참고
엔더 랜드

나는 푸시 강제시 커밋을 파괴하는 것을 막기위한 조치로서 실제로 포크는 매우 좋은 제안이라고 생각합니다. 그러나 AFAIK는 실제로 git 개념이 아니며 github와 같이 쉽게 수행하려면 서비스 래퍼가 필요합니다. 내가 맞습니까? 아니면 분리 분기를 만들기 위해 "포킹"이라는 용어를 잘못 사용했을까요?
Chiel ten Brinke

@ChieltenBrinke 당신은 다양한 방법으로 같은 일을 달성 할 수 있습니다. 기능 분기가 원격 저장소에있는 경우 저장소를 분기하고 해당 분기의 버전을 가질 수 있습니다. 그런 다음 커밋을 스쿼시 한 ​​후 해당 지점을 원격 지점으로 병합하십시오. 또는 다른 로컬 분기 (아마도 featurebranch-local)를 만든 다음 원하는 수의 커밋을 사용하여 해당 분기에서 적극적인 개발자를 수행 할 수 있습니다. 병합하려는 경우 해당 커밋을 스쿼시 한 ​​다음 기능에 병합하십시오. 기본적으로 실제 임시 지점에서 dev를 수행 한 다음 기능에 스쿼시 / 병합하십시오.
enderland

github을 사용하지 않기 때문에 repo를 포크하는 것이 옵션이 아니라고 가정하면 "private" develop-feature브랜치를 사용합니다. 물론 사생활은 순전히 협약에 의한 것이며 어떤 것에 의해서도 시행되지는 않지만, 특히 특정 지명 명명 규칙이 도입 된 경우 정책의 일부가 될 수 있습니다. (아마도 나는 지금 너무 불안해하고 어쩌면 그렇지 않을 수도 있습니다 :) --force-with-lease내 다른 게시물에서 지적했듯이 와의 조합은 상처를 입을 수는 없지만 의존해서는 안됩니다.
Chiel ten Brinke

3

나는 여기 내 마음을 넘어서 몇 가지 가능성을 나열하고 있습니다.

항상 새로운 지점에 리베이스

지저분한 브랜치가 있으면 some-feature새 브랜치에서 리베이스하십시오. 예 :

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

그런 다음 some-feature-rebase검토하고 통합했습니다.

문제 : 여기서 큰 단점은 엄밀히 말하면 모든 리베이스마다 새로운 지점이 필요하다는 것입니다. 예를 들어 코드 검토 후 변경하면 여러 개의 리베이스가있을 수 있습니다.

사용하다 git push --force-with-lease

난 그냥 대해 알게 git push --force-with-lease대안git push --force , 어떤

예상 상태가 아닌 경우 지점 업데이트를 거부합니다. 즉, 아무도 업스트림 분기를 업데이트하지 않았습니다.

문제 : 이것은 우리가 그냥 사용하는 상황에서 직접 개선되는 것처럼 보이지만 --force, 가장 주목할만한 것은, git fetch대신에 대신에 할 때 git pull로컬 업스트림 분기를 업데이트 --force-with-lease하여 원격에서 병합되지 않은 변경 사항이 발생하지 않았다고 생각하는 속임수입니다. 분기.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.