'git reset'을 취소하는 방법?


1312

실행을 취소하는 가장 간단한 방법은 무엇입니까

git reset HEAD~

명령? 현재 내가 생각할 수있는 유일한 방법은 원격 저장소에서 "git clone http : // ..."를 수행하는 것입니다.


2
누구든지 하드 리셋을 취소하는 방법을 찾고 있다면 git reset --hard HEAD ~ 1 실행 취소를 확인하십시오 . 솔루션은 매우 유사합니다.


2
관련된 질문과 중복되지 않습니다 --hard! 실수로이 명령을 실행할 위험이 훨씬 높습니다. 예를 들어을 사용하여 단일 파일의 스테이지를 해제하려고합니다 git reset foo-file. 파일 이름의 첫 부분 만 작성하고 자동 완성을 위해 탭을 누르십시오. 실제로 지사 이름으로 완료되며 알지 못하고 git reset foo-branch대신 명령을 실행합니다 . Voilà
Yushin Washio

답변:


2388

짧은 답변:

git reset 'HEAD@{1}'

긴 대답 :

Git은 모든 참조 업데이트 (예 : 체크 아웃, 재설정, 커밋, 병합)를 기록합니다. 다음을 입력하여 볼 수 있습니다.

git reflog

이 목록 어딘가에 당신이 잃어버린 커밋이 있습니다. 방금 입력 git reset HEAD~하여 실행 취소하고 싶다고 가정 해 보겠습니다 . 내 Reflog는 다음과 같습니다.

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

첫 번째 줄은 HEAD0 위치 전 (즉, 현재 위치)이 3f6db14이고; 로 재설정하여 얻었습니다 HEAD~. 두 번째 줄은 HEAD1 위치 전 (즉, 재설정 전 상태)이 d27924e라고 말합니다. 특정 커밋을 확인하여 얻었습니다 (현재 중요하지는 않지만). 따라서 재설정을 취소하려면 git reset HEAD@{1}(또는 git reset d27924e) 를 실행하십시오 .

반면에 HEAD를 업데이트 한 이후로 다른 명령을 실행 한 경우 원하는 커밋이 목록의 맨 위에 있지 않으므로을 (를) 검색해야합니다 reflog.

마지막 참고 사항 : reflog재설정하지 않으려는 특정 지점에 대한 마스터 를 보는 것이 더 쉽습니다 HEAD.

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

이것은 일반적인 것보다 잡음이 적어야합니다 HEAD reflog.


25
reflog이 목적 을보다 시각적이고 더 좋은 대안 으로 사용하고 싶습니다 git log --graph --decorate --oneline $(git rev-list -g --all). 이름없는 브랜치를 매달려있는 것을 포함하여 모든 커밋의 트리를 보여줍니다
texasflood

1
기존 파일이 들어있는 디렉토리가 있다고 가정 해 봅시다. 이 디렉토리에서 나는 실행 git init하고 그 직후에 git reset --hard. 리플 로그 또는 시작될 로그가 없습니다. 이 파일들은 지금 꽤 많이 토스트 되었습니까?
AlanSE

@AlanSE, 슬프게도 내가 아는 한 그 파일은 토스트입니다. 작업을 완료하지 않은 경우 git add, 다음 (즉 파일의 버전을 개최 적이없는) git checkout또는 git reset --hard(가)없이 단지 백업 (작업 디렉토리)에 복사 날려 것이다. 나는 그것을하지 않았 으면 좋겠다.
Mark Lodato

2
git reset HEAD~12죄송합니다 ... git reset HEAD@{12}nooo .. 'git reflog'를 구출하십시오! 아, 그냥git reset HEAD@{1}
데니스

훌륭한 git-scm.com/blog/2011/07/11/reset.html git-reset 기사를 읽은 후 조금 덜 신비합니다.
Andriy Drozdyuk 2016 년

192

오래된 질문과 게시 된 답변이 훌륭합니다. 그래도 다른 옵션으로 차임 할 것입니다.

git reset ORIG_HEAD

ORIG_HEADHEAD이전에 참조한 커밋을 참조합니다.


1
이것은 대단해 보입니다 – 정교하게 만들 수 있습니까? 여기서 "ORIG"는 "original"또는 "origin"의 줄임말입니까? … 즉, 원숭이와 함께 원숭이를 시작하기 전에 HEAD가 있던 위치로 재설정됩니까? 아니면 HEAD가 어디에서 왔습니까? git reset ORIG_HEAD? 전에 여러 번 HEAD를 이동 한 경우 어떻게됩니까 ? 감사.
Benjohn

ORIG는 오리지널을 나타내고 ORIG_HEAD는 리셋하기 전에 오리지널 헤드를 의미합니다
Sam Gallagher

"병합 및 재설정과 같은 특정 작업은 새 값으로 조정하기 직전에 이전 버전의 HEAD를 ORIG_HEAD에 기록합니다. ORIG_HEAD를 사용하여 이전 상태로 복구 또는 되돌 리거나 비교할 수 있습니다." 책에서 발췌 : "Git을 사용한 버전 제어"
Amirreza

56

제 상황은 약간 달랐 git reset HEAD~습니다.

그것을 취소하려면 내가해야했다

git reset HEAD@{3}

그래서 당신은 할 수 있어야합니다

git reset HEAD@{N}

그러나 git reset을 사용하여

git reset HEAD~3

당신은해야 할 것입니다

git reset HEAD@{1}

{N}은 Reflog의 작업 수를 나타냅니다. Mark가 의견에서 지적한 것처럼.


2
받아 들여진 옵션은 앞으로 나아갈 예제를 제공하지 않습니다. 한 시간 전에 NI가 1보다 더 많은 것을 전달하고 싶었던 상황이었습니다. 여기에 추가하고 싶었습니다. 자식 리셋 HEAD ~ 3 취소 리셋을 찾는 사람들을 위해 도움이 될 것입니다
zainengineer

3
몇 가지 중 하나가 완료 자식 리셋 HEAD ~ 3이있는 경우 그러나 그는 신속하게 실행 취소, 자식 리셋 HEAD하는 방법을 볼 수 있습니다 @ {3} reflog 자식 리셋 HEAD로 이동하지 않고 필요 ~ 3 등은 일반적인 상황입니다
zainengineer

1
{1} / {2}를 보는 사람은 번호가 reflog명령이 제공 하는 모든 개정 번호 일 수 있음을 알 것입니다. ~ 3 / @ {3} 방향에서 숫자가 동일하다는 점에 동의했지만 실제로는 새로운 대답 일 필요는 없습니다.
클린트

30

1. git reflog모든 참조를 업데이트하는 데 사용합니다.

2.git reset <id_of_commit_to_which_you_want_restore>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.