자식과 함께 시작하는 것은 2014 년 1 분기 1.9 / 2.0, 당신은에 설명 된대로 다시 상류 지점에 그것을 리베이스하기 전에 이전 분기 원을 표시 할 필요가 없습니다 아리스토텔레스 Pagaltzis 의 대답 :
참조가 07d406b 커밋 과 d96855f 커밋 :
로 topic
만든 브랜치 에서 작업 한 후 git checkout -b topic origin/master
원격 추적 브랜치의 기록을 origin/master
되 감고 다시 빌드하여 다음과 같은 형태의 기록을 만들 수 있습니다.
o---B1
/
---o---o---B2--o---o---o---B (origin/master)
\
B3
\
Derived (topic)
여기서 origin/master
커밋에 포인트로 사용 B3
, B2
, B1
지금은에 점 B
, 그리고 topic
때 백업의 지점은 정상에 시작되었다 origin/master
이었다 B3
.
이 모드는의 reflog를 사용하여 분기점 origin/master
으로 찾기 B3
때문에 다음 topic
을 통해 업데이트 된 항목origin/master
을 기반으로 할 수 있습니다 .
$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic
이것이 git merge-base
명령에 새로운 옵션이있는 이유입니다 .
--fork-point::
분기 (또는 이로 이어지는 모든 기록 <commit>
)가 다른 분기 (또는 참조)에서 분기 된 지점을 찾습니다 <ref>
.
이것은 두 커밋의 공통 조상을 찾을뿐만 아니라 분기의 이전 화신에서 분기 된 <ref>
역사를 확인하기 위해 의 리플 로그를 고려합니다<commit>
<ref>
.
" git pull --rebase
"명령은 " base
"가있는 경우에 대처하기 위해 분기 작업의 기반이 된 " "분기 (일반적으로 원격 추적 분기)의 reflog 항목을 사용하여 리베이스되는 분기의 분기점을 계산합니다. 가지가 되 감고 재건되었습니다.
예를 들어, 기록이 다음과 같은 경우 :
- 현재의 끝은 "
base
"지점에 있습니다 B
만, 이전의 팁 예전 관찰을 불러오는 B3
다음과 B2
다음 B1
, 커밋 현재에 도착하기 전에
- 최신 "base"위에 리베이스되는 브랜치는 commit을 기반으로합니다
B3
.
이 찾습니다 B3
"의 출력을 통해 이동하여 git rev-list --reflog base
"(즉 B
, B1
, B2
, B3
) 그것은 그 현재의 팁의 조상 커밋 찾을 때까지 " Derived (topic)
".
내부적으로 get_merge_bases_many()
는 일회성으로 이것을 계산할 수 있습니다. " " 의 모든 역사적 팁을 병합하여 결과가되는 가상의 병합 커밋
사이의 병합 기반을 원할 Derived
것 base (origin/master)
입니다.
그러한 커밋이 존재하면 " base
" 의 reflog 항목 중 하나와 정확히 일치하는 단일 결과를 얻어야합니다 .
힘내 2.1 (2014 년 3 분기)이이 기능이 더 강력하게 추가 할 것입니다 : 참조 1e0dacd 커밋 에 의해 존 키핑 ( johnkeeping
)
다음 토폴로지가있는 시나리오를 올바르게 처리하십시오.
C --- D --- E <- dev
/
B <- master@{1}
/
o --- B' --- C* --- D* <- master
어디:
B'
는 B
패치와 동일하지 않은 수정 된 버전입니다 B
.
C*
및 D*
패치와 동일한다 C
과 D
각각 잘못된 순서로 적용될 경우, 텍스트로 충돌;
E
텍스트는 D
.
정확한 결과 git rebase master dev
IS B
의 포크 포인트로 식별 dev
하고 master
, 그래서 C
, D
, E
필요에이 재생 될 것을 커밋이다 master
; 하지만, C
및 D
패치와 동일하다 C*
및 D*
최종 결과가되도록, 따라서 감소 될 수있다 :
o --- B' --- C* --- D* --- E <- dev
분기점이 식별되지 않은 경우 B
포함 된 분기 를 선택 B'
하면 충돌이 발생하고 패치와 동일한 커밋이 올바르게 식별되지 않은 경우 C
포함 D
(또는 동등하게 D*
)을 포함하는 분기 를 선택 하면 충돌이 발생합니다.
" --fork-point
"모드는 git rebase
Git 2.27 (2020 년 2 분기)에서 수정 된 2.20 시대에 C에서 명령을 다시 작성했을 때 퇴보했습니다.
참조는 f08132f 커밋 에 의해 (2019 12월 9일)를 Junio C 하마노 ( gitster
)을 .
(Merged by Junio C gitster
Hamano -- in commit fb4175b , 27 Mar 2020)
rebase
: --fork-point
회귀 수정
서명자 : Alex Torok
[jc : 수정 사항 수정 및 Alex의 테스트 사용]
서명자 : Junio C Hamano
" git rebase --fork-point master
"은 (는) 잘 작동했습니다. 내부적으로 " git merge-base --fork-point
" 라는 이름으로 짧은 참조 이름을 처리하는 방법을 알고 기본 get_fork_point()
함수 를 호출하기 전에 전체 참조 이름으로 변경했습니다 .
명령이 C로 다시 작성된 후에는 더 이상 해당되지 않습니다. 직접 내부 호출이 get_fork_point()
짧은 참조를 dwim하지 않기 때문입니다.
"git merge-base"에서 사용되는 "refname 인수를 전체 참조 이름으로 변경"논리를 기본 get_fork_point()
함수로 이동하여 "git rebase"구현에서 함수의 다른 호출자가 동일한 방식으로 수정하도록합니다. 이 회귀.