내 추천 (또는 "내가 미스터 오렌지 인 경우 어떻게 할 것인가")은 git fetch
으로 시작하십시오. 이제 나는 블로 돈이 리베이스 한 후, "git push -f"를 실행하기 직전 인 레포에 이것을 넣을 것입니다.
M1 - M2 - M3
\ \
\ \
A1 - A2 A1' - A2'
한 가지 중요한 차이가 나는 A2 레브 가리키는 내 지역 레이블 A
있을거야,하고, 원격 라벨 remotes/origin/A
은 A2를 가리키는 '(씨 금발 그것을 다른 방법으로 주위, 지역 레이블 A
를 가리키는했다 A2 '를 가리키며 remotes/origin/A
).
내가 명명 된 지점의 내 사본에 노력하고 한 경우 "A"내가 대신이있을 것이다 :
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2'
(내 지역 레이블은 A3보다는 A2를 가리키는 또는 A4 나 A5 , 등 내가 얼마나 많은 변화를 적용했는지에 따라.) 이제해야 할 일은 A2에 A3 (필요하면 A4 등)를 리베이스하는 것뿐입니다. 한 가지 분명한 직접적인 방법 : 수정 된 사람이 A1으로 new_A '및 A2'에 있기 때문에
$ git branch -a
master
* A
remotes/origin/master
remotes/origin/A
$ git branch new_A remotes/origin/A
$ git rebase -i new_A
다음이 완전히 회전 속도를 올린다의 A1 및 A2를 놓습니다. 또는 :
$ git checkout -b new_A remotes/origin/A
$ git format-patch -k --stdout A3..A | git am -3 -k
합니다 (git am -3 -k
방법은 git-format-patch
매뉴얼 페이지에 설명되어 있습니다).
이 나는 그가 두 번째 방법은 내가 끝낼 성공하면 그의 rebase
, 즉 등 A1, A2, A3,
를 식별 한 전 씨 금발을하지 않았다가 무엇인지 파악이 필요합니까 :
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' - A3'
내 지점 이름 A3에 new_A
포인트 '(기존 A
지점은 여전히 이전 A3를 가리키는). 첫 번째 접근법을 사용하고 성공하면 같은 결과를 얻습니다. 기존의 지점 이름 A
이 이제 A3 '을 가리킬 것입니다 (그리고 A1-A2-A3가있는 이전 지점에 대해서는 이름이 없습니다. 아직 내 레포에 있지만 reflog 등을 통과해야 함을 알게됩니다.) 물론
(내 A3 필요가 A3 ', 대화 형 REBASE 물론 내게로 작업을 필요로합니다 "자식 오전"방법 모두가 될 수 있습니다., 수정하는 경우)
그것은으로 (에 또한 단지
git merge
가능) 게리 Fixler에 의해이 질문에 대해,하지만주는 병합 아래, 아니 번호 ("M"을 커미트) 및 A1 회전 속도를 올린다을 유지하고 A2 볼 수 만듭니다 :
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' -- M
\_______________/
을 원래 A1을 유지하려면 그리고 A2, 이것은 좋은 것입니다; 당신이 그들을 제거하고 싶다면 그것은 나쁜 것입니다. 그래서 "해야할 일"은 "결과를 원하는 것"에 달려 있습니다.
수정 사항 : 모든 것이 좋음을 확인하는 동안 이전 버전의 분기 이름을 남겨두기 때문에 형식 패치 방법이 더 좋습니다.
$ git branch -m A old_A
$ git branch -m new_A A
하고, old_A 완전히 포기 될 수있는 경우 : 모든 작품을 가정하고 것은 좋은이며, 여기에 지난 몇 단계의
$ git branch -D old_A
또는, 분기 삭제와 동등하게, 시작, 다음 A.에 new_A의 이름을 변경
(편집 : new_A 지점에 등을 A3을, 리베이스의 목표를 위해, 또한 git rebase --onto
설명서를 참조하십시오.)
참고 : '--'와'hard' 사이에 공백이 없습니다. - 그 대답은 정확하게 두 화면 사이에 싸여 있었기 때문에 잠시 시간이 걸렸습니다. :) – qbolec