2013-05-23 2 views
3

나는 꽤 잘 작동하는 코드를 가지고 있고 git checkout -b messaging으로 내 작업 컴퓨터에서 중요한 변경 사항을 만들기 위해 지점을 만들었습니다. 부분적으로 완료된 작업을 커밋하여 git push origin messaging으로 원격 저장소에 푸시했습니다. 지금은 집에있어 것을, 나는 git pull origin messaging을했고, 그 지점에,하지만 나는 마스터로 전환하기를 원하지만 git checkout master 나에게 다음과 같은 메시지 제공 : 내 수정에서근원으로 분기하고 다시 마스터로 전환하고 있습니까?

$ git checkout master 
Switched to branch 'master' 
Your branch is ahead of 'origin/master' by 1 commit. 

및 모든 파일을 messaging 가지가 있습니다. git status은 내가 지점 master에 있다는 것을 알려주지 만 내 지점은 1 커밋에 의해 origin/master보다 앞서 있습니다. 나는 내 실제 마스터 두 가지 방법으로 얻을 수 있습니다 알아 냈어요 :이 일어나는 이유에 대해 혼란 스러워요, 내가 master 내 변화에 영향을주지 않습니다 있는지 확인하려면 그러나

git checkout origin/master 
git checkout master~1 

messaging 브랜치가 있습니다. 내가하고 싶은 일은 origin/master 내 로컬 master을 만들고 별도의 지점에 messaging을 보관하십시오. 내 가정용 컴퓨터에서 messaging 커밋을 가리 키도록 뭔가 잘못 했습니까? 이 시점에서 두 개의 완전히 격리 된 지점을 갖고 싶습니다. 나는 내 master 지점에 있었다 git pull origin messaging했을 때

것을 실제로 내 로컬 mastermessaging 가지를 병합 않았다, 더 그것에 대해 생각? 그렇다면 무엇을해야합니까? (로컬 messaging 브랜치를 만들고 그걸 가져 가야합니까?) messaging 변경없이 내 로컬 master을 다시 커밋 할 수 있습니까?

+0

나는 'git reset --hard origin/master'를했는데 내 문제가 해결되었을 수도있다. 앞으로도 그것을 피하기 위해 내가 잘못한 정보와 그것이 올바른 일인가에 대한 정보를 여전히 원할 것입니다. –

답변

5

오, git pull ... 나는 git pull을 좋아하지 않습니다. 그것이하는 일은 사람들을 혼란스럽게하는 것입니다. 무슨 일이야?

집까지 갈 때까지 모든 것이 git pull origin messaging 괜찮 았습니다. git branch -av을 실행하면 origin/masterorigin/messaging이 원하는 커밋을 가리키는 것을 볼 수 있습니다.

그래서 끌어 당기는 무엇을 했습니까?

git pull은 실제로 git fetch에 대한 래퍼이며 그 뒤에 git merge이옵니다. git fetch은 쉽습니다. 원격에서 (origin으로 지정된) 스냅 샷에 대한 정보를 수집 했으므로 로컬에 없었습니다. 이 경우 origin/messaging이라는 커밋과 분기가 하나 있습니다. 그런 다음 당기기에서 git merge origin/messaging을 실행하여 현재 체크 아웃 한 지점 (master)에 origin/messaging 분기를 병합했습니다. 따라서 의도하지 않게 변경 사항을 origin/messaging에서 master으로 변경했습니다.

문제를 해결합시다. 첫째, 있어야 할 곳에 다시 마스터를 넣어 :

이제
git checkout master 
git reset --hard origin/master 

, 원격 지점에 따라 messaging라는 로컬 브랜치를 체크 아웃 :

git checkout -b --track messaging origin/messaging 

이제 messaging 분기에 작업을 계속할 수 있습니다.

앞으로는 git pull을 피하는 것이 좋습니다. 그 의미가 혼란 스럽다. 대신 git fetch을 실행 한 다음 병합 또는 리베이스를 사용하여 각 브랜치를 수정하십시오.

+0

고마워, 나는 '자식 가져 오기'가 실제로 원격지의 모든 브랜치에서 모든 변경 사항을 가져 왔다는 것을 깨닫지 못했습니다. 마지막으로 가지고있는 그림은 커밋 된 바다의 것입니다. 각 커밋은 생성 된 커밋을 거꾸로 가리 킵니다. 또한 기본적으로 커밋에 대한 포인터 (따라서 커밋의 히스토리) 인 브랜치가있다. 초기 클론은 master 브랜치를 어떻게 든 보았다고 생각했지만 모든 커밋과 브랜치 포인터를 가져온다 고 추측합니다. 그러나 그 후에는 새로운 원격 브랜치를 구체적으로 추적해야합니다. –

+0

소리처럼 들리 네! –

5

나는 당신이 당신 자신의 질문에 대답했다고 생각합니다. git pull의 설명서에서 :

변경 내용을 원격 저장소에서 현재 분기로 통합합니다. 기본 모드에서 git pull은 git fetch와 git merge FETCH_HEAD의 줄임말입니다.

즉, 원격 '메시징'분기를 로컬 마스터 분기로 가져 왔습니다.

실제로 무엇을하는지 이해하지 않고 git pull을하는 일반적인 위험이 있습니다. 본질적으로 git fetch 다음에 git merge이옵니다.이 경우 분명히 원하는 것은 아닙니다. 당신이하고 싶은 것은 git fetch이고 그 뒤에 git checkout --track origin/messaging이옵니다. 그러면 리모컨을 추적하는 로컬 messaging 브랜치가 생성됩니다. 이는 아마도 예상 한 동작 일 것입니다.

This blog entry Mark Longair는 git pull을 잘 설명하고 있으며 왜 명시 적으로 가져 오기 및 병합하는 것이 더 나은지 잘 모릅니다.

+0

위대한 답변 주셔서 감사합니다, 나는 당신을 upvoted지만 피터의 생각은 조금 나아 졌어. –

0

예, master 브랜치에 분기를 가져오고 병합했습니다. 그리고 네 말이 맞습니다. 로컬 메시징 지점을 만들어서 가져 왔어야합니다.

두 개의 명령 git fetch then git merge origin/XX으로 분리하여 어떤 일이 일어나고 있는지 100 % 확실하게 살펴보십시오.

관련 문제