2009-05-11 4 views
21

내가하고 싶은 공통점은 작업 복사본을 특정 수정본으로 되돌리고 몇 가지 테스트를 수행 한 다음 다시 현재 현재 마스터의 헤드로 가져 오는 것입니다. 과거에는 순진하게 "git checkout hash"를 사용하여 머리를 잃었습니다. 이후에 브랜치를 생성하고이를 체크하고, 브랜치를 되돌리고, 지울 수 있다는 것을 배웠지 만, 간단한 체크를하기에는 너무 많은 단계가 있다고 느꼈다. SVN 말투에서 신속하게 되돌릴 수있는 방법은 거기에 신속하게 다시 자식의 트렁크의 팁으로 돌아갈 수 있습니까?특정 git 리비전을 체크 아웃하려면 분기를 만들어야합니까?

편집 : 내 혼란 내가 해시하고 자식 로그를 체크 아웃 할 때, 나는 (체크 아웃 해시 후 일어난 변화를 보이지 않는 사실에서 유래 생각 당신이 생각할 때, 합리적이다 그것). 그러나 받아 들여진 대답은 정확합니다. "git checkout branch"는 헤드를 이전 브랜치로 복원합니다.

+0

당신은 "내 머리를 잃을"명확하게 할 수 .... 당신이 원하는 상태에서 작업 파일의 일부를 유지하는 당신은 아마하고 싶은 다른 일이있을 것인가? 나에게는 잃어버린 것이 하나도없는 것 같습니다. – Wok

답변

27

당신이 당신이에 작업 한 토픽 브랜치에서 벗어나게됩니다 (당신은 항상 유지하려는 변경해야하는), 당신은 단지

git checkout <revision to check out> 
을 할 수있는 지점에 이미있어 가정 (분기 없음). 작업 사본은 정상적으로 분기 이름이 아닌 커밋 ID를 직접 참조합니다.

그리고 간단하게 다시 이동합니다 :

git checkout <old branch name> 

그것을 생각하는 유용한 방법이 있습니다 : 지점을 변경하지 자식 체크 아웃; 그것은 작업 복사본이 현재보고있는 (즉, HEAD) 분기를 변경하는 것입니다 (이 경우 분기가 분기를 업데이트 할 것임) 또는 임의의 커밋 해시 일 수 있습니다.

이와 같이, 유지하려는 변경 사항이 지점에있는 경우 git checkout을 잃어 버릴 염려가 없습니다.당신은 특정에 지점을 만들 수 있습니다

+0

+1 작업 복사본에 대한 설명은 임의의 커밋 해시를 가리 킵니다 –

+0

'분기'라고 부르는 것에 '마스터'가 포함되어 있습니까? – Wok

+1

@wok : 예. 마스터에 관해 특별한 것은 없습니다. – bdonlan

3

일부 변경 사항의 팁을 Git에 표시하려면 분기 또는 태그가 필요합니다. 그러나 당신이 가지를 만들지 않는다 할지라도 커밋 중 어느 것도 잃지 않습니다. 저장소 내에서 가비지 노드로 유지되며 (즉, 모든 분기 나 태그를 통해 접근 할 수 없음) "git gc"할 때 며칠/몇 주 후에 만 ​​제거됩니다.

변경 사항에 쉽게 액세스하려면 임시 분기를 만들고 거기에서 작업하는 것이 가장 좋습니다. 브랜치 외부에서 커밋 한 다음 다른 브랜치를 체크 아웃하는 경우 "git reflog"명령을 사용하거나 로그 (".git/logs"디렉토리)를 조사하여 변경 사항의 해시가 무엇인지 알아야합니다. 너 잃어 버렸어. 해시를 알고 있으면 "git checkout hash"또는 "git checkout -b new_branch hash"를 수행하고 팁을 복구 할 수 있습니다.

+0

"변경 사항의 일부를 보여주십시오"에서 "쇼"란 무엇을 의미합니까? 내가 (IMO) 자연스러운 일과 "해쉬 체크 아웃"을하면 나는 내가 어디에 있었는지 해시를 알지 않고 (어떻게 든) 어디로 돌아갈 수있는 방법이 없다는 것을 알게된다. – Nick

+0

Git이 몇 가지 변경 사항을 보여줌으로써 "git branch", "git tag"또는 "gitk --all"과 같은 명령으로 볼 수 있음을 의미합니다. 당신은 "내가 어디에 있었는지 해시를 알고있다"는 의미인가요? 당신이 지사 밖에서 일하는 것을 말합니까? 당신은 당신이 있던 곳에있는 지점을 알기로되어있는 해시를 알기로되어 있지 않습니다. –

4

예, 설명대로 "git checkout"을 사용하여 임의의 개정판을 방문 할 수 있습니다. 브랜치가 아닌 임의의 리비전을 요청하면 git은 변경 사항을 추적 할 분명한 방법이 없습니다. reflog ("git reflog show")를 참조하여 이전의 위치를 ​​볼 수 있지만 일반적으로 지점에 있었기 때문에 "git checkout master"또는 이와 유사한 것으로 다시 변경하려는 것입니다.

이 방법은 작업 공간의 커밋되지 않은 변경 사항을 자동으로 처리하지 않습니다. 분기간에 이동하기 전에 변경 사항을 커밋하거나 숨기거나 "git checkout -m"을 사용하여 이동할 때 수행중인 변경 사항이 사소하지 않은 경우 병합 충돌을 처리 할 준비가되어 있어야합니다.

최근의 자식 버전은 "내가 마지막으로 이동하기 전의 위치"에 대해 "@ {- 1}"이라는 약식을 도입했다고 생각합니다.이 경우 실제로 원하는 것일 수 있습니다. (필자는 사용하지 않았으며 릴리스 노트에서 읽었습니다.)

+1

"지점이 아닌 임의의 개정판을 요청하면 변경 사항을 적용 할 수 없습니다." - 너 * 할 수있어. "(git branch"에 표시된 것처럼) "(no branch)"에 대해 작업 할 것입니다. 그래서 다른 branch를 체크 아웃 한 후에 커밋을 찾는 것은 어렵습니다. 커밋의 해쉬를 적어 두거나 로그. –

+0

네, 좋은 지적입니다; 나는 그것을 먼저 시도하지 않았다는 것을 인정한다. – araqnid

+0

git 확장을 사용하는 경우, 분기에 있지 않은 경우 체크 아웃하거나 브랜치를 만들 것인지 묻는 메시지가 표시됩니다. 하지만 git 확장은 저와 같은 초보자에게는 위험 할 수 있습니다. 지금은 개정판 vs 분기를 확인하는 중요성을 얻고 있기 때문입니다. – Chance

6

당신은 당신이 새로운 지점 <branchname>에서 시작하려는

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] 

이 때문에 SHA1로 <start-point>를 입력 (매뉴얼 페이지에서) 을 체크 아웃 할 커밋 당신은 확장 지점에서 분리 된 '머리'를 얻지 못할 것입니다.

관련 문제