2011-02-24 5 views
3

브랜치를 마스터 브랜치에 놓고 git checkout -b ui을 실행했습니다. 내가 실행 한의 말에, 일주일의 과정을 통해 작품의 톤을했다 : 그때 내가 previously- git checkout uploads에 근무했던 지점으로 전환다른 브랜치를 체크 아웃 한 후 Git 브랜치에서 수행 한 작업을 찾을 수 없습니다.

git add . 
git commit -am 'ui' 

git checkout master 
git merge ui 
git push 

- 어떤 순간 나는에서했던 모든 것을에서 ui 지점이 손실되었습니다. git log에 나열되어 있지 않으며 git reset --hard HEAD^은 'ui'분기 이전에 지점으로 다시 이동합니다. 어떻게 될까요?

reflog를보고 'ui'커밋으로 돌아가서 대부분을 복구 할 수 있었지만이 문제의 원인은 무엇입니까?

답변

7

손실되지 않았으므로, git (git checkout)에서 분기를 전환하면 작업 트리가 해당 분기의 파일을 갖도록 완전히 변경됩니다. 당신이 실행하는 경우 :

git branch 

을 ... 당신은 나열된 모든 master, uiuploads 볼 수 있습니다. 당신이 ui 지점에 대한 로그를 볼 수있는 경우

, 당신은 실행해야합니다

git log ui 

이유를 당신이 ui이 병합 커밋이다 합병 전에 git reset --hard HEAD^ 다시 master에 커밋하는 방법을 이동하는 것이 (여기서 메르 전에 병합

  • ui 전에

    1. master : master)이 있었다 두 부모가 있습니다

    당신이 다시 부모로 이동 커밋 이름, 단일 ^를 추가 GE

  • - 두 번째 부모를 참조, 당신은 HEAD^2을 사용합니다. 그러나, git reset --hard을 변경하려면 여기를 클릭하십시오. master이 어디 있는지 확인하고 싶습니다. (어쨌든 커밋되지 않은 변경 사항은 버려 지므로주의해서 사용해야하는 명령입니다.)

    어쨌든 ui 분기에서 수행 한 모든 변경 사항은 이제 master으로 병합됩니다. 그래서 당신이 거기서 한 일에 만족한다면 ui 지점에 대해 더 이상 걱정할 필요가 없습니다. Greg Hewgill의 대답은 지금 원하는 것이 있다면 uploads 가지에 모든 작업이 포함되어 있는지 확인하는 것입니다.

    +0

    아, 그럼 말이 되네. 내가 파일을 다시로드하고 모든 추가 사항이 사라지면 놀라지 마세요. 나는 내가 git에 아주 새로운 것에 따라 그것을 기대하지 않고 있었다. 덕분에 – aperture

    +0

    @aperture : 실제로'git checkout '이후 작업 트리가 완전히 변경된 것을 처음 접하는 것이 가장 놀랍습니다. - 사람들이 ** 완전히 다른 작업 트리를 저장하는 저장소에서 작업하는 경우 더욱 그렇습니다. 동일한 저장소의 다른 가지 :) 더 일반적인 점은 일단 변경이 git에서 이루어지면 잃어 버리기가 매우 어렵 기 때문에 정기적으로 커밋하는 것이 좋습니다. –

    3

    당신이 기술 한 모든 것은 예상대로입니다. uploads 브랜치로 전환했을 때 ui 브랜치에서의 작업이 나타나지 않는다는 것에 놀랐던 것 같습니다. 이는 을 만들 때 ui 작업이 존재하지 않았기 때문에 의미가 있습니다.

    1. 병합 masteruploads로 : git merge master
    2. Rebase 현재 uploadsmaster 위에 :

    이 두 명령 git rebase masteruploads 분기에 실행된다 여기서 두 가지 접근 방식을 취할 수 있습니다.

    관련 문제