2013-05-27 2 views
32

내 상황을 설명해 드리겠습니다 :힘내 : 재배치 된 지점 당기기

Mr Blond와 Mr Orange는 커밋 M1에서 마스터 지점에서 분기하는 작업을하고 있습니다. 지점 A에는 2 개의 커밋 (A1 및 A2)이 있습니다.

M1 
    \ 
    \ 
    A1 - A2 

한편 미스터 오렌지는 M2와 M3의 마스터 브랜치를 커미트하고 푸시했습니다.

M1 - M2 - M3 
    \ 
    \ 
    A1 - A2 

씨 금발 원격에서 끌어 잠시 마스터 지점에 리베이스하기로 결정 후 :

M1 - M2 - M3 
    \   \ 
    \   \ 
    A1 - A2 A1` - A2` 

이제 A1` 및 A2` 미스터 금발의에 로컬로 존재하는 리베이스 커밋은, A1과 A2는 원격으로 존재합니다. Blond는 -f을 사용하여 변경 내용을 적용하고 내역을 "다시 쓰기"위해 자신의 커밋을 보냅니다. 이제 원격 저장소는 다음과 같습니다.

M1 - M2 - M3 
      \ 
       \ 
       A1` - A2` 

그러나 Mr. Orange도 A 분기에서 작업했습니다. 그의 로컬 저장소는 여전히 다음과 같습니다 :

M1 - M2 - M3 
    \ 
    \ 
    A1 - A2 

원격 저장소의 A 분기와 동기화하려면 Mr.

정상적인 당김이 작동하지 않습니다. pull -f 로컬에서 원격으로 변경 사항을 적용 하시겠습니까? 로컬 버전 A를 삭제하고 원격 저장소에서 다시 가져 오는 것은 트릭을 수행 할 수 있지만이를 달성하는 좋은 방법은 아닌 것 같습니다. 씨 오렌지 그의 변화를 잃고 마음을하지 않는 경우

답변

21

내 추천 (또는 "내가 미스터 오렌지 인 경우 어떻게 할 것인가")은 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 설명서를 참조하십시오.)

30

, 그는 자신의 지역 A2 지점에 얻을 후, 서버에서 git checkout A2를 가져올 수 있습니다, 그의 A2에 다시 git reset --hard origin/A2 (리모컨을 추정 "원산지"라는) 어디 리모컨 A2입니다.

변경 사항이 손실되면 서버의 변경 사항을 병합하여 문제를 해결할 수 있습니다 (자신의 A2 분기에서 리모컨의 이름이 "origin"인 것으로 가정). git merge origin/A2. 이렇게하면 자신과 리모컨의 브랜치 모두에 새로운 커밋이 만들어지며 두 브랜치의 변경 사항이 함께 병합됩니다. 그러면 리모컨으로 다시 밀 수 있습니다.

+1

참고 : '--'와'hard' 사이에 공백이 없습니다. - 그 대답은 정확하게 두 화면 사이에 싸여 있었기 때문에 잠시 시간이 걸렸습니다. :) – qbolec