git reset --hard에서 복구?


457

?에서 작업 디렉토리에 대한 커밋되지 않은 변경 사항을 복구 할 수있는 방법이 git reset --hard HEAD있습니까?


49
unlearning을 추천 git reset합니다. 해당 명령이 필요하지 않으며 위험하므로 사용하지 마십시오. 분기를 이전 커밋으로 되돌리고 git rebase -i원하지 않는 커밋을 삭제하거나 git checkout(머리를 분리) git branch -M분기 팁을 이동하십시오. 첫 번째는 로컬 변경으로 실행을 거부하고 나중에는 로컬로 수정 된 파일이 수정본간에 다르지 않은 경우에만 실행됩니다.
Jan Hudec

11
@ 1 월 나는 그것을 믿지 않는다. 재설정을 사용해야하는 정당한 이유가 있습니다.
spaaarky21

4
@ spaaarky21 : 그렇습니다. 그러나 git reset --hard somewhere실제로 위험한 git 명령 중 하나입니다.
Jan Hudec 2013

5
@Jan 동의하지만 위험하다고해서 사용해서는 안됩니다. 하고있는 일을 알고 조심하십시오. :)
spaaarky21

3
원래 포스터가 커밋되지 않은 변경 사항을 복구하려고하기 때문에 git reset --hard HEAD ~ 1 실행 취소 와 관련이 없습니다 .

답변:


475

당신은 할 수 일반적으로 커밋되지 않은 변경 내용을 다시 얻을.

이전에 준비된 변경 사항 ( git add)은 인덱스 객체에서 복구 할 수 있어야하므로 git fsck --lost-found관련 개체를 찾는 데 사용 하십시오. (이것은 객체를 .git/lost-found/디렉토리에 씁니다 . 거기 git show <filename>에서 각 파일의 내용을 볼 수 있습니다 .)

그렇지 않은 경우 여기에 대한 대답은 백업을보십시오. 아마도 편집기 / IDE는 임시 사본 을 / tmp 또는 C : \ TEMP 아래에 저장 합니다. [1]

git reset HEAD@{1}

이것은 이전 HEAD로 복원됩니다

[1] vim은 예를 들어 선택적으로 영구 실행 취소를 저장하고 Eclipse IDE는 로컬 히스토리를 저장합니다 . 이러한 기능을 사용하면 a **


18
Eclipse의 로컬 히스토리-또한 일부 변경 사항이 6 일보다 오래되었으므로 Eclipse 로컬 히스토리의 Time Machine 백업! 어떤 이유로 git에서 관리하는 폴더의 Time Machine 백업에 이전 변경 사항이 포함되어 있지 않습니다.
christianbrodbeck

2
당신은 힌트에 대한 생명의 은인입니다! TextWrangler에는 파일 백업이있었습니다. 감사합니다
Vivek Sampara

6
IDE (IntelliJ)는 하루를 저장 한 변경 사항을 로컬에 저장했습니다. 팁 고마워!
progonkpa 2016 년

1
와우 이거 놀랍습니다. 커밋하지 않은 경우에도 작동합니다.
Boudewijn Aasman 님이

2
IntelliJ를 여기 unstrage 변경, 문서를 복구하는 내 일 저장 (내 경우에는 인 IntelliJ) Eclipse에서 실제로 지역의 역사 : blog.jetbrains.com/idea/2008/01/...
리처드

448

이에서 답변 SO

$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

당신은 하루를 되찾았습니다! :)


24
이 답변에 추가하기 만하면 실제로 재설정을 통해 버린 변경 사항을 커밋 한 사람들에게 도움이됩니다.
murki

9
훌륭하지만 내 경우에는 파일이 완전히 사라졌습니다. 를 사용 git checkout HEAD@{19}하면 분리 된 상태에서 손실 된 파일을 확인할 수 있습니다. 그런 다음 git checkout -b new-branch-name"연결된"상태로 저장소에 다시 추가하는 데 사용 됩니다.
NightOwl888

@ NightOwl888 : 여기 Git 초보자가 있는데 파일이 여전히 사라 졌다는 동일한 문제가있었습니다. 파일을 "첨부 된"상태로 복구하는 방법을 자세히 설명 할 수 있습니까 (또는 실제로 의미하는 바를 설명 할 수 있습니까)? 정말 고맙습니다!
OhDaeSu

3
@ user3385759-Git에서 분기가 아닌 항목에 대해 checkout 명령을 사용하면 특수 "분리 헤드"모드가됩니다. 이것은 실제로 지점을 가리키고 있지 않지만 엔티티 상태에서 체크인 된 항목 (이 경우에는 참조 로그 항목)을 볼 수 있음을 의미합니다. 이 상태에서를 사용하여 다시 실제 지점으로 바꿀 수 있습니다 git checkout -b new-branch-name. Git을 사용하는 Pragmatic Version Control 책 은 Git을 간단한 용어로 설명하는 데 능숙합니다.
NightOwl888

2
네, NomNomCameron과 Jesse Adelman의 말입니다. 재설정이 마지막 커밋으로 재설정 될 것이라고 잘못 생각했습니다. 아니. 모든 것을 지 웠습니다. 이 답변으로 하루나 이틀 내 작품을 다시 만들 수있었습니다.
VeteranCoder

308

git reset --hard오늘도 커밋되지 않은 변경 사항을 적용하면서 실수로 오늘 리포지토리를 실행 했습니다. 그것을 다시 얻기 위해, 나는 git fsck --lost-found참조되지 않은 모든 blob을 썼습니다 <path to repo>/.git/lost-found/. 파일이 커밋되지 않았기 때문에의 other디렉토리에 있습니다 <path to repo>/.git/lost-found/. 여기에서를 사용하여 커밋되지 않은 파일을 확인 git show <filename>하고 블롭을 복사 한 다음 이름을 바꿀 수 있습니다.

참고 :이 기능은 색인에 저장하려는 파일을 추가 한 경우에만 작동합니다 (을 사용하여 git add .). 파일이 색인에 없으면 손실됩니다.


4
에 커밋 참조가있는 파일 만 있습니다 lost-found. 그러나 나는 git show내용을 얻기 위해 할 수 있었다 .
Mitar

6
그냥 시간을 절약하기 위해#!/bin/bash cd PATH_TO_PROJECT/.git/lost-found/other FILES=* COUNTER = 0 for f in $FILES do echo "Processing $f file..." git show $f > "PATH_TO_RECOVERY_DIRECTORY/$COUNTER.m" let COUNTER=COUNTER+1 done
rwolst

209

예, git 의 하드 리셋 에서 복구 할 수 있습니다 .

사용하다:

git reflog

커밋의 식별자를 가져옵니다. 그런 다음 사용하십시오.

git reset --hard <commit-id-retrieved-using-reflog>

이 속임수는 내 인생을 두 번 구했습니다.

reflog 문서는 여기에서 찾을 수 있습니다 .


9
지금까지 이것이 최선의 간결한 답변이라고 생각합니다. git reset --hard다른 것을 사용하여 복구하는 것은 반 직관적 인 것처럼 보이지만 스위치를 git reset --hard사용하지 않으면 --hard작업 공간에 항목이 남아있어 방금 복구 한 작업을 효과적으로 되돌릴 수 있습니다.
Ryan H.

2
매력처럼 작동합니다! 이전 답변 ( stackoverflow.com/questions/5788037/recover-from-git-reset-hard/… )이 작동하지 않았습니다.
codemax

3
이 답변은 정확하지 않습니다. 이 방법은 이전에 커밋 된 변경 사항 만 복구합니다 . 커밋되지 않은 변경 사항 을 복원 할 수 없습니다 (이 질문에 관한 것입니다).
Alderath

2
이 솔루션은 저에게 효과적입니다. 나는 열심히 재설정 한 다음 사용했을 때 git log커밋의 ID를 보지 못했습니다. 함께 git reflog내가 볼 수는 ID 커밋
dboscanv

2
이것은 나를 위해 작동합니다. 감사!!!!!!
RedEyed

60

로컬 프로젝트를 진행하는 동안 GitHub로 옮기고 새로운 리포지토리를 만들고 싶었습니다. gitgitore를 사용하여 이러한 모든 파일을 새 저장소에 추가하려고 시도하는 중에 실수로 잘못된 파일을 추가 한 후 지우려고했습니다.

나는 달렸다 git reset --hard origin/master : P

그런 다음 저장소가 비어 있기 때문에 모든 로컬 파일이 삭제되었습니다. 나는 모든 것이 사라 졌다고 생각했다.

이것은 내 생명을 구했습니다 :

git reflog show
git reset HEAD@{1} 
git push 

그것이 다른 생명을 구하기를 바랍니다.


나를 위해, 그것은 git reset HEAD@\{27\} 감사합니다!
4oby

1
난 7 커밋을 재설정하고, 내가 git reflog show확인하고 사용 하는 첫 번째 커밋에서git reset HEAD@{number}
Vishwas Nahar

38

IntelliJ와 같은 것을 사용하는 경우 :

상황에 맞는 메뉴에서 로컬 기록을 선택하고 하위 메뉴에서 기록 표시를 클릭하십시오.

프로젝트 또는 폴더의 로컬 히스토리보기에는 지난 며칠 동안 수행 한 모든 것이 표시됩니다. 대화 상자 아래쪽의 동작 열에서 롤백 할 동작을 선택합니다. [...] 이렇게하면 대화 상자의 상단에 변경된 파일의 트리보기가 표시됩니다. 이후에 수행 된 다른 변경 사항에 관계없이 삭제 된 파일 만 복원하려면 트리보기에서 Lost.txt 파일을 선택하고 되돌리기 버튼을 클릭하십시오.

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

방금 내 엉덩이에 불이 났어!


이것은 IntelliJ 사용자에게 가장 적합한 답변입니다! 정말 고마워요, 완벽하게 작동했습니다. 나는 다른 모든 솔루션을 시도했지만 그중 아무것도 잘 작동하지 않았습니다. git reflog변경 사항을 커밋하지 않아 작동하지 않았습니다. git fsck --lost-found준비된 파일에서 작동했지만 모두 준비된 것은 아닙니다. IntelliJ의 로컬 히스토리는 저장되지 않은 파일을 완벽하게 복구했습니다.이 기능에 매우 감사합니다
Denes Papp

30

난 그냥 한 git reset --hard내 모든 커밋되지 않은 변경을 잃었다. 운 좋게도 편집기 (IntelliJ)를 사용하고 로컬 히스토리에서 변경 사항을 복구 할 수있었습니다. Eclipse는 동일한 작업을 수행 할 수 있어야합니다.


20

정의에 따라 git reset --hard 에 따라 Git이 복구 할 수있는 방법없이 커밋되지 않은 변경 사항을 버립니다 (백업 시스템은 도움이 될 수 있지만 Git은 도움이되지 않음).

실제로 git reset --hard좋은 아이디어가있는 경우는 거의 없습니다 . 대부분의 경우 동일한 작업을 수행하는 더 안전한 명령이 있습니다.

  • 커밋되지 않은 변경 사항을 삭제하려면을 사용하십시오 git stash. 이 변경 사항의 백업을 유지하며 실행하면 일정 시간이 지나면 만료됩니다 git gc. 99.9 % 확신 할 경우 이러한 변경 사항이 다시는 필요하지 않으며 git stash여전히 0.1 % 사례의 친구입니다. 100 % 확실하다면 100 % git stash측정 오류가 있기 때문에 여전히 친구입니다. ;-).

  • 당신 HEAD과 역사의 현재 지점의 끝 을 움직이고 싶다면 git reset --keep친구입니다. 와 같은 작업을 수행 git reset --hard하지만 로컬 변경 사항 은 삭제 하지 않습니다 .

  • 둘 다하고 싶다면 git stash && git reset --keep친구입니다.

손가락을 사용하지 말라고 가르치면 git reset --hard하루를 상환합니다.


그렇다면 그것이 git stash && git reset --hard숨겨둔 내용을 지우는 것이 맞습니까?
jxramos

1
아니요, git reset --hard숨김을 버리지 않습니다. git stash작업 트리 git reset --hard에서 커밋되지 않은 변경 사항을 영구적으로 버리지 않고 안전하게 유지한다는 점을 제외하고 작업 트리에서 변경 사항을 제거한다는 의미에서 대체입니다 .
Matthieu Moy

또는 하드 리셋하기 전에 변경 사항을 커밋해도 여전히 로컬
리포지토리

11

실수로 커밋을 재설정 한 경우이 작업을 수행하십시오.

git reflog show
git reset HEAD@{2} // i.e where HEAD used to be two moves ago - may be different for your case

가정하고 HEAD@{2}싶은 상태는


나를 위해이 가공 한 완벽한 당신은, PowerShell을 이렇게이 자식 리셋처럼 쓸 수 있는지 확인하는 경우 'HEAD @ {2}', 그렇지 않으면 작동하지 않습니다 PowerShell에서
VectorX

10

이것이 내가 약간의 변화를 잃을 때 내가 일반적으로하는 일입니다.

git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

포인터를 이전 커밋으로 다시 이동하지만 최신 커밋 확인에서 지금까지 변경 한 내용은 유지 git reset --soft dadada


8

정보가 손실됩니다.

커밋하지 않았으므로 .git 은이 정보를 저장하지 않았습니다. 따라서 기본적으로 git복구 할 수 없습니다.

그러나 방금 수행 git diff한 경우 다음 3 가지 간단한 단계로 터미널 출력을 사용하여 복구 할 수있는 방법이 있습니다.

  1. 터미널을 스크롤하고의 o / p를 찾으십시오 git diff. diff.patch라는 파일에 o / p를 저장하십시오.
  2. 검색 및 7 개의 공백과 8 개의 공백을 모두 탭 (\ t) 문자로 바꾸고 변경 사항을 저장하십시오.
  3. 자식 저장소로 이동하십시오. diff.patch ( patch -p1 < diff.patch)를 적용하십시오

당신은 저장되었습니다! :)

참고 : 터미널에서 파일로 데이터를 복사하는 동안 데이터가 연속 출력이고 중복 데이터가 포함되어 있지 않은지 (위쪽 및 아래쪽 화살표로 인해)주의하고 명확하게 확인하십시오. 그렇지 않으면 엉망이 될 수 있습니다.


7

나는 같은 문제에 부딪 쳤고 거의 미쳤다. ... 처음에는 프로젝트를 커밋하고 병합했다 .. 나중에 실행하려고 할 git push --set-upstream origin master 때이 오류가 발생했습니다.

  fatal: refusing to merge unrelated histories

그래서 나는 달렸고 git reset --hard HEAD3 주 프로젝트를 삭제했지만 아래의 몇 가지 명령은 하루를 저장합니다.

git reset HEAD@{1}         //this command unstage changes after reset
git fsck --lost-found      //I got the dangling commit fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b
git show <dangling commit something like-> fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b>
git rebase fc3b6bee2bca5d8a7e16b6adaca6a76e620eca4b

도움이 되었기를 바랍니다


6

를 한 후에 커밋을 되돌릴 수 있습니다 reset --hard HEAD.

활용 "git reflog "를HEAD 하여 지점 의 기록을 확인하십시오 .

커밋과 ID가 여기에 표시됩니다.

git reset {commit Id of the commit you want to bring back}

5

운 좋게 다른 편집기 (예 : Sublime Text)에서 동일한 파일을 연 경우 해당 파일에 대해 ctrl-z를 시도하십시오. 방금 저를 구했습니다 ..


3

커밋되지 않은 파일 git reset --hard <commit>이 git history에서 제거되는 어려운 방법을 발견했습니다 . 그러나 머리카락을 뽑을 때마다 코드 편집기 세션을 열어 두는 것이 운이 좋았습니다 control + z. 영향을받는 각 파일의 간단한 것이 파일 상태를 Git 이전 버전으로 다시 반환 한다는 것을 알았습니다. 내가 구체적으로 요구하지 않은 모든 것을 의무적으로 재설정합니다.Hooray!!


3

아래 코드를 사용하려는 경우 :

git reflog show
# head to recover to
git reset HEAD@{1} 

그리고 어떤 이유로 인해지고 있습니다 :

오류 : 알 수없는 스위치`e '

그런 다음 HEAD@{1}따옴표로 묶어 보십시오

git reset 'HEAD@{1}'

3
 git reset HEAD@{4}

4는 4 단계 전에 변경되었습니다. 올바른 단계를 선택하면 하드에서 제거한 파일 목록이 표시됩니다. 그런 다음 수행하십시오.

$ git reflog show

이미 생성 한 로컬 커밋 기록을 보여줍니다. 지금 :

$ git reset --hard 8c4d112

8c4d112는 하드를 재설정하려는 코드입니다. 자세한 정보 는 https://www.theserverside.com/video/How-to-use-the-git-reset-hard-command-to-change-a-commit-history 를 참조하십시오.


@mohammad에게 감사드립니다. 소스 파일을 더 이상 볼 수 없지만 위의 단계를 수행하면 모든 소스 파일을 복구 할 수있었습니다.
Gaurav Bansal

2

올바른 답. 좋아, 이제 자식을 좋아한다. :-) 여기 간단한 레시피가 있습니다.

git log HEAD@{2}
git reset --hard  HEAD@{2}

여기서 "2"는 변경 사항을 커밋 한 위치의 수입니다. 필자의 경우, 빌드 문제를 디버그하기 위해 동료와 상사에 의해 중단되었습니다. 그래서 리셋을 두 번했습니다. 따라서 HEAD와 HEAD @ {1}은 (는) 덮어 쓰기되었습니다. 휴, 우리의 노력을 잃었을 것입니다.


2

내가 했어 git reset --hard 실수로 잘못된 프로젝트 (나는 ... 알고)에. 방금 하나의 파일로 작업했으며 명령을 실행하는 동안과 후에도 여전히 열려있었습니다.

비록 커밋하지 않았지만 simple로 이전 파일을 검색 할 수있었습니다 COMMAND + Z.


0

이 SO의 참고 답변

git reflog show를 실행 한 후 9300f9d를 커밋하려고한다고 말하십시오.

git reset 9300f9d를 실행 한 후

git status를 수행 한 다음 변경 사항을 복원하기 위해 파일을 체크 아웃해야 할 수도 있습니다

git checkout-파일 경로 / 이름


0

Netbeans에서 개발하는 경우 파일 탭과 파일 편집 영역 사이를 살펴보십시오. "소스"와 "기록"이 있습니다. "히스토리"에는 버전 제어 (git / other)를 사용하여 변경 한 내용과 로컬로 변경된 내용이 표시됩니다. 이 경우 로컬 변경으로 인해 저장 될 수 있습니다.


0

( 일부 사용자에게 적합한 답변 )

(최근의) macOS를 사용 중이고 Time Machine 디스크를 사용하지 않더라도 OS는 로컬 스냅 샷 이라는 시간별 백업을 저장합니다 .

Time Machine을 입력하고 손실 된 파일로 이동하십시오. 그런 다음 OS에서 다음을 묻습니다.

The location to which you're restoring "file.ext" already contains an
item with the same name. Do you want to replace it with the one you're
restoring?

잃어버린 파일을 복구 할 수 있어야합니다.


0

동일한 코드로 IDE를 연 경우 변경 한 각 개별 파일에 대해 ctrl + z를 수행하십시오. git reset --hard를 수행 한 후 커밋되지 않은 변경 사항을 복구하는 데 도움이되었습니다.


-3

git reset --hard를 수행하면 커밋되지 않은 모든 로컬 변경 사항이 삭제됩니다. 변경 사항을 복구하려면-IDE에서 파일을 클릭하고 파일을 로컬 기록과 비교하여 날짜별로 변경 사항을 나열하면 데이터를 복구 할 수 있습니다. 당신의 하루가 저장됩니다!


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