developer tip

Git : 한 번에 여러 브랜치를 리베이스하는 방법 (동일한 기본 커밋으로)?

optionbox 2020. 12. 26. 09:59
반응형

Git : 한 번에 여러 브랜치를 리베이스하는 방법 (동일한 기본 커밋으로)?


내 프로젝트에는 다른 사람의 변경 사항을 가져 오는 데 사용하는 마스터 브랜치가 있습니다. 그로부터 저는 보통 제가 현재 작업하고있는 여러 개의 토픽 브랜치를 가지고 있습니다.

내 질문은 : 새로운 변경 사항을 마스터로 가져온 다음 모든 토픽 분기를 한 번에 리베이스 할 수있는 방법이 있습니까?

이것이 상황입니다.

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

그리고 하나의 명령으로 이것을 수행하고 싶습니다 (H는 업스트림에서 왔습니다).

               D '-E'topic1
              /
    A--B--C--H 마스터
              \
               F '-G'주제 2

이제 topic1과 topic2를 master로 리베이스하여이 작업을 수행 할 수 있으며이를 자동화하는 스크립트를 작성할 수도 있습니다. 그러나 다른 분기가 여러 개 있고 새 분기를 만들고 다른 분기를 자주 삭제하고 항상 업스트림 변경 사항을 수신하면 어떻게됩니까?

이 작업 (여러 rebases)을 손으로 수행하면 피곤하고 오류가 발생하기 쉽습니다.

더 쉬운 방법이 있습니까?

감사!


이 작업을 자동으로 수행하는 방법이 없다고 확신합니다. "git rebase master"는 병합 충돌을 해결해야하는 셸로 돌아갈 수도 있으므로이 모든 것을 자동화하는 스크립트를 작성하려면이를 고려해야합니다.

하지만 업데이트가 필요한 분기를 상당히 쉽게 추적 할 수 있습니다. 흠, 모든 브랜치에 대해 "git rev-list branch..master"는 브랜치가 최신 wrt가 아닌 경우 출력을 생성합니다 (즉, 마스터 위에 커밋). 따라서 보고서를 생성하려면 master를 제외한 모든 로컬 헤드를 반복해야합니다 (nb "git show-branch"는 대략이 작업을 수행합니다).

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

따라서 용감하다고 느끼면 "git diff"를 "git checkout $ branch && git rebase master"(또는 설정 한 경우 "git pull --rebase")와 같이 바꿀 수 있습니다. 그런 다음 ".git / rebase-apply"디렉토리가 있는지 확인하거나 병합되지 않은 파일 ( "git ls-files -u")의 색인을 확인하여 대기 상태인지 테스트해야한다고 생각합니다. 병합하십시오.

물론 충돌이 없다면 쉽습니다 ... 쉽지 않을 때도 작동하는 무언가를 생산하는 것이 문제입니다 : p

그리고 이것은 브랜치 중 하나가 다른 것을 기반으로하는 경우 발생하는 일을 반드시 해결하는 것은 아닙니다. 그래서 마스터에서 맹목적으로가 아니라 브랜치 구성에 따라 리베이스 할 것이기 때문에 대신 "git pull --rebase"사용을 언급했습니다. . 감지가 브랜치 구성을 기반으로하는 것은 아니지만 ... 아마도 각 브랜치를 확인하고 "git pull"을 수행하고 브랜치 구성이 리베이스 또는 병합 여부를 포함하여 모든 것을 처리하도록하는 것이 가장 쉬울 것입니다.


항상 다음과 같이 셸 한 줄을 작성할 수 있습니다.

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

리베이스하고 싶은 토픽 브랜치가 시간이 지남에 따라 변경 될 것이므로 이것은 신속하고 dir ^ H ^ H ^ H 유연한 솔루션입니다 :-)


나는 이것을 내 git-extensions 저장소 에서 유지 관리하는 강력한 스크립트로 바 꾸었습니다 .

$ 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]

참조 URL : https://stackoverflow.com/questions/866218/git-how-to-rebase-many-branches-with-the-same-base-commit-at-once

반응형