직접적이고 명확하게 요점을 알려 드리겠습니다.
우리의 문제는 장기간의 사이드 브랜치와 관련이 있습니다. 마스터와 분리 된 사이드 브랜치를 작업하는 몇 사람이 있고 몇 개월 동안 개발하고 마일스톤에 도달하면 두 가지를 동기화합니다.
일반적으로 몇 달 동안 지점을 동기화하지 않으려 고합니다.
기능 분기가 워크 플로우에 따라 무언가에서 분기되었습니다. 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
당신의 동료, 다른 세계 의 발명가처럼 매일 일하지 않습니까?
머지 커밋을 통해 사이드 브랜치를 마스터로 병합하는 것 외에 다른 옵션이 있습니까? 또는 병합 커밋을 지속적으로 사용하는 것이 내가 두려워하는 것만 큼 나쁘지 않은 이유가 있습니까?
다른 옵션은 없습니다. 나쁘지 않습니다.