내 사무실은 무한 브랜치 병합을 정책으로 원합니다. 다른 옵션이 있습니까?


119

사무실에서 지점 분할 및 병합을 처리하는 방법을 파악하려고 노력하고 있으며 큰 문제가 발생했습니다.

우리의 문제는 장기간의 사이드 브랜치와 관련이 있습니다. 마스터와 분리 된 사이드 브랜치를 작업하는 몇 사람이 있고 몇 개월 동안 개발하고 마일스톤에 도달하면 두 가지를 동기화합니다.

이제 이것을 처리하는 자연스러운 방법 인 IMHO는 사이드 브랜치를 단일 커밋으로 스쿼시합니다. master앞으로 계속 진행합니다. 우리는 몇 개월의 병행 개발을 소급하여 master역사에 쏟아 붓지 않았습니다 . 그리고 사이드 브랜치의 역사에 대해 더 나은 해상도가 필요한 사람은 물론, 여전히 모든 것이 존재 master합니다.

문제가 있습니다 : 나는 커맨드 라인으로 독점적으로 작업하지만 나머지 팀은 GUIS를 사용합니다. 그리고 GUIS에 다른 지점의 기록 을 표시 하는 합리적인 옵션이 없다는 것을 알았습니다 . 그래서 당신은 스쿼시는 "이 개발 지점에서 숙청 말, 커밋에 도달하면 XYZ"그것은이다 거대한 에 무엇이 있는지 갈 고통 XYZ.

당신이 경우 : SourceTree에서 지금까지의 내가 찾을 수있어, 그것은 큰 두통이다 master, 당신은에서 역사를보고 싶어 master+devFeature당신이 중 하나가 확인해야, master+devFeature다른 (다르다마다 하나의 파일을 터치), 추가 또는 삭제 올바른 위치를 찾을 때까지 저장소의 모든 분기를 병렬로 표시하는 로그를 스크롤 하십시오. 그리고 당신이 어디에 있는지 알아내는 행운을 빕니다.

제 팀원들은 개발 히스토리에 접근하기 어려운 것을 원하지 않습니다. 그래서 그들은이 크고 긴 개발 사이드 브랜치가 항상 병합 커밋으로 병합되기를 원합니다. 그들은 마스터 브랜치에서 즉시 액세스 할 수없는 기록을 원하지 않습니다.

나는 그 생각이 싫다 ; 그것은 병렬 개발 역사의 끝이없고, 불가분의 엉킴을 의미합니다. 그러나 나는 우리가 어떤 대안을 가지고 있는지 알지 못한다. 그리고 나는 꽤 당황했습니다. 이것은 좋은 지점 관리에 대해 내가 아는 대부분의 것을 차단하는 것처럼 보이며 해결책을 찾을 수 없다면 끊임없이 좌절 할 것입니다.

머지 커밋을 통해 사이드 브랜치를 마스터로 병합하는 것 외에 다른 옵션이 있습니까? 또는 병합 커밋을 지속적으로 사용하는 것이 내가 두려워하는 것만 큼 나쁘지 않은 이유가 있습니까?


84
병합을 병합으로 기록하는 것이 실제로 그렇게 나쁩니 까? 선형 이력으로 스쿼시하는 것이 장점이 있다는 것을 알 수 있지만 그렇게하지 않으면 "좋은 지점 관리에 대해 알고있는 대부분의 것"에 반하는 것이 놀랍습니다. 당신이 두려워하는 문제는 정확히 무엇입니까?
IMSoP

65
어디 OK,하지만 내 마음에 장기 실행 지점은 정확히 몇 가지 가시성을 원하는이 비난과 양분 그냥 "변화는 2016의 큰 재 작성의 일환으로 도입 된"에 착륙하지 않도록. 나는 대답으로 게시 할만 큼 확신이 없지만, 본능은 기능 분기 내 에서 작업을 끝내야한다는 것입니다. 따라서 주요 역사에서 프로젝트에 대한 짧은 역사를 가질 필요가 없습니다. 고아 지점을 확인하십시오.
IMSoP

5
즉, "팀원보다 git을 더 높은 수준으로 사용하려고 노력하고 있습니다. 어떻게 저를 엉망으로 만들지 않습니까?" 어느 정도 공평하게, 나는 정직하게 git log master+bugfixDec10th중단 점을 기대하지 않았다 :-/
Standback

26
"장기 사이드 브랜치-몇 명의 직원이 마스터에서 분리 된 사이드 브랜치를 작업하게함으로써 몇 개월 동안 개발하며, 이정표에 도달하면 두 가지를 동기화합니다." 마스터에서 사이드 브랜치로 주기적으로 당기지 않습니까? 모든 (몇 가지) 커밋을 마스터하는 것은 많은 경우 인생을 더 단순하게 만드는 경향이 있습니다.
TafT

4
merge --no-ff당신이 원하는? 에 master자체 하나는 그 지점에서 변경 사항을 설명 커밋이 있지만 커밋의 모든 여전히 존재하고 HEAD에 부모가된다.
CAD97

답변:


244

커맨드 라인에서 Git을 사용하더라도 동료들과 동의해야합니다. 큰 변경 사항을 단일 커밋으로 스쿼시하는 것은 합리적이지 않습니다. 눈에 띄지 않게 만드는 것이 아니라 역사를 잃어 가고 있습니다.

소스 제어의 요점은 모든 변경 내역을 추적하는 것입니다. 왜 무엇이 바뀌 었습니까? 이를 위해 모든 커밋에는 부모 커밋, diff 및 커밋 메시지와 같은 메타 데이터에 대한 포인터가 포함됩니다. 각 커밋은 소스 코드의 상태와 해당 상태로 이어진 모든 변경 사항의 전체 기록을 설명합니다. 가비지 수집기는 도달 할 수없는 커밋을 삭제할 수 있습니다.

rebasing, cherry-picking 또는 squashing과 같은 작업은 기록을 삭제하거나 다시 씁니다. 특히 결과 커밋은 더 이상 원래 커밋을 참조하지 않습니다. 이걸 고려하세요:

  • 일부 커밋을 스쿼시하고 커밋 메시지에서 스쿼시 된 히스토리가 원래 커밋 abcd123에서 사용 가능하다는 것을 알 수 있습니다.
  • abcd123을 포함하는 모든 분기 또는 태그는 병합 된 후 [1] 삭제 합니다.
  • 가비지 수집기가 실행되도록합니다.

[1] : 일부 Git 서버는 브랜치가 실수로 삭제되는 것을 방지 할 수 있지만 모든 기능 브랜치를 영원히 유지하고 싶지는 않습니다.

이제 더 이상 해당 커밋을 찾을 수 없습니다. 커밋은 존재하지 않습니다.

커밋 메시지에서 분기 이름을 참조하는 것은 분기 이름이 리포지토리에 로컬이기 때문에 훨씬 더 나쁩니다. 무엇 master+devFeature해당 지역의 체크 아웃에하는 수 있습니다 doodlediduh내에서. 브랜치는 커밋 객체를 가리키는 이동 레이블입니다.

모든 히스토리 재 작성 기술 중에서 리베이스는 전체 커밋을 모든 히스토리와 복제하고 상위 커밋을 대체하기 때문에 가장 양성입니다.

즉, master그 현실을 나타 내기 때문에 역사, 그것은 좋은 일에 병합 된 모든 지점의 전체 역사를 포함하고 있습니다. [2] 병렬 개발이있는 경우 로그에 표시되어야합니다.

[2] : 이런 이유로, 나는 리베 이싱으로 인해 선형화되었지만 궁극적으로 가짜 히스토리보다 명시적인 병합 커밋을 선호합니다.

명령 행 git log에서 표시된 히스토리를 단순화하고 표시된 모든 커밋을 관련성있게 유지 하려고합니다 . 당신은 당신의 요구에 맞게 역사 단순화를 조정할 수 있습니다. 커밋 그래프를 표시하는 자체 git log 도구를 작성하려고 할 수도 있지만 일반적으로 "이 커밋이 원래 또는이 브랜치에서 커밋 되었습니까?"라고 대답하는 것은 불가능합니다. 병합 커밋의 첫 번째 부모는 이전 커밋입니다. HEAD즉 병합하려는 브랜치의 커밋입니다. 그러나 마스터에서 기능 분기로 역 병합을 수행 한 다음 빨리 전달 된 마스터를 병합으로 수행하지 않았다고 가정합니다.

내가 만난 장기 지점에 대한 가장 좋은 해결책은 몇 개월 후에 만 ​​병합되는 지점을 방지하는 것입니다. 변경 사항이 최근에 작은 경우 병합이 가장 쉽습니다. 이상적으로는 일주일에 한 번 이상 병합해야합니다. 지속적인 통합 (“Jenkins 서버 설정”이 아닌 Extreme 프로그래밍에서와 같이)은 매일 여러 개의 병합을 제안합니다. 즉, 별도의 기능 분기를 유지하지 않고 팀으로 개발 분기를 공유합니다. 기능이 QA되기 전에 병합하려면 기능이 기능 플래그 뒤에 숨겨져 있어야합니다.

그 결과, 빈번한 통합을 통해 잠재적 인 문제를 훨씬 일찍 발견 할 수 있으며 일관된 아키텍처를 유지할 수 있습니다. 이러한 변경 사항은 모든 지점에 신속하게 포함되므로 변경 사항에 도달 할 수 있습니다. 변경으로 인해 일부 코드가 손상되면 몇 달이 아니라 며칠 만 작동합니다.

역사 재 작성은 수백만 줄의 코드와 수백 또는 수천 명의 활동중인 개발자가있을 때 정말 거대한 프로젝트에 적합합니다. 왜 그런 큰 프로젝트가 별도의 라이브러리로 나뉘어지지 않고 단일 git repo 여야하는지 의문의 여지가 있지만, 그 규모에서 중앙 저장소에 개별 컴포넌트의 "릴리스"만 포함되어 있으면 더 편리합니다. 예를 들어 Linux 커널은 스쿼시를 사용하여 주요 기록을 관리 할 수 ​​있습니다. 일부 오픈 소스 프로젝트에는 git 레벨 병합 대신 이메일을 통해 패치를 보내야합니다.


43
@Standback 개발자가 로컬에서 수행하는 작업에 신경 쓰지 않습니다.“wip”커밋, 각 고정 오타에 대한 추가 커밋 사용… 괜찮습니다, 너무 자주 저지르는 것이 좋습니다. 이상적으로 개발자는 오타를 수정하는 모든 커밋을 결합하는 것과 같이 푸시되기 전에 커밋을 정리합니다. 실제 기능 및 관련 테스트에 대한 커밋과 관련없는 오타에 대한 커밋과 같이 서로 다른 작업을 수행하는 경우 커밋을 별도로 유지하는 것이 좋습니다. 그러나 커밋이 푸시되면 적어도 내 경험으로는 기록을 다시 쓰거나 삭제하는 것이 가치보다 더 문제가됩니다.
amon

11
"일반적으로"이 커밋이이 커밋 또는 그 브랜치에 커밋 되었습니까? "라고 대답하는 것은 불가능합니다." 저는 버전 관리 시스템에 "날짜 y의 x 지점에 있었던 내용"을 묻고 싶습니다.
Peter Green

80
를 사용하여 코드에서 버그의 원인을 식별하려고 시도하는 git bisect것이 사이드 브랜치에서 10,000 라인 우버 커밋에 도달 하는 것보다 더 실망스러운 것은 없습니다 .
tpg2114

2
@Standback IMHO 커밋이 작을수록 읽기 쉽고 친숙합니다. 처음부터 살펴보면 몇 개 이상의 포인트를 다루는 커밋이 불가능하므로 설명을 액면가로 가져 가면됩니다. 커밋 (코드) 자체가 아니라 설명 (예 : "구현 된 기능 X")의 가독성입니다. 차라리 거라고 1000 분의 1 문자 "HTTPS로 변경 HTTP"와 같은 커밋 :)
Agent_L

2
cherry-pick은 기록을 다시 쓰거나 삭제하지 않습니다. 기존 커밋의 변경 사항을 복제하는 새로운 커밋을 만듭니다
Sarge Borsch

111

나는 Amon의 대답이 마음 에 들지만 작은 부분에는 훨씬 더 많은 강조가 필요하다고 느꼈습니다. 필요 에 맞게 로그를 보면서 기록을 쉽게 단순화 할 수 있지만, 필요에 맞게 로그를 보면서 기록을 추가 할 수는 없습니다. 그렇기 때문에 기록을 유지하는 것이 바람직합니다.

다음은 리포지토리 중 하나의 예입니다. 풀 요청 모델을 사용하므로 모든 기능은 일반적으로 일주일 이하로 실행되지만 역사상 오래 실행되는 분기처럼 보입니다. 개별 개발자는 때때로 병합하기 전에 자신의 역사를 스쿼시하기로 선택하지만, 우리는 종종 기능을 결합하기 때문에 비교적 드문 일입니다. 다음 gitk은 git과 함께 제공되는 gui의 몇 가지 커밋입니다 .

표준 gitk 뷰

예, 약간 엉킴이지만, 우리는 누가 언제 어떤 변화가 있었는지 정확하게 볼 수 있기 때문에 좋아합니다. 개발 이력을 정확하게 반영합니다. 한 번에 하나의 풀 요청 병합을 상위 레벨보기로 보려면 다음보기를 볼 수 있습니다. 이는 git log --first-parent명령과 같습니다.

--first-parent가있는 gitk 뷰

git log원하는 뷰를 정확하게 제공하도록 설계된 더 많은 옵션이 있습니다. 그래픽 뷰를 빌드하기 위해 gitk임의의 git log인수를 취할 수 있습니다 . 다른 GUI에도 비슷한 기능이 있다고 확신합니다. git log병합시 모든 사람에 대해 원하는 보기를 적용하는 대신 문서를 읽고 올바르게 사용하는 방법을 배우십시오 .


24
이 옵션에 익숙하지 않았습니다! 이것은 나에게 큰 도움이되며 더 많은 로그 옵션을 배우면 더 쉽게 살 수있는 것처럼 들립니다.
Standback

25
+1 "필요에 따라 로그를 보면서 기록을 쉽게 단순화 할 수 있지만 필요에 따라 로그를 보면서 기록을 추가 할 수는 없습니다." 기록을 다시 쓰는 것은 항상 의문의 여지가 있습니다. 커밋 할 때 기록하는 것이 중요하다고 생각되면 중요했습니다. 당신이 잘못을 발견했거나 나중에 다시 역사를 썼을지라도. 이 실수는 나중에 다시 쓰지 않아도 남았다는 비난을 볼 때만 일부 실수는 의미가 있습니다. 서사시의 나머지 부분과 함께 실수가 접 히면 왜 상황이 어땠는지 검토 할 수 없습니다.
TafT

@Standback Related, 저를 위해이 구조를 유지하는 데 도움이되는 것 중 하나는 사용 merge --no-ff하는 것입니다. 빨리 감기 병합을 사용하지 말고 항상 병합 커밋을 만들어서 --first-parent작동하도록하십시오.
Izkata

34

우리의 문제는 장기간의 사이드 브랜치와 관련이 있습니다. 마스터와 분리 된 사이드 브랜치를 작업하는 몇 사람이 있고 몇 개월 동안 개발하고 마일스톤에 도달하면 두 가지를 동기화합니다.

내 첫 번째 생각은-절대적으로 필요한 경우가 아니라면 이것을하지 마십시오. 당신의 병합은 때때로 도전해야합니다. 지점을 독립적이고 최대한 오래 유지하십시오. 스토리를 더 작은 구현 청크로 나누어야한다는 신호입니다.

이 작업을 수행해야하는 경우 --no-ff 옵션을 사용하여 git를 병합하여 히스토리를 자체 분기에서 고유하게 유지할 수 있습니다. 커밋은 여전히 ​​병합 된 히스토리에 나타나지만 기능 브랜치에서 개별적으로 볼 수 있으므로 적어도 그들이 어떤 개발 라인에 포함되어 있는지 결정할 수 있습니다.

처음으로 git을 사용하기 시작했을 때 분기 커밋이 병합 후 기본 분기와 동일한 히스토리에 나타나는 것이 조금 이상하다는 것을 인정했습니다. 그것은 그 커밋이 그 역사에 속한 것처럼 보이지 않기 때문에 조금 당황했습니다. 그러나 실제로 통합 브랜치가 그렇게 생각한다면 전혀 고통스럽지 않습니다. 그 목적 은 기능 브랜치를 결합하는 입니다. 우리 팀에서는 스쿼시하지 않고 자주 병합 커밋을 수행합니다. 우리는 항상 --no-ff를 사용하여 조사하고자하는 모든 기능의 정확한 기록을 쉽게 볼 수 있도록합니다.


3
나는 완전히 동의하고 있습니다. 모두는 주인에게 가까이 붙어 싶어합니다. 하지만 내 자신의 겸손 영향 - P에서 훨씬 더 큰 훨씬 적은 다른 문제입니다
Standback

2
+1git merge --no-ff
0xcaff

1
의 +1도 있습니다 git merge --no-ff. gitflow를 사용하면 이것이 기본값이됩니다.
David Hammen

10

직접적이고 명확하게 요점을 알려 드리겠습니다.

우리의 문제는 장기간의 사이드 브랜치와 관련이 있습니다. 마스터와 분리 된 사이드 브랜치를 작업하는 몇 사람이 있고 몇 개월 동안 개발하고 마일스톤에 도달하면 두 가지를 동기화합니다.

일반적으로 몇 달 동안 지점을 동기화하지 않으려 고합니다.

기능 분기가 워크 플로우에 따라 무언가에서 분기되었습니다. master간단하게하기 위해 호출 해 봅시다 . 이제, 당신이 마스터 할 것을 약속 할 때마다 할 수 있고해야합니다 git checkout long_running_feature ; git rebase master. 이것은 디자인에 따라 브랜치가 항상 동기화되어 있음을 의미합니다.

git rebase또한 여기에 올바른 일입니다. 그것은 해킹이나 이상하거나 위험한 것이 아니라 완전히 자연 스럽습니다. 기능 분기의 "생일"인 1 비트의 정보가 손실되지만 그게 전부입니다. 누군가가 그것이 중요하다는 것을 알게되면, 그것을 다른 곳에 (티켓 시스템에서 또는 필요가 큰 경우 git tag...) 저장하여 제공 할 수 있습니다 .

이제 이것을 처리하는 자연스러운 방법 인 IMHO는 사이드 브랜치를 단일 커밋으로 스쿼시합니다.

아니, 당신은 절대로 원하지 않고 병합 커밋을 원합니다. 병합 커밋도 "단일 커밋"입니다. 어떻게 든 모든 개별 분기 커밋을 "into"마스터에 삽입하지는 않습니다. master병합시 헤드와 브랜치 헤드 의 두 부모가있는 단일 커밋입니다 .

--no-ff물론 옵션 을 지정해야합니다 . --no-ff시나리오에서 병합하지 않는 것은 엄격히 금지되어 있습니다. 불행히도, --no-ff기본값이 아닙니다. 하지만 당신이 설정할 수있는 옵션이 있다고 생각합니다. 참조 git help merge무엇을 --no-ff합니까 (짧은 : 그것은 내가 이전 단락에 설명 된 동작을 활성화), 그것은 매우 중요합니다.

우리는 몇 달 동안의 병행 개발을 소급하여 역사에 쏟아 붓지 않았습니다.

절대로 그렇지 않습니다-특히 병합 커밋이 아닌 일부 브랜치의 "이력에"무언가를 버리지 않습니다.

사이드 브랜치의 역사에 대해 더 나은 해상도가 필요한 사람은 물론 여전히 존재합니다. 마스터가 아닌 사이드 브랜치에 있습니다.

병합 커밋을 사용하면 여전히 존재합니다. 마스터가 아닌 사이드 브랜치에서 병합 커밋의 부모 중 하나로서 명확하게 표시되고, 그대로 유지됩니다.

내가 한 일을 참조하십시오? 당신이 당신의 스쿼시에 대한 설명 모든 일들이 커밋되어 바로 병합와 --no-ff커밋합니다.

문제가 있습니다 : 나는 커맨드 라인으로 독점적으로 작업하지만 나머지 팀은 GUIS를 사용합니다.

(측면 비고 : 나는 거의 독점적으로 커맨드 라인으로 작업합니다. (거의 거짓말입니다. 보통 emacs magit을 사용하지만, 다른 이야기입니다.) 개별 emacs 설정으로 편리한 곳에 있지 않으면 명령을 선호합니다. 하지만 자신에게 호의를 표하고 적어도 git gui한 번은 시도해보십시오 . 추가 / 취소를 위해 라인, 덩크 등을 선택하는 것이 훨씬 효율적입니다.

그리고 GUIS에 다른 지점의 기록을 표시하는 합리적인 옵션이 없다는 것을 알았습니다.

당신이하려는 것은 전적으로의 정신에 위배되기 때문입니다 git. git"지시 된 비순환 그래프"에서 핵심을 기반으로합니다. 이는 많은 정보가 커밋의 부모-자식 관계에 있음을 의미합니다. 그리고 병합의 경우 이는 두 부모와 한 자녀와의 진정한 병합 커밋을 의미합니다. no-ff병합 커밋 을 사용하자마자 동료의 GUI가 정상적으로 작동 합니다.

따라서 "이 개발이 XYZ 지점에서 스쿼시되었다"고 스쿼시 커밋에 도달하면 XYZ의 내용을 보는 것이 큰 고통입니다.

예, 그러나 이것은 GUI의 문제가 아니라 스쿼시 커밋의 문제입니다. 스쿼시를 사용하면 기능 분기 헤드가 매달려 있고 완전히 새로운 커밋이 생성됩니다 master. 이로 인해 구조가 두 수준으로 분리되어 큰 혼란이 발생합니다.

그래서 그들은이 크고 긴 개발 사이드 브랜치가 항상 병합 커밋으로 병합되기를 원합니다.

그리고 그들은 절대적으로 맞습니다. 하지만 그들은 "병합되지 않습니다 "그들은 단지 병합됩니다. 병합은 진정으로 균형 잡힌 것입니다. 다른쪽으로 병합되는 선호되는 측면이 없습니다 ( 분기가 바뀌는 git checkout A ; git merge B것과 같은 git checkout B ; git merge A작은 시각적 차이 를 제외하고 는 정확히 동일합니다 git log).

그들은 마스터 브랜치에서 즉시 액세스 할 수없는 기록을 원하지 않습니다.

완전히 맞습니다. 병합되지 않은 기능이없는 시점에는 처음부터 커밋으로 master돌아가서 모든 기능 커밋 라인을 캡슐화하는 풍부한 히스토리 가있는 단일 브랜치 가 git init있습니다 (특히 " 커밋 그래프는 꽤 분 기적이지만 그 시점의 히스토리는 더 이상 "분기"가 아니기 때문에 해당 단락의 후반부에 분기 "가 표시됩니다.

나는 그 생각이 싫다;

그런 다음 사용하는 도구를 상대로 작업하기 때문에 약간의 고통이 있습니다. 이 git접근 방식은 특히 분기 / 병합 영역에서 매우 우아하고 강력합니다. 올바르게 (특히 위에서 언급 한 바와 같이 --no-ff) 그렇게하면 다른 접근법 (예 : 분기에 대한 병렬 디렉토리 구조를 갖는 서브 버전 엉망)보다 뛰어납니다.

그것은 병렬 개발 역사의 끝이없고, 불가분의 엉킴을 의미합니다.

끝없는 병렬-예.

불가침, 엉킴-아니오.

그러나 나는 우리가 어떤 대안을 가지고 있는지 알지 못한다.

git당신의 동료, 다른 세계 의 발명가처럼 매일 일하지 않습니까?

머지 커밋을 통해 사이드 브랜치를 마스터로 병합하는 것 외에 다른 옵션이 있습니까? 또는 병합 커밋을 지속적으로 사용하는 것이 내가 두려워하는 것만 큼 나쁘지 않은 이유가 있습니까?

다른 옵션은 없습니다. 나쁘지 않습니다.


10

장기 사이드 브랜치를 제거하면 많은 정보를 잃게됩니다.

내가 할 일은 사이드 브랜치를 master에 병합하기 전에 마스터를 장기 사이드 브랜치로 리베이스하는 것 입니다. 이렇게하면 커밋 기록을 선형적이고 이해하기 쉽게 만드는 동안 모든 커밋을 마스터로 유지합니다.

각 커밋에서 쉽게 그렇게 할 수 없다면 개발 컨텍스트를 명확하게 유지하기 위해 비선형 으로 만들 것입니다. 제 생각에는, 마스터를 사이드 브랜치로 리베이스하는 동안 문제가있는 병합을하는 경우 비선형 성이 실제로 중요하다는 것을 의미합니다. 그것은 내가 역사를 파헤쳐 야 할 때 무슨 일이 있었는지 이해하는 것이 더 쉬울 것이라는 것을 의미합니다. 또한 리베이스를하지 않아도되는 즉각적인 이점을 얻습니다.


: +를 언급했습니다 rebase. 그것이 최선의 접근법인지 여부에 관계없이 (나는 개인적으로 많이 사용하지는 않았지만 개인적으로 큰 경험을하지 못했습니다), OP가 실제로 원하는 것, 특히, 고장난 이력 덤프와 이력을 완전히 숨기는 것 사이의 타협.
Kyle Strand

1

개인적으로 포크로 개발 한 다음 기본 리포지토리로 병합 요청을 가져옵니다.

즉, 변경 사항을 마스터 상단에 리베이스하거나 일부 WIP 커밋을 스쿼시하려는 경우 완전히 수행 할 수 있습니다. 또는 나는 내 전체 역사가 합쳐 지도록 요청할 수 있습니다.

내가하고 싶은 일은 지점에서 개발을하지만 마스터 / 개발자에 대해 종종 rebase하는 것입니다. 내가 병합의 무리를하지 않고 마스터에서 가장 최근의 변화를 얻을 그런 식으로 커밋 지점, 또는 마스터로 병합하는 시간 병합 충돌의 전체 부하를 처리하는 데.

질문에 명시 적으로 대답하려면 :

머지 커밋을 통해 사이드 브랜치를 마스터로 병합하는 것 외에 다른 옵션이 있습니까?

예-지점 당 한 번 (기능 또는 수정이 "완료"된 경우) 병합하거나 내역에 병합 커밋을 원하지 않는 경우 최종 리베이스를 수행 한 후 마스터에서 빨리 감기 병합을 수행 할 수 있습니다.


3
죄송합니다-같은 일을하는데 이것이 어떻게 질문에 대답하는지
모르겠습니다

2
명시된 질문에 대한 명확한 답변을 추가했습니다.
Wayne Werner

그래서 그것은 저의 커밋에 좋습니다. 그러나 나는 (그리고 나의 팀) 모두의 작업을 다룰 것입니다. 내 역사를 깨끗하게 유지하는 것은 쉽다. 지저분한 개발자 역사에서 일하는 것이 여기서 문제입니다.
Standback

당신은 다른 개발자들에게 무엇을 요구하고 싶다는 뜻입니까? 리베이스하지 않고 병합에 스쿼시하지 않습니까? 아니면 동료에게 git discipline이 없다는 것을 이해하기 위해이 질문을 게시 했습니까?
Wayne Werner

1
여러 개발자가 해당 기능 분기에서 작업중인 경우 정기적으로 리베이스를 수행하는 것은 유용하지 않습니다.
Paŭlo Ebermann

-1

개정 관리는 가비지 쓰레기입니다.

문제는 기능 브랜치의 진행중인 작업에 많은 "이것을 시도해 보자 ... 작동하지 않았다, 그것을 대체하자"와 마지막 "그것"을 제외한 모든 커밋이 끝날 수 있다는 것입니다 쓸데없이 역사를 오염시키는 것.

궁극적으로 이력은 유지해야하지만 (일부는 나중에 사용할 수도 있지만) "깨끗한 복사본"만 병합해야합니다.

Git을 사용하면 기능 분기를 먼저 분기하고 (모든 기록을 유지하기 위해) 마스터에서 기능 분기의 분기를 (대화식으로) 리베이스 한 다음 재 기반 분기를 병합하여 수행 할 수 있습니다.


1
분명히 말하면 : 당신이 말하고있는 것은 기능 브랜치 (사본의 사본)에 대한 기록을 다시 작성하는 것이므로 짧고 깔끔한 기록을 얻음으로써 초기 개발의 모든 것을 제거 할 수 있습니다. 그리고 다시 작성된 브랜치를 마스터로 병합하는 것이 더 간단하고 깨끗합니다. 내가 당신을 올바르게 이해 했습니까?
Standback

1
예. 그리고 당신이 마스터로 합병 할 때 그것은 빨리 감기 될 것입니다 (병합하기 전에 최근에 당신을 기반으로한다고 가정).
DepressedDaniel

그러나이 역사는 어떻게 유지됩니까? 오리지널 피처 브랜치를 눕 히게 하시겠습니까?
Paŭlo Ebermann

@ PaŭloEbermann Bingo.
DepressedDaniel

글쎄, 다른 사람이 의견에서 말했듯이 : 분기는의 기록 그래프에 대한 포인터 일 뿐이며 git로컬입니다. foo하나의 리포지토리 bar에서 명명 된 것은 다른 리포지토리에서 명명 될 수 있습니다 . 그리고 그것들은 일시적입니다. 당신은 역사를 잃어 버리지 않기 위해 살아남 아야하는 수천 개의 기능 브랜치로 당신의 레포를 어지럽히고 싶지 않습니다. 히스토리를 참조로 유지하려면 해당 브랜치를 유지해야합니다. git결국 브랜치에서 도달 할 수없는 커밋은 더 이상 삭제됩니다.
cmaster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.