"git rm -r"을 되 돌리는 방법?


378

실수로 말했다 git rm -r .. 이것을 어떻게 복구합니까?

나는 커밋하지 않았다.

모든 파일이 삭제 표시되었으며 로컬 체크 아웃에서 물리적으로 제거 된 것 같습니다.

편집 : (명령을 알고 있다면) 마지막 커밋으로 되돌릴 수 있습니다. 하지만을 취소 할 수 있다면 훨씬 나을 것 git rm -r .입니다. 마지막 커밋 이후와 이전에 수행 한 작업이 확실하지 않기 때문 git rm -r .입니다.


3
이 특정 질문에 대해 reset --hard는 좋은 해결책입니다 ... 이미 나열되어 있으므로이 주석에서 git-reflog에 대한 설명서를 확인하고 싶을 것입니다.
William Pursell 5

8
참고 사용자가 제공하지 않았기 때문에 것을 -fgit rm자식 A가 있으므로 단계적 또는 unstaged 변경 한 모든 파일을 제거하지 않습니다 git reset; git checkout .모든 것을 회복해야합니다.
CB Bailey

git checkout을 조심하십시오. 스테이지되지 않은 모든 변경 사항이 지워집니다.
PeterB

1
방금 이와 같은 일을했는데 왜 로컬 파일이 삭제되었는지 (OP와 같이 아직 커밋하지 않은) 이유를 이해하지 못합니다.
Xonatron

Git 2.23+ (2019 년 8 월)를 사용하면 git restore:로 파일을 복원 할 수 있습니다 git restore -s@ -SW -- .. 아래 내 답변을 참조하십시오 .
VonC

답변:


468
git reset HEAD

해야합니다. 관심있는 커밋되지 않은 변경 사항이 없으면

git reset --hard HEAD

마지막 커밋으로 모든 것을 강제로 재설정해야합니다. 커밋되지 않은 변경 사항이 있지만 첫 번째 명령이 작동하지 않으면 다음을 사용하여 커밋되지 않은 변경 사항을 저장하십시오 git stash.

git stash
git reset --hard HEAD
git stash pop

22
참고 git reset --hard HEAD현재 작업 디렉토리의 부모 디렉토리에 만든 유용한 변화를 파괴한다.
Alex Brown

10
@Mild : 나는 아직도 차가운 땀을 흘리고 있습니다!
hoipolloi

6
나는 투표를하지 않았지만, 그냥 숨겨두기 위해 열심히 노력하고, 재설정하고, 팝하고 최근의 모든 변경 사항을 잃었습니다. 어쩌면 나는 대답을 잘못 읽었을 것입니다.
Greg M. Krsak

1
이것은 거의 작동하지 않으며 Dropbox 폴더에서 작업하게되어 기쁩니다. 형편은 좋지 않지만 매번 저를 구해줍니다.
Nuby

3
git stash pop을했을 때 파일을 다시 제거했습니다. 물론 실수로 일부 파일을 제거했기 때문입니다. 커밋하지 않은 변경 사항을 유지하려는 경우에는이 답변이 효과가 없습니다.
sudo

252

나는 몇 개의 파일을 git-rm'd하고 그 파일 중 일부가 다시 필요하다는 것을 깨달았을 때 다음 커밋 전에 변경을 계속했습니다. 숨김 및 재설정 대신 원하는 경우 누락 / 제거 된 개별 파일을 간단히 체크 아웃 할 수 있습니다.

git checkout HEAD path/to/file path/to/another_file

이렇게하면 커밋되지 않은 다른 변경 사항이 그대로 유지됩니다.


6
커밋되지 않은 다른 변경 사항이 있었기 때문에 도움이되었습니다.
Dan

4
이 답변은이 질문을 우연히 본 사람 git rm에게 전체 재귀가 아닌 단일을 되돌리려하는 데 도움이됩니다 git rm -r. 전체 재귀 삭제의 경우 제거 된 파일 양에 따라 다른 솔루션이 더 나을 수 있습니다.
tresf

당신은 내 상을받을 자격이 있습니다.
5

내가 100.times를 클릭 할 수 있다면!
Wagner Braga

57

하나의 파일이나 폴더를 다시 얻으려면 다음을 사용할 수 있습니다

git reset -- path/to/file
git checkout -- path/to/file

이렇게하면 먼저 path/to/file마지막 커밋에서와 같이 파일에 대한 인덱스 항목을 다시 만들고 다시 만듭니다 HEAD.

힌트 : 이전 커밋에서 파일을 다시 만들기 위해 커밋 해시를 두 명령 모두에 전달할 수 있습니다. 참조 git reset --helpgit checkout --help자세한 내용은.


가장 좋은 답변입니다. git rm커밋되지 않은 다른 변경 사항을 지우지 않고도 단일 작업을 쉽게 수술 취소 할 수 있습니다.
wberry

나를 도와주었습니다! 가장 좋은 답변입니다.
Akram

28

최신 정보:

git rm .작업 체크 아웃 및 색인에서이 디렉토리와 하위 디렉토리의 모든 파일을 삭제 하므로 다음 각 변경 사항을 실행 취소해야합니다.

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

이것은 당신이 원하는 것을해야합니다. 체크 아웃 된 코드 또는 색인의 상위 폴더에는 영향을 미치지 않습니다.


그렇지 않은 오래된 답변 :

reset HEAD

트릭을 수행하고 파일에 대한 커밋되지 않은 변경 사항은 지우지 않습니다 .

그 후에 git add큐에 넣은 명령 을 반복해야 합니다.


1
죄송합니다. 항상 체크 아웃 git alias.co="checkout"하도록 설정 git co합니다.
Alex Brown

25

위의 작업 중 어느 것도 끝나지 않으면 여기에서 제안을 사용하여 데이터를 검색 할 수 있습니다 : http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

4 년 후에도 여전히 생명의 은인!
ThievingSix

결과를 연결하기 위해 C ++ 프로그램을 작성했습니다 (내 저장소에 약 100 개의 객체가 매달려있어 필요합니다). 컴파일하고 실행 한 다음 git repo 로컬 디렉토리를 전달하십시오. raw.githubusercontent.com/bluuman/git-recover-files/master/…
James Meas

14

git rm 실행 취소

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

git rm -r 실행 취소

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

git rm -rf 실행 취소

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changes포함 not staged changes, staged changes but not committed.


물론 git rm -rf추적되지 않거나 준비된 파일 만 삭제할 수 있으므로 실행 취소 할 수있는 것은 없습니다 .
jpaugh

git rm -rf file그리고 git rm -rf dir어떤 추적되지 않는 파일을 삭제되지 않습니다.
song xu

10

변경 사항을 커밋하고 푸시 한 경우 파일을 다시 가져올 수 있습니다.

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

이것은 여전히 ​​필요했던 오래된 git cherry-pick에서 파일이 삭제 된 '변경 사항을 커밋합니다.'에서 작동했습니다 .git reset HEAD ~ <number> <file>이 작동하지 않았습니다.
mushcraft 2016

7

이미 좋은 대답이 있지만, 잘 작동 할뿐만 아니라 원하는 것을 매우 명확하게 나타내는 약간 사용되는 구문을 제안 할 수 있습니다 (따라서 무섭거나 신비하지는 않습니다)

git checkout <branch>@{"20 minutes ago"} <filename>

3

리스트 커밋 받기

git log  --oneline

예를 들어, 안정적인 커밋에는 해시가 있습니다. 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

1

나는 같은 상황이 있었다. 내 경우에는 해결책은 다음과 같습니다.

git checkout -- .

0

힘내 2.23+ (2,019 8 월), 파일 (인덱스)를 복원하는 적절한 명령과 함께 ... 사용 될 woud git restore(안 reset --hard하거나 혼란 git checkout명령 )

그건:

git restore -s=HEAD --staged --worktree -- .

또는 약식 :

git restore -s@ -SW -- .

-1

폴더를 정리하고 파일을 정리하고 이동하는 것과 똑같은 문제가있었습니다. git rm 입력했습니다 . Enter 키를 누르십시오. 그리고 내 장이 약간 느슨해 졌다고 느꼈습니다. 운 좋게도 git commit -m ""을 직접 입력하지 않았습니다.

그러나 다음 명령

git checkout .

모든 것을 복원하고 내 생명을 구했습니다.

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