programing

ono 명령을 사용하여 분기를 gitrebase하는 방법은 무엇입니까?

mailnote 2023. 5. 26. 22:08
반응형

ono 명령을 사용하여 분기를 gitrebase하는 방법은 무엇입니까?

다음 git 명령의 두 블록이 서로 다른 동작을 한다는 것을 알게 되었는데 그 이유를 이해할 수 없습니다.

나는 있습니다.A a 리고a.Bcommit

---COMMIT--- (A)
\
 --- (B)

베이스를 변경합니다.B A( (으)로B

---COMMIT--- (A)
         \
          --- (B)

제가 하면 문제 없습니다.

checkout B
rebase A

하지만 내가 한다면,

checkout B
rebase --onto B A

전혀 작동하지 않고, 아무 일도 일어나지 않습니다.저는 두 가지 행동이 왜 다른지 이해할 수 없습니다.

PphpStorm GIT 클라이언트는 두 번째 구문을 사용하므로 완전히 손상된 것 같습니다. 그래서 이 구문 문제를 요청합니다.

tl;dr

재치를위올구문바른한기본에 맞는 B A용사를 git rebase --onto다음과 같은 경우:

git checkout B
git rebase --onto A B^

또는 참조된 상위 항목인 커밋에서 시작하는 위에 베이스를 다시 배치합니다.B^또는B~1.

만약 당신이 다른 것에 관심이 있다면,git rebase <branch>그리고.git rebase --onto <branch>계속 읽다

더 퀵: 깃베이스

git rebase <branch>에서는 현재합니다.HEAD에서 도달할 수 있는 최근의 약속 위에.<branch>하지만 로부터는 아닙니다.HEAD.
이는 가장 일반적인 리베이스 사례이며 사전 계획이 덜 필요한 경우입니다.

          Before                           After
    A---B---C---F---G (branch)        A---B---C---F---G (branch)
             \                                         \
              D---E (HEAD)                              D---E (HEAD)

예에서는, 이예서는에,는,F그리고.G는 에서 도달할 수 있는 입니다.branch하지만 로부터는 아닙니다.HEAD ㅜㅜgit rebase branch가져가겠습니다D분기점 이후의 첫 번째 커밋이며, 도달할 수 있는 최신 커밋 위에 재배치(, 상위 커밋 변경).branch하지만 로부터는 아닙니다.HEAD, 것은그입니다.G.

정밀도: gitrebase --2개의 인수로 위에.

git rebase --onto특정 커밋에서 시작하여 기본값을 변경할 수 있습니다.이를 통해 재조정되는 항목과 위치를 정확하게 제어할 수 있습니다.이는 정확해야 하는 시나리오를 위한 것입니다.

예를 들어, 우리가 기반을 재조정할 필요가 있다고 가정해 보겠습니다.HEAD 로바위의 맨 F에서 E우리는 단지 당신을 데려오는 것에만 관심이 있습니다.F동시에, 우리는 유지하고 싶지 않습니다.D호환되지 않는 변경 사항이 포함되어 있기 때문입니다.

          Before                           After
    A---B---C---F---G (branch)        A---B---C---F---G (branch)
             \                                     \
              D---E---H---I (HEAD)                  E---H---I (HEAD)

이 경우, 우리는 이렇게 말할 것입니다.git rebase --onto F D이는 다음을 의미합니다.

에서 도달할 수 합니다.HEAD가 부모가누지인D F.

즉, 다음의 부모를 변경합니다.EDFgit rebase --onto 때가그▁then입니다.git rebase --onto <newparent> <oldparent>.

이 방법이 유용한 또 다른 시나리오는 대화형 기본 재배치를 수행하지 않고 현재 분기에서 일부 커밋을 신속하게 제거하려는 경우입니다.

          Before                       After
    A---B---C---E---F (HEAD)        A---B---F (HEAD)

예에서는 이예는제위해기를 하기 위해 합니다.C그리고.E당신이 말할 수 있는 순서에서.git rebase --onto B E또는 리베이스HEAD BE.

외과의사: 기트베이스 -- 세 가지 주장으로 넘어갑니다.

git rebase --onto정밀도 면에서 한 걸음 더 나아갈 수 있습니다.실제로 임의 범위의 커밋을 다른 커밋 위에 재배치할 수 있습니다.

다음은 예입니다.

          Before                                     After
    A---B---C---F---G (branch)                A---B---C---F---G (branch)
             \                                             \
              D---E---H---I (HEAD)                          E---H (HEAD)

이 경우, 우리는 정확한 범위를 재조정하고 싶습니다.E---H FHEAD가 현재 가리키고 있습니다.우리는 그것을 할 수 있습니다.git rebase --onto F D H즉, 다음을 의미합니다.

가 상항목커인 의 범위를 .DH F.

git rebase --onto커밋 범위와 함께 다음이 됩니다.git rebase --onto <newparent> <oldparent> <until>여기서 비결은 커밋이 참조한 것을 기억하는 것입니다.<until> 범위에 포함되어 있으며 새로운 시스템이 될 것입니다.HEAD기지가 완성된 후에.

이 이 이해하기 위해 할 입니다.--onto:

git rebase --onto <newparent> <oldparent>

커밋에서 부모를 전환하지만 커밋의 셰이를 제공하지 않고 현재(이전) 부모의 셰이만 제공합니다.

의 를 더 잘 .git rebase그리고.git rebase --onto두 명령 모두에 대해 가능한 동작이 무엇인지 알면 좋습니다. git rebase선택한 분기 위에 커밋을 이동할 수 있습니다.를 들어 다음과 같습니다.

git rebase master

결과는 다음과 같습니다.

Before                              After
A---B---C---F---G (master)          A---B---C---F---G (master)
         \                                           \
          D---E (HEAD next-feature)                   D'---E' (HEAD next-feature)

git rebase --onto더 정확합니다.이를 통해 시작할 위치와 종료할 위치를 구체적으로 선택할 수 있습니다.를 들어 다음과 같습니다.

git rebase --onto F D

결과는 다음과 같습니다.

Before                                    After
A---B---C---F---G (branch)                A---B---C---F---G (branch)
         \                                             \
          D---E---H---I (HEAD my-branch)                E'---H'---I' (HEAD my-branch)

자세한 내용을 보려면 Gitrebase에 대한 제 기사를 확인하십시오. 개요를 참조하십시오.

짧게 요약하면 다음과 같습니다.

      Before rebase                             After rebase
A---B---C---F---G (branch)                A---B---C---F---G (branch)
         \                                         \   \
          D---E---H---I (HEAD)                      \   E'---H' (HEAD)
                                                     \
                                                      D---E---H---I

git rebase --onto F D H

어느 것이 (왜냐하면)와 같습니까?--onto하나의 인수 사용):

git rebase D H --onto F

F 위의 범위(D, H]에서 기본 재배치 커밋을 의미합니다. 왼쪽에만 해당되는 범위입니다.예를 들어 첫 번째 커밋을 지정하는 것이 더 쉽기 때문에 배타적입니다. branch셋방살이git에서 첫 번째 분기된 커밋을 찾습니다.branchD 이어집니다.H.

OP 케이스

    o---o (A)
     \
      o (B)(HEAD)

git checkout B
git rebase --onto B A

단일 명령으로 변경할 수 있습니다.

git rebase --onto B A B

서 오류처럼 은 여서오럼보것다배다니치입음의의 입니다.B은 " 몇 한다"는 의미입니다.B B문제는 "일부 커밋"이 무엇인가 하는 것입니다.추가하는 경우-i는 플그가가단커일밋다니입는리키에 의해 된 단일 입니다.HEAD 커이이적있커건밋너다에 되어 있기 .--ontoB아무 일도 일어나지 않습니다.

분기 이름이 그렇게 반복되는 경우 명령은 무의미합니다.이는 커밋 범위가 해당 분기에 이미 있는 일부 커밋이며 기본 재배치 중에는 모든 커밋을 건너뛸 수 있기 때문입니다.

설명 및적가사의 추가 및 해당 git rebase <upstream> <branch> --onto <newbase>.

git rebase채무 불이행

git rebase master

다음 중 하나로 확장:

git rebase --onto master master HEAD
git rebase --onto master master current_branch

기본 재배치 후 자동 체크아웃.

표준 방식으로 사용할 경우 다음과 같습니다.

git checkout branch
git rebase master

기지를 다시 설치한 후에는 눈치채지 못할 것입니다.git움직인다branch 합니다.git checkout branch)git reflog역사).두 번째 인수가 commit hash 대신 분기 이름 rebase가 작동하지만 이동할 분기가 없어서 이동된 분기로 체크아웃되는 대신 "분리된 HEAD"가 되는 것이 흥미롭습니다.

주 분기 커밋을 생략합니다.

master--onto 1 부터찍다힙니일▁1에서 따온 것입니다.git rebase논쟁.

                   git rebase master
                              /    \
         git rebase --onto master master

따라서 실용적으로 다른 커밋이나 분기가 될 수 있습니다.이렇게 하면 최신 커밋을 가져오고 기본 커밋을 분산하여 기본 커밋 수를 제한할 수 있습니다.

git rebase --onto master HEAD~
git rebase --onto master HEAD~ HEAD  # Expanded.

지정된 단일 커밋의 기본값을 변경합니다.HEADmaster " HEAD로 끝납니다.

명시적인 체크아웃을 방지합니다.

은 " " 입니다.HEAD또는current_branch논쟁은 상황에 따라 현재 위치에서 이루어집니다.이것이 대부분의 사람들이 기본 재배치를 원하는 지점으로 체크아웃하는 이유입니다.그러나 두 번째 rebase 인수가 명시적으로 제공되면 암묵적인 방식으로 전달하기 위해 rebase 전에 체크아웃할 필요가 없습니다.

(branch) $ git rebase master
(branch) $ git rebase master branch  # Expanded.
(branch) $ git rebase master $(git rev-parse --abbrev-ref HEAD)  # Kind of what git does.

즉, 임의의 위치에서 커밋 및 분기를 기본 재배치할 수 있습니다.그래서 리베이스자동 체크아웃과 함께.리베이스 전/후 리베이스 지점을 따로 체크아웃할 필요가 없습니다.

(master) $ git rebase master branch
(branch) $ # Rebased. Notice checkout.

Git 표현은 여기서 약간 혼란스럽습니다.명령을 다음과 같이 가장하면 도움이 될 수 있습니다.

git rebase --onto=<new_base> <old_base> [<branch>]

가 만에저희가에 있으면.branch이제 생략할 수 있습니다.

git rebase --onto=<new_base> <old_base>

그리고 만약에new_base는 와동합다니와 .old_base우리는 생략할 수 있습니다.--onto매개변수:

git rebase <new_old_base>

이것은 이상하게 들릴 수 있습니다: 만약 이전 베이스가 새로운 베이스와 같다면 어떻게 베이스를 바꾸나요? 이렇게, 이 특징점이 , 입니까?foo그것은 이미 당신의 어떤 약속에 기초하고 있습니다.main점분. "을 통해,것을 ."재기반"을 통해 우리는 더 많은 최신 정보를 기반으로 약속을 하고 있습니다.

(사실,,<old_base>가 비교하는 은 우가비것입다니는하.branch그에 반대하여.분기인 경우 git는 공통 조상을 찾습니다(참고 항목).--fork-point현재 분기에 대한 커밋이면 그 이후의 커밋이 사용되고, 현재 분기와 공통 조상이 없는 커밋이면 현재 분기의 모든 커밋이 사용됩니다. <new_base>커밋이 될 수도 있습니다.를 들면 그서래, 예들면를,git rebase --onto HEAD~ HEAD이전 기지 간의 커밋을 수행합니다.HEAD 현재의 와현의재.HEAD그리고 그것들을 위에 놓습니다.HEAD~마지막 커밋을 효과적으로 삭제합니다.)

말하면, 간히말해서단,서해▁simply말.git rebase --onto커밋 범위를 선택하고 매개 변수로 지정된 커밋을 기준으로 다시 지정합니다.

다음에 대한 man 페이지 읽기git rebaseto.to.to. to.to.를합니다.다음은 매우 좋은 예입니다.

example of --onto option is to rebase part of a branch. If we have the following situation:

                                   H---I---J topicB
                                  /
                         E---F---G  topicA
                        /
           A---B---C---D  master

   then the command

       git rebase --onto master topicA topicB

   would result in:

                        H'--I'--J'  topicB
                       /
                       | E---F---G  topicA
                       |/
           A---B---C---D  master

이 경우, 당신은 git에게 커밋의 기본을 바꾸라고 말합니다.topicAtopicB master.

위해서onto당신은 두 개의 가지가 더 필요합니다.이 명령을 사용하여 다음에서 커밋을 적용할 수 있습니다.branchB에 한 것.branchA예를 들어 다른 가지에.master에서.branchB을 으로 함branchA그리고 당신은 변경 사항을 적용하기를 원합니다.branchBmaster을 적용지않고의 변경 branchA.

o---o (master)
     \
      o---o---o---o (branchA)
                   \
                    o---o (branchB)

다음 명령을 사용합니다.

checkout branchB
rebase --onto master branchA 

다음과 같은 커밋 계층 구조를 얻을 수 있습니다.

      o'---o' (branchB)
     /
o---o (master)
     \
      o---o---o---o (branchA)

.git rebase --onto 점: 선택기세 개 ' 악하기어렵세다의: 대차선기택점이파개의할때칭로으 ')의할 때...')

Git 2.24(2019년 4분기)는 이러한 사례를 더 잘 관리합니다.

커밋 414d924, 커밋 4effc5b, 커밋 c0efb4c, 커밋 2b318aa(2019년 8월 27일), 커밋 793ac7e, 커밋 359eceb(2019년 8월 25일)를 덴튼 리우()Denton-L가 참조하십시오.
도움을 받은 사람: 에릭 sunshineco선샤인(), 주니오 C 하마노(),gitster 애바르 아르뇌르드 비야르마손(),avar 요하네스 쉰들린().dscho
커밋 6330209, 커밋 c9efc21(2019년 8월 27일), 애바르 아르뇌르드 비야르마손()의 avar커밋 4336d36(2019년 8월 25일)을 참조하십시오.
도움을 받은 사람: 에릭 sunshineco선샤인(), 주니오 C 하마노(),gitster 애바르 아르뇌르드 비야르마손(),avar 요하네스 쉰들린().dscho
(주니오 C 하마노에 의해 합병 -- -- 커밋 640f9cd, 2019년 9월 30일)

rebase 감기--onto

전에, 우리가 다음 그래프를 가지고 있었을 때,

A---B---C (master)
     \
      D (side)

git rebase --onto master... master side으로 결적으로가 될 입니다.D어떤 일이 있어도 항상 재조정됩니다.

시점에서 "Gitdiff 커밋 범위에서 이중 ..점 "과 삼중 ...점 "의 차이점은 무엇입니까?"를 읽으십시오.

https://sphinx.mythic-beasts.com/ ~mark/git-diff-help.png

"이리:"master...에대한을 master...HEAD,어느 것이BHEAD가 측면 HEAD임(현재 체크아웃됨): 기준을 다시 적용하고 있습니다.B.
뭘 근거로 하는 겁니까?마스터에 없으며 에서 도달할 수 있는 모든 커밋side과 같습니다: 분기: 해당설맞커하나밋뿐다니입.D이미 위에 있는B!

에는, Git 2.24 전그, 러한과 식이었습니다.rebase --onto으로 결적으로가 될 입니다.D어떤 일이 있어도 항상 재조정됩니다.

그러나 원하는 동작은 리베이스가 이것이 빨리 전달될 수 있다는 을 인식하고 대신 그렇게 하는 입니다.

그것은 그것과 유사합니다.rebase --onto B A아무것도 하지 않은 OP의.

can_fast_forward이 사례를 탐지하고 빨리 감기를 수행할 수 있도록 합니다.
우선 논리를 단순화하는 gotos를 사용하도록 함수를 다시 작성합니다.
▁the에음▁next▁since다.

options.upstream &&
!oidcmp(&options.upstream->object.oid, &options.onto->object.oid)

조이제었니다에서 되었습니다.cmd_rebase우리는 대체품을 다시 도입합니다.can_fast_forward.
특히, 병기의 병합 upstream그리고.head에서 사한해에서 합니다.t3416.

t3416의 약어 그래프는 다음과 같습니다.

        F---G topic
       /
  A---B---C---D---E master

그리고 실패한 명령은.

git rebase --onto master...topic F topic

전에하는이나병기합있것수있알다었니습을다는반이의▁(이▁merge▁base▁before▁g▁that▁there다▁see▁one▁was니있습었수,it▁g전알에it)이 있다는 것을 알 수 있었습니다.Cmaster...topic), 병합 및 기타 항목이 동일하므로 1을 잘못 반환하므로 빨리 전달할 수 있음을 나타냅니다. 렇게하가그재가됩 '가 .ABCFG우리가 '을 기대했을 때.ABCG'.

A rebase --onto C F topic다음의 모든 커밋을 의미합니다. F에 의해 도달할 수 있는.topic 헤드: 즉,G, 닌아가 아닌 오직F그 자체로
이 빠른 에는 이경빠전은다음포을함합니다달른우다포가 됩니다.F리베이스된 분기에서, 그것은 잘못된 것입니다.

논리를 헤드의 이 추가논리, 우리림과헤병임을 합니다.F왜냐하면 onto는 그렇지 않기 때문에.F그것은 우리가 커밋의 전체 세트를 재배치하지 않는다는 것을 의미합니다.master..topic.
일부 커밋을 제외하고 있기 때문에 빠른 전달이 불가능하여 0을 올바르게 반환합니다.

합니다'-f이 변경의 결과로 실패한 사례를 테스트하는 데, 이들은 기본 재배치가 강제될 수 있도록 빠른 전달을 기대하지 않았기 때문입니다.

언급URL : https://stackoverflow.com/questions/29914052/how-to-git-rebase-a-branch-with-the-onto-command

반응형