작업 복사본을 특정 Git 커밋으로 임시 전환


248

특정 Git 커밋으로 전환 한 후 커밋을 모두 잃지 않고 어떻게합니까?

로컬 파일을 변경하고 싶지만 커밋 데이터베이스는 그대로 유지되며 현재 위치 포인터 만 현재 선택된 커밋으로 설정됩니다.

파일 상태를 특정 커밋으로 변경하고 프로젝트를 실행하고 완료되면 파일을 마지막 커밋으로 다시 복원하고 싶습니다.

전체 프로젝트 폴더를 압축하지 않고이 작업을 수행하는 방법은 무엇입니까?


답변:


344

당신이 특정 지점에 있다면 mybranch, 그냥 가십시오 git checkout commit_hash. 그런 다음로 지점으로 돌아갈 수 있습니다 git checkout mybranch. 나는 벌레 bisect 에 대해 알아야한다 .


6
git checkout commit_hash깨끗한 저장소에 있고 분기를 수행 할 필요가없는 경우 에만 수행 할 수 있습니다 . 일부 유스 케이스 (예 : 광산)에서 더 쉬울 수 있습니다.
enderland

@enderland : 당신의 머리는 항상 : 일반적으로, 어떤 지점에서 포인트
알렉산더 파블로프에게

부분 커밋 해시가 허용되지 않기 때문에 커밋 해시 전체를 사용해야하는 문제가 있습니다.
mightyiam

6
git bisect참조를 위한 공감 ; 정말 유용한 도구입니다!
Niek

54

먼저, git log로그를보고 원하는 커밋을 선택하고 커밋을 식별하는 데 사용되는 sha1 해시를 적어 둡니다. 그런 다음을 실행하십시오 git checkout hash. 완료되면 git checkout original_branch. 이것은 HEAD를 이동하지 않는 이점이 있으며 작업 사본을 특정 커밋으로 전환하기 만합니다.


4
나는 당신이 의미하는 것 같아요 git checkout <original_branch>. git checkout HEAD효과적으로 NOOP입니다
Abe Voelker

3
git reset --hard <hash>분기를 git checkout <hash>변경하지 않는 분리 된 체크 아웃을 얻는 동안 현재 분기의 헤드를 변경 하고이 답변에 표시된 것처럼 분기의 원래 해시 ID를 몰라도 쉽게 반환 할 수 있습니다.
jofel

@Femaref 초보자의 질문 :이 질문의 맥락에서 (이전 커밋으로 일시적으로 전환) 왜 HEAD를 움직이거나 움직이지 않는 것이 유리한지 또는 단점입니까?
natty에 대해 nutty

@nuttyaboutnatty 내 편집이 승인되었다고 가정하면 질문에 대한 답변이 될 것입니다. HEAD는 실제로 어떤 이벤트에서도 움직입니다. 그러나 체크 아웃시 분기 참조 HEAD는 자체적으로 이동되지 않습니다.
echristopherson

15

여기에있는 다른 답변 외에도 git checkout <the-hash-you-want>사용 위치로 다시 전환 할 수 있다는 것을 아는 방법이 나와 있습니다.

git checkout @{-1}

이것은 종종 다음보다 편리합니다.

git checkout what-was-that-original-branch-called-again-question-mark

예상 한대로 git checkout @{-2}2 git checkout초 전의 지점으로 다시 연결되며 다른 번호도 마찬가지입니다. 더 큰 숫자의 위치를 ​​기억할 수 있다면 어떤 종류의 메달을 받아야합니다.


슬프게도 생산성 git checkout @{1}을 위해, 당신이 앞으로 나올 지점으로 당신을 데려 가지 않습니다.


1
참고 git checkout -를위한 속기 별명이다git checkout @{-1}
나다나엘

@Nathanael OMGOD , 안돼 ... 이것은 모든 것을 바꾼다! 감사합니다! … 나는 이것을 대답에 포함시킬 것이지만 @{n}, 많은 git 명령과 작동 하므로 일반적인 구문 에 대해 아는 것이 유용하다고 생각 합니다. 대답을 혼란스럽게하지 않고 속기를 추가하는 것이 어렵다는 것을 알았습니다. 대신 나는 당신의 의견을 표명했습니다 – 나는 사람들이 그것을보기를 바랍니다. 다시 감사합니다.
Benjohn

1
문제 없어요. 이 논의는 어쨌든 실제 질문에 접합니다. 더 많은 보너스! 필자는 종종 기능을 릴리스로 병합하기 위해 동일한 구문을 사용합니다. 예 git merge -를 들어 , 최근에 체크 아웃 한 지점을 현재 체크 아웃 한 지점으로 병합합니다. cd -bash 와 같습니다 .
나다나엘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.