힘내 : "현재 지점에 없습니다." 변경 사항을 유지하면서 지점으로 돌아갈 수있는 쉬운 방법이 있습니까?


201

그래서 저장소에서 몇 가지 작업을 수행했으며 커밋하려고 할 때 현재 어느 지점에도 있지 않다는 것을 알고 있습니다.

이것은 서브 모듈로 작업 할 때 많이 발생하며 해결할 수는 있지만 프로세스가 번거롭고 더 쉬운 방법이 있어야한다고 생각했습니다.

변경 사항을 유지하면서 지점으로 돌아갈 수있는 쉬운 방법이 있습니까?

답변:


213

커밋하지 않은 경우 :

git stash
git checkout some-branch
git stash pop

다음 이후에 커밋하고 변경하지 않은 경우 :

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

추가 작업을 수행 한 후 수행 한 경우 :

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
이미 커밋 한 경우 도움이되지 않습니다. 질문에 명시되어 있지 않은 다운 투표는 없습니다.
Dean Rather

24
이미 커밋 한 경우 : 커밋 해시 ( git show또는 사용 git rev-parse HEAD)를 확인하고 분기로 전환 한 git cherry-pick다음 커밋 해시 를 따르십시오.
araqnid

7
커밋 된 경우 마지막 커밋의 해시를 가져옵니다. 당신이 가고 싶은 지점을 체크 아웃git merge _hash_
다니엘

정말 조심하십시오. 변경 사항을 커밋하고 다음 단계를 수행 한 경우 ... "지점 및 출발지 / 마스터가 분기했습니다"라는 메시지가 표시됩니다.
thinkanotherone

1
@thinkanotherone 이미 변경 사항을 커밋 한 경우 숨기고 다른 지점을 확인하는 것이 세상의 끝이 아닙니다. 방금 한 커밋은 여전히 ​​존재하며를 사용하여 해당 분기에 병합 할 수 있습니다 git merge <hash-of-the-commit-you-just-made>.
Erik B

160

이것은 나를 도왔다

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
이미 여러 번 커밋 한 경우이 작업을 수행해야합니다.
Benjamin Oakes

시도하지는 않았지만 작동하는 것처럼 보입니다. 그러나 나는 그것이 아마도 시나리오라고 생각합니다. 나는 대부분의 사람들이 그들이 대답하기 전에 받아 들여진 대답을 저지르기 전에 어떤 지점에도 있지 않다는 것을 알게 될 것이라고 믿는다.
Erik B

49
당신은 놀랄 것입니다.
Eric

@ ErikB 나는 지점에없는 것과 같은 것이조차조차 알지 못했습니다. 이 답변은 저에게 매우 도움이되었습니다.
Konstantin Schubert

2
멋진 대답, 실제로는 단지 그것을 입력하고 다른 자식 초급으로 발생하는 거의 모든 달리 일 - A는 해시 커밋 당신은 대체 수 없습니다 newbranch는 arbritrary 이름임을 지적하고 좋아하고 있습니다
토니 리

22
git checkout master

결과는 다음과 같습니다.

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

이제 해봅시다 :

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

나는 그것을 시도하지 않았지만 그것이 잘 작동하는 것처럼 보입니다. 당신이 실행한다면 같아요 git gc당신이 그 커밋을 잃게 두 명령을 실행 사이,하지만 당신은 실행하지 않는 한 git gc자동으로는 상당히 자유로운 접근 위험을 감수해야한다. 나는 여전히 babay의 대답을 따를 것입니다.하지만 두 개의 추가 명령을 작성하지 않고 저장하려면이 방법이 필요합니다.
Erik B

나는 어느 시점에서 마스터 지점을 떠 났는데, 나는 확실하지 않다. 변경 사항을 커밋했지만 마스터에는 변경 사항이 없습니다. 이 지침은 마스터 브랜치에 대한 변경 사항을 가져 왔으며 모든 것이 좋습니다.
Matti Jokipii

+1 커밋을 남겨두고 다른 지점을 체크 아웃하는 것에 대해 긴장했습니다.
J-Dizzle

11

여기 다른 길을 떠나

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB 그는 여러 번 커밋했을 수 있습니다. 이 경우 babay의 답변을 참조하십시오.
Benjamin Oakes

@BenjaminOakes 그럴 수도 있지만 이러한 git 명령은 유효하지 않습니다.
Erik B

@ErikB 확실히 맞습니다. :) babay의 대답은 Alex가 시도한 것의 유효한 형태입니다.
Benjamin Oakes

9

또는 기본 분리 된 헤드 상태가 아닌 분기를 체크 아웃하도록 서브 모듈을 설정할 수 있습니다.

추가하기 위해 편집 :

한 가지 방법은 -b 플래그와 함께 서브 모듈을 추가 할 때 서브 모듈의 특정 분기를 체크 아웃하는 것입니다.

git submodule add -b master <remote-repo> <path-to-add-it-to>

또 다른 방법은 하위 모듈 디렉토리로 가서 체크 아웃하는 것입니다.

git checkout master

1
어떻게하는지 말해 줄래?
Erik B

기존의 하위 모듈을이 기본 분기 모드로 업데이트하는 방법이 있습니까? gitmodules아마도 업데이트 ?
Hertzel Guinness

@HertzelGuinness 실제로는 아닙니다. 서브 커밋은 특정 커밋 샤에서 체크 아웃됩니다. 브랜치는 sha와 sha에 대한 포인터 일 뿐이며 변경할 수 있습니다. 이것은 체크 아웃 된 서브 모듈의 상태를 고정시키지 않기 때문에 유용하지 않습니다. 하위 모듈을 변경하는 경우 지점을 체크 아웃하는 것이 편리합니다.
Abizern

5

이 상황에서 끝나는 한 가지 방법은 원격 지점에서 리베이스를 수행 한 후입니다. 이 경우 새로운 커밋은 가리 키지 HEADmaster가리 키지 않습니다. 다른 브랜치를 리베이스하기 전의 위치를 ​​가리 킵니다.

다음 master을 수행 하여이 커밋을 새로 만들 수 있습니다 .

git branch -f master HEAD
git checkout master

이 설정은 강제로 업데이트 master하고 HEAD(켜지 않은 상태 master)로 전환됩니다 master.


필요에 따라 완벽하게 작동했습니다. 이미 파일을 준비하고 커밋했지만 위의 오류로 인해 밀어 넣을 수 없습니다. 위의 두 줄의 코드는 완벽하게 작동했으며 예상대로 코드를 푸시했습니다.
invinciblemuffi

4

최근 에이 문제가 다시 발생했습니다. 마지막으로 서브 모듈을 다루고 git에 대해 더 많이 알게 된 지 오래되었습니다. 커밋하려는 브랜치를 체크 아웃하는 것으로 충분하다는 것을 깨달았습니다. Git은 작업 트리를 숨기지 않아도 유지합니다.

git checkout existing_branch_name

새로운 지점에서 일하고 싶다면 다음과 같이하십시오.

git checkout -b new_branch_name

작업 트리에 충돌이 있으면 체크 아웃이 실패하지만 매우 드문 일이며 발생하면 숨기고 팝업하여 충돌을 해결할 수 있습니다.

수락 된 답변과 비교 하여이 답변은 어쨌든 실행하는 데 오래 걸리지 않는 두 명령의 실행을 절약합니다. 그러므로 나는 현재 받아 들여진 답보다 기적적으로 더 많은 찬사를 받거나 (또는 ​​적어도 가까운)이 대답을 받아들이지 않을 것이다.


2

다음 방법이 효과적 일 수 있습니다.

git rebase HEAD master
git checkout master

이렇게하면 현재 HEAD 변경 사항이 마스터 위에 리베이스됩니다. 그런 다음 지점을 전환 할 수 있습니다.


다른 방법은 지점을 먼저 체크 아웃하는 것입니다.

git checkout master

그런 다음 Git은 분리 된 커밋의 SHA1을 표시해야합니다. 예를 들어 체리를 선택할 수 있습니다.

git cherry-pick YOURSHA1

또는 최신 것을 병합 할 수도 있습니다.

git merge YOURSHA1

서로 다른 브랜치에서 커밋을 모두 보려면 (이를 확인하십시오) git reflog.


0

나는 2012 년에 babay에게 누군가가 지점에 있지 않고 커밋하지 않았다는 사실을 알지 못할 것이라고 생각했다는 것을 알고 있습니다. 이것은 단지 나에게 일어난 일이므로, 내가 틀렸다는 것을 인정해야한다고 생각하지만, 이것이 나에게 일어나기까지 2016 년이 걸렸다는 것을 고려할 때 실제로는 그렇지 않을 것이라고 주장 할 수 있습니다.

어쨌든, 새로운 지사를 만드는 것은 제 생각에는 지나치지 않습니다. 당신이해야 할 일은 :

git checkout some-branch
git merge commit-sha

다른 브랜치를 체크 아웃하기 전에 커밋을 복사하지 않은 경우 다음을 실행하여 쉽게 찾을 수 있습니다.

git reflog

한 사람에게는 드물게 발생하는 문제입니다. 2012 년 이후로 이런 일이 발생하지 않았습니다. 그러나 만약 git-users의 기회를 곱하면 ... 가능성이 높습니다. 매일 누군가에게 일어날 수 있습니다. :)
babay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.