2017-04-13 3 views
1

내 주점 master 및 지점 originalCode이 있습니다. originalCode 지점의 부모는 master 경우 : A을 커밋하기 전에 F을 커밋 git에서 마스터 분기에서 첫 번째 커밋 전에 나중에 생성 된 분기를 이동하는 방법은 무엇입니까?

    F originalCode 
       /
A - B - C - D - E master 

지금 내 originalCode 지점을 이동하려는. 리베이스 및 병합으로 이미 시도해 보았지만 제대로 작동하지 못했으며 이와 관련하여 이와 관련한 질문을 찾을 수 없었습니다.

목표는 원본 코드 (일부 스크립트)의 변경 내용을 정확히 볼 수있는 공통의 기록을 만드는 것입니다. 체크인을 시작했을 때 이미 외부 수정 버전으로 시작했습니다.

+1

이것은 약간 불명확합니다. 여러분은 이미 공통된 역사가 있습니다! –

+0

OriginalCode 브랜치에는 처음 체크인 할 때 사용하지 않은 수정되지 않은 원본 코드가 포함되어 있습니다. 나중에 만 Repo에 추가 할 때 수정 된 버전이 있다는 것을 깨달았습니다. 분기의 코드는 가장 먼저 커밋 된 것이어야합니다. –

+1

Git에서 브랜치는 * 단일 커밋 *에 대한 참조이므로,'originalCode'는'F'의 또 다른 이름이고'master'는'E'의 또 다른 이름입니다. 그래프는 약간 다르게 묘사되어 정확해야합니다. 어떻게 표시할까요? – mkrieger1

답변

3

내가 그것을 할 것입니다 방법은 다음과 같습니다

  1. 만들기 이상 (F를) 커밋 같은 가리 키도록, 재정렬 커밋을 포함하는 새로운 지점 reordered로 전환 originalCode 등 :

    $ git checkout -b reordered originalCode 
    

    (가) 그래프를 저지 이제 다음과 같습니다

        F originalCode, reordered 
           /
    A - B - C - D - E master 
    

    masteroriginalCode은 변경되지 않습니다. 문제가 발생하면 reordered을 삭제하고 다시 시작할 수 있습니다.

  2. 대화 형 A 전에 F 위치, reordered 리베이스 : A 이후

    루트가 커밋 당신이 --root 옵션을 지정할 필요가있다.

    pick d14a5dd A 
    pick 57b6bd9 B 
    pick de4e672 C 
    pick 6fc8c1f D 
    pick 453da48 E 
    pick d2443c0 F 
    

    F와 선을 잘라 A와 선 위에 붙여 넣습니다

    $ git rebase -i --root reordered 
    

    이 같은 것을 포함하는 텍스트 편집기를 엽니 다. 그런 다음 편집기를 저장하고 종료 한 후 계속하십시오.

    커밋의 실제 내용에 따라 rebase 중에 병합 충돌을 해결해야 할 수도 있습니다. REBASE이 완료되면

  3. , 커밋 그래프는 다음과 같아야합니다

        F originalCode 
           /
    A - B - C - D - E master 
    
    F'- A'- B'- C'- D'- E' reordered 
    

    참고 때문에 --root REBASE의, 공통 조상이없는 커밋이 시리즈가 있음.

  4. reorderedmaster 사이에 내용에 차이가 없음을 스스로 확인하십시오.

    $ git diff reordered master 
    

    출력이 없어야합니다.

    (편집 : 난 당신이 "최신"버전, originalCode 아닌 내용과 master의 내용을 원하는 의심, 그래서 그에 따라 diff을 바 꾸었습니다.)

    차이, 당신은 수도가있는 경우 병합 충돌을 해결하는 동안 문제가 발생했습니다.

    gitk과 같은 그래픽 저장소 브라우저를 사용하여 개별 커밋을 검사 할 수도 있습니다. 당신이 reordered 지점의 상태에 만족하면

  5. , 당신은 masterreordered 이름을 변경하여 다음 originalCodemaster를 삭제할 수 있습니다, 또는 당신은 reordered로 (E'를) 커밋 같은 가리 키도록 master를 이동하고 삭제할 수 있습니다 originalCodereordered 가지가 있습니다.

    경우가 다른 사람 :

    F'- A'- B'- C'- D'- E' master 
    

는 일부 의견 제시에 의해 제기 된 문제를 해결하려면

$ git checkout -B master reordered 
$ git branch -D reordered originalCode 

최종 결과는이 같은 그래프를 저지해야한다 저장소를 복제하고 master 분기에 의존하는 사용자는 위의 5 단계에 표시된 것처럼 저장소를 삭제하거나 이동해서는 안됩니다.

대신 (4 단계 후) 나는 현재 상태에 이르는 또 다른 역사를 제공하기 위해, master에 새 reordered 분기를 병합 제안하지만,뿐만 아니라 원래의 역사를 유지하는 것입니다 :

$ git checkout master 
$ git merge reordered 
$ git branch -d reordered 

결과 :

A - B - C - D - E - G master 
        /
F'- A'- B'- C'- D'- E' 
+0

감사합니다. 다른 지점을 삭제 한 후 내 기록이 그대로 유지되고 싶습니다. –

0

다음을 수행하십시오

커밋 원래의 코드베이스를 포함하는 새로운 루트를 만듭니다

git checkout originalCode 
git checkout --orphan originalCode2 
git commit -m "Original code of project foo" 

이제 우리는이 새로운 루트 위에 master로 이어지는 역사를 이식해야합니다.

echo $(git rev-parse A originalCode2) >> .git/info/grafts 

다음 재 작성 역사 영구적 인 새로운 parentship를 만들기 위해 :

git filter-branch master 

지금 당신이 의도 한 역사를 가지고 이러한 목적을 위해, 우리는 originalCode2 위에 A 커밋 접목. 이 은 내역을 다시 쓰고 게시 된 다시 작성 기록과 관련된 모든주의 사항이 적용됩니다.

마지막으로 .git/info/grafts (위 단계에서 작성한 행)을 제거해야합니다. 아마도 유일한 행일 것이므로 .git/info/grafts을 삭제하면됩니다.

git rebase --root originalCode2 master 또는 --root이 포함 된 유사 콘텐츠를 filter-branch 대신 사용할 수도 있지만이 리바이스 변형에 대한 경험은 없습니다. 여기