2009-05-14 6 views
51

저는 프로젝트에서 다른 사람들로부터 변경 사항을 가져 오는 데 사용하는 마스터 브랜치를 가지고 있습니다. 그로부터, 나는 보통 내가 현재 일하고있는 몇 가지 토픽 브랜치를 가지고있다.힘내 : 한 번에 (같은 기본 커밋으로) 많은 지점을 rebase하는 방법?

내 질문은 : 내 주인에게 새로운 변경 사항을 적용한 다음 모든 주제 분기를 한꺼번에 리베이트 할 수있는 방법이 있습니까?

상황이다

 D--E topic1 
    /
A--B--C master 
     \ 
     F--G topic2 

내가 하나의 명령으로이 작업을 수행 할 (H 상류에서 온) :

 
       D'--E' topic1 
      /
    A--B--C--H master 
       \ 
       F'--G' topic2 

을 지금, 나는 내가 리베이스하여이 작업을 수행 할 수 있습니다 알고 주제 1과 주제 2를 마스터에 추가하고이를 자동화하는 스크립트를 작성할 수도 있습니다. 하지만 내가 다른 여러 가지 지사를 가지고 있고, 새로운 지사를 만들고 자주 지회를 삭제하면 항상 상류 변경 사항을 받게됩니까?

이 작업 (몇 개의 리베이스)은 손으로 수행 할 때 피곤하고 오류가 발생하기 쉽습니다.

더 쉬운 방법이 있습니까?

감사합니다.

+1

[이 새로운 문제 (http://stackoverflow.com/questions/5600659/rebasing- a-branch-includ ing-all-its-children/5600770 # 5600770)은 아마도 복제본이지만 실제 응답이없는 이전 질문의 복제본으로 실제로 닫히지 않았는지 확실하지 않습니다. – Cascabel

+1

참고 [전체 하위 작업을 rebase하는 방법 - 여러 분기, 병합 결과로 연결됩니다.] (http://stackoverflow.com/a/9706495/94687). –

+0

''git rebase --onto'는'topic1' 또는'topic2'에 하위 브랜치가있는 경우에 대해서도 언급해야합니다. https://coderwall.com/p/xzsr9g/rebasing-dependent-branches-with-git – quimnuss

답변

17

저는 자동으로이를 수행 할 방법이 없다고 확신합니다. "git rebase master"는 병합 충돌을 해결할 필요가있는 쉘로 다시 되돌아 갈 수 있으므로,이 모든 것을 자동화하는 스크립트를 작성하려면이를 고려해야합니다.

업데이트가 필요한 지점을 쉽게 추적 할 수 있습니다. 흠, 모든 브랜치에 대해, "git rev-list branch..master"는 브랜치가 최신 wrt가 아닌 경우 (즉, 맨 위에 커밋) 출력을 생성합니다. 그래서 당신은 (NB "자식 쇼 분기"약이 할 것) 보고서를 생성하는 마스터를 제외한 모든 지역의 머리를 통해 루프를 필요 : 그래서

git for-each-ref 'refs/heads/*' | \ 
    while read rev type ref; do 
    branch=$(expr "$ref" : 'refs/heads/\(.*\)') 
    revs=$(git rev-list $rev..master) 
    if [ -n "$revs" ]; then 
     echo $branch needs update 
     git diff --summary --shortstat -M -C -C $rev master 
    fi 
    done 

당신은 용감 느낌이 있다면, 당신은 "자식을 대체 할 수 diff "와 같은 것을"git checkout $ branch & & git rebase master "(또는 설정했다면"git pull --rebase "와 같이) 사용하십시오. 그런 다음 ".git/rebase-apply"디렉토리의 존재 여부를 확인하거나 병합되지 않은 파일의 인덱스 ("git ls-files -u")를 확인하여 기다리지 않으면 테스트해야한다고 생각합니다. 합병해라. 충돌이없는 경우는 물론

는, 다음은 문제의 그 쉽지 않은 경우 그것은 또한 작동하는 무언가를 생산하고있다 ... 쉽다 : 페이지

그리고 이것은 반드시 한 경우 발생하는 해결되지 않습니다 당신의 브랜치는 뭔가 다른 것을 기반으로합니다 ... 그래서 "git pull --rebase"를 사용하는 대신 브랜치 구성에 따라 리베이스 (rebase) 할 것이고, 맹목적인 것은 마스터가 아닙니다. 탐지가 분기 구성을 기반으로하지는 않지만 각 분기를 체크 아웃하고 "git pull"을 수행하고 분기 구성이 리베이스 또는 병합을 포함하여 모든 것을 처리하게하는 것이 가장 쉬운 방법일까요?

+1

도움을 주셔서 감사합니다 ! 이것이 내가 생각했던 것보다 더 어려운 문제라고 생각합니다. 따라서 수동 리베이스 작업을 계속 진행할 것입니다. :) – malvim

+3

'git branch --no-merged'를 사용하여 최신 마스터로 가져 오려는 브랜치를 나열합니다. – rjmunro

+1

@rjmunro 좋은데, 나는 그 깃발에 대해 몰랐다. 그러나 병합보다는 리포지토리가 필요한 경우에 적합하다고 생각합니다. – araqnid

7

당신은 항상 단 한 줄과 같은 쉘 쓸 수 있습니다 : 당신은 아마 시간이 지남에 따라 변경됩니다 리베이스하고 싶은 주제 분기 이후

for branch in topic1 topic2 topic3;do git rebase master $branch;done 

을이 빠른 및-DIR은^H^I는 my git-extensions repository에서 강력한 스크립트 이것을 유지되어있다

+1

"똑똑한"버전에 대한 관련 질문으로 [기본 응답을 포함하는 가지를 자동으로 결정하는] [이 답변보기 (http://stackoverflow.com/a/5632027/396967) – kynan

0

:-) H는^Hflexible 용액 :

$ git-urebaselocalbr --help 
Rebase all/the last committed N local branches (except for the current branch 
and master) to the updated upstream head. 
Usage: git-urebaselocalbr [--continue|--skip|--abort] [--branches "<branch1> ..."] [N] [-i|--interactive] [options] 
관련 문제