2017-10-01 5 views
0

일련의 기능 브랜치를 생성하고, 완료되면 git merge --no-ff과 함께 마스터에 병합한다. 이렇게하면 이전 피쳐 브랜치의 시작점과 끝점을 식별하는 데 유용한 빈 병합 커밋이 만들어집니다.더 빨리`git rebase --preserve-merges`를 해보자.

여러 개의 동시 분기 또는 중첩 분기를 처리하기 위해 rebase를 사용합니다. 나는 결코 다시 병합하지 않는다. 나는 언제나 가장 최근의 커밋에 내 브랜치를 리베이스하고, 테스트를 마친 다음 마침내 과 병합한다. 중첩 된 브랜치를 사용하면 똑같은 작업을 수행합니다 : 여러 브랜치가 주 브랜치에 순차적으로 병합됩니다. 브랜치 자체는 결국 마스터로 병합됩니다.

중첩 된 분기와의 병합에 대한 정보를 유지하기 위해 종종 git rebase --preserve-merges을 사용합니다. 이것은 내가 원하는 바를 정확하게 수행하고 워크 플로에 아무런 문제가 없습니다.

내 주된 문제점은 git rebase --preserve-merges이 매우 느리다는 것입니다 (커밋 당 약 2 초 걸리기도 함). What exactly does git's "rebase --preserve-merges" do (and why?)을 읽은 후, git는 임의의 그래프에서 작업해야하기 때문에 병합을 유지하기 위해 git가 많은 작업을 수행해야한다는 것을 알고 있습니다.

내 워크 플로가 선형 기록과 비슷한 그래프를 생성하기 때문에 git rebase --preserve-merge을 더 빠른 방법으로 수행 할 수있는 방법이 있습니까? 역사의 "선형성"을 보장해야합니다. 빈 병합 만 커밋합니까? 최종 결과가 정확하다면 스크립트 나 이상한 명령을 사용해도 상관 없습니다.

 A-B-C 
    / \ 
(1)--------D-- master 
    \ 
    \---F-----I-- feature 
     \/\ /
     E G-H 

    A-B-C E G-H 
    / \/\/ \ 
(2)--------D---F-----I-feature 
     master 

tl; dr : 기본 이력이 선형이라는 것을 알고 (2)로 변환하는 방법 (git rebase --preserve-merges)은 많은 작업을하지 않아도되고 빠르게 처리 할 수 ​​있습니까?

답변

0

당신 (파이썬에서, 예를 들어 git rev-list --parents를 실행하고 복사 작업을 시작하기 전에 모든 부모의 정보를 수집) 더 영리한 뭔가 떠들썩한 파티 스크립트를 다시 작성하여 약간의 모든 속도를 할 수있을 것 근본적으로 어렵습니다. 전달하는 다른 링크 노트의 대답으로는 git rebase -p도 정확히 을 보존하지 않습니다.과 같이 병합하여을 다시 만듭니다. 완전히 일반적인 경우에는 - 나는 당신이 더 한정된 특별한 경우에 찬성하여 무시하고 있다는 것을 알고 있습니다; 완전성을 위해서만 이것을 언급합니다. git rebase -p은 특별한 옵션이나 처리가 적용된 병합에서 완전히 실패합니다 (--no-commit은 "악의 병합"을 생성하는 수동 수정과 병합되거나 -X rename-threshold 또는 -X ours 또는 유사한 방식으로 병합됩니다). 특수 사례 정보는 결과적으로 결과 트리에만 저장됩니다. 리베이스 코드는 그것을 찾지조차 않습니다 (이것은 훨씬 더 오래 걸릴 것입니다 : 옵션 병합이 원래 결과를 다시 만들었는지 확인하기 위해 먼저 원래 병합을 재현해야 할 것입니다).

이러한 옵션의 속도 (또는 속도 부족)는 저장소와 파일의 크기, Windows (매우 느림) 또는 Unixish 시스템 (훨씬 빠름) 중 어느 것을 사용하는지에 따라 다릅니다. Git 사람들이 스크립트가 너무 느리기 때문에 Windows에서 제대로 수행 할 수 있도록 C에서 물건을 다시 작성하기 때문에 Windows에서 스크립트를 실행하는 속도가 너무 느려야한다는 것을 알 수있는 이유는 없습니다.

따라서 Windows에서이 작업을 수행하는 경우 속도를 높이는 한 가지 방법은 Windows 사용을 중지하는 것입니다. :-) (Windows와 Linux를 조정하기 위해 git pushgit fetch을 사용하는 것만으로 리베이스 자체를 유지할 수 있습니다.)

+0

불행히도 나는 우분투에있어, 그래서 그것에 의존한다고 생각하지 않습니다. 내가이 문제를 가지고 있었던 repo는 지저분한 역사를 가진 많은 사람들에 의해 사용 되었기 때문에 명령의 느린 속도에 영향을 줄 수있었습니다. 그러나, 나는 특별한 경우에 어렵다는 점에 동의하지 않는다 : 단순한'git rebase'는 그것을 매우 빠르게 정확하게 수행한다; 내 유일한 차이점은 병합 커밋을 건너 뛰는 대신 커밋/커밋해야한다는 것입니다. 그렇게 힘들지 않아야지, 그렇지? – Svalorzen

+0

큰 저장소에서'git merge' 자체가 30 분이 걸리는 것을 보았습니다. 아마 너의 것이 * this * 큰 것은 아니지만 병합을 반복하면 범인이 될 수있다. 대화 형 리베이스는 셸 스크립트로 변경 되었기 때문에'-x' 플래그를 설정하고 작동하는 것을 관찰하여 지연이 어디인지 확인할 수 있습니다. – torek