삭제 후 커밋이 수행되지 않은 git recover 삭제 된 파일


812

일부 파일을 삭제했습니다.

아직 커밋하지 않았습니다.

파일을 복구하기 위해 작업 공간을 재설정하고 싶습니다.

나는했다 git checkout ..

그러나 삭제 된 파일이 여전히 없습니다.

그리고 git status보여줍니다 :

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

git checkout .작업 공간을 HEAD?로 재설정 하지 않습니까?


16
삭제 후 변경 사항을 준비하지 않았다면 git checkout .정상적으로 작동했을 것입니다.
faizal

10
@faizal 그리고 당신이 그렇게하면 변경 사항을 잃게됩니다.
Vasiliy Yorkin

1
삭제 된 항목의 git gui에서 Ctrl-J를 누르십시오.
ajeh

git checkout-cc.properties store / README store / cc.properties
Vinod Pasi

이 답변보기 quora.com/…
live-love

답변:


787

출력은 수행해야 할 작업을 알려줍니다. git reset HEAD cc.properties기타

rm 작업의 스테이지가 해제됩니다. 그런 다음 git status다시 실행 git checkout -- cc.properties하면 파일을 다시 가져 오기 위해 수행해야한다는 메시지가 나타납니다 .

업데이트 : 구성 파일에 있습니다.

$ git config alias.unstage
reset HEAD

일반적으로 물건을 무대에서 꺼내는 데 사용합니다.


5
여러 개의 삭제 된 파일에 대해이 작업을 어떻게 수행합니까? git reset HEAD << filename >>을 여러 번 실행하면 번거로울 수 있습니다.
SubSul

70
git reset HEAD \*그리고git checkout -- .
Noufal Ibrahim

3
하지만 파일을 수정했습니다.
Jiang YD

@RauliRajande 귀하의 상황이 원래 질문에서 설명한 것과 다를 가능성이 있습니다.
Noufal Ibrahim 5

1
rm -r ./engines-죄송합니다. 이제 git reset engines; git checkout engines.
Kris

209

삭제를 준비 했으므로 다음을 수행해야합니다.

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . 삭제가 이미 준비된 색인에서만 체크 아웃합니다.


177

그냥 해 git checkout path/to/file-I-want-to-bring-back.txt


8
파일이 커밋되고 푸시되지 않은 경우에만 작동합니다.
mahen3d

23
나를 위해 작동하지 않았다, git는 파일이 추적되었지만 해당 이름의 파일을 모른다고 말했다. 나는 커밋하지 않았고 netbeans의 컨텍스트 메뉴를 실수로 사용하여 파일을 삭제했습니다.
Zelphir Kaltstahl

4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov

@ user3479125 파일이 커밋되지 않은 것 같습니다. git status그것에 대해 무엇을 말합니까?
ki92

12
힘내 상태는 녹색 "delated file.ext" git checkout HEAD -- file.ext가 복원하는 데 도움이 된다는 것을 보여주었습니다 .
Ivan Borshchov

143

각 단일 경로를 지정하지 않고 자동으로 모든 단계적 삭제를 한 번에 복구하려면 다음을 수행하십시오.

git ls-files -z -d | xargs -0 git checkout --

각 단일 경로를 지정하지 않고 모든 단계적 삭제를 한 번에 자동으로 복구하려면 다음을 수행하십시오.

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

12
실수로 500 개가 넘는 파일을 삭제했으며 유효한 변경 사항도 모두 유지했기 때문에 대우를했습니다 (첫 번째 줄은 내가 사용한 것입니다). 감사.
Guy Lowe

1
빌드가 완료된 직후 리포지토리의 모든 내용을 실수로 삭제했습니다. 첫 번째 명령으로 베이컨을 구했습니다.
MonaLisaOverdrive 2016 년

2
이것이 나를 위해 작동하기 전에 나는 달려야했다 git status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --.
Ian Dunn

1
매우 유용하고 추적되지 않은 파일을 유지하고 싶었지만 삭제 및 수정을 제거하고 수정을 처리하기 위해 -d를 -m으로 변경했습니다.
RaisinBranCrunch

5
파일 이름 / 경로에 공백이 있으면 작동하지 않습니다. 나는 효과가 있다고 생각 git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --한다.
parsley72

79

를하고 있기 때문에 git checkout .분기를 마지막 커밋 상태로 다시 복원하려고하는 것처럼 보입니다.

당신은 이것을 달성 할 수 있습니다 git reset HEAD --hard

경고

이렇게하면 모든 최신 수정 사항이 제거되고 수정 사항이 준비 해제 될 수 있습니다. 그것은 수 있습니다 당신이 원하는 것을 할 수 있지만, 체크 아웃 워드 프로세서를 확인합니다.


39
와우 !! 조심해 !!!! 당신은 옳을 수도 있지만 누군가 혼란 스러울 수 있고 전체 코드를 날려 버릴 수 있습니다. 더 큰 경고를 추가하면 멋질 것입니다.
santiagobasulto

3
이것이 바로 내가 필요한 것입니다. 전체 코드를 폭파하지는 않습니다. 가장 최근의 커밋으로 돌아갑니다.
앤드류 헨 드리

2
한 시점에 수백 개의 누락 된 파일이 생겼습니다. 이것이 문제를 해결하는 유일한 실용적인 방법입니다. 감사!
Jonathan Benn

66

네가 사용했다면

git rm filename

파일을 삭제 한 다음

git checkout path/to/filename

작동하지 않으므로이 경우

git checkout HEAD^ path/to/filename

작동해야합니다


2
나는이 답변을 좋아한다. 제거한 특정 파일 에만 영향을 준다는 것은 의심의 여지가 없습니다 . 1) 자식 체크 아웃 경로 / to / filename 2) 자식 체크 아웃-경로 / to / filename
Ed of the Mountain

우수한. git checkout HEAD^ path/to/filename파일을 커밋하지 않았기 때문에 나를 위해 일했습니다.
모세 Ndeda

29

내 Mac에서 도움이 된 명령은 다음과 같습니다. 다른 솔루션 중 몇 가지를 시도했지만 효과가 없었습니다.

OSX 매버릭스의 Git 버전

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

명령

git checkout HEAD -- path/to/file/file.cc



17

모든 파일을 한 번에 복원하려면

git이 모든 파일을 가져 오도록 지시하기 때문에 마침표를 사용해야합니다.

이 명령은 헤드를 재설정하고 모든 변경 사항을 취소합니다.

$ git reset HEAD . 

그런 다음 이것을 실행하여 모든 파일을 복원하십시오.

$ git checkout .

그런 다음 자식 상태를 수행하면 다음을 얻을 수 있습니다.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

이것은 가장 간단한 솔루션이며 여러 파일에 대해 작동합니다 (여러 파일 / 폴더를 삭제했다고 말하십시오). 좋은 직업 친구 +
Gkiokan

9

이걸보고 싶니?

그것은 당신이 사용한 경우에 간다

git checkout -- .

당신이 무언가를 저지르기 전에.

아직 작성되지 않은 작성된 파일을 제거 할 수도 있습니다. 그리고 당신은 그들을 원하지 않습니다. 로 :

git reset -- .

복사 한 답변을 완전히보고하지 않았습니다. 실제로 git checkout -- .삭제 된 파일을 복구하는 데 도움이되지 않으며 asker가 시도한 것과 같습니다 git checkout .. 작동 할 수있는 부분은 복사하지 않은 부분입니다 git checkout <file_path>.
Jean Paul

6

다른 지점에서 병합 한 후 작업 디렉토리에서 삭제 된 파일을 삭제 취소하는 방법에 대한 답변을 찾는 동안이 게시물을 찾았습니다. 병합 후 아직 커밋되지 않았습니다. 병합이 진행 중이므로 다음을 사용하여 다시 추가 할 수 없었습니다.

$ git reset <commitid#-where-file.cpp-existed> file.cpp

파일을 다시 가져 오기 위해 재설정 외에도 다른 단계를 수행해야했습니다.

$ git checkout -- file.cpp

4

변경 사항을 커밋하지 않은 경우 해당 변경 사항을 숨기고 마지막 작업 커밋으로 돌아갑니다.

git stash
git stash clear
git clean 

숨김 스택에 배치하는 것은 해결책이 아닙니다. 해킹입니다.
Robert Dolca

2
Thisc은 숨김에서 제거 할 수 있기 때문에 좋은 해결책입니다. 해킹인지 여부는 맛의 문제입니다. 숨김에 대한 전체 아이디어는 영리한 해킹입니다.
Eino Mäkitalo

@ EinoMäkitalo 그것이 당신에게 도움이 될 수있어서 기쁘다 :)
Rick

나는이 접근법이 나열된 것 중 가장 좋은 것을 좋아한다
ckapilla

3

삭제 된 디렉토리를 찾고있는 경우

 git checkout ./pathToDir/*

3

다음은 다른 사람들을 돕기위한 다른 사례입니다.

삭제가 커밋되지 않은 경우 아래 명령은 작업 트리에서 삭제 된 파일을 복원합니다.

$ git checkout -- <file>

아래 명령을 사용하여 작업 트리에서 삭제 된 모든 파일 목록을 얻을 수 있습니다 .

$ git ls-files --deleted

삭제이 경우 최선을 다하고 은이 일어난 곳이 커밋에서 다음 파일을 복구 커밋 찾을 수 있습니다.

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

그것은 당신에게 뭔가를 줄 것입니다 c46e81aa403ecb8a0f7a323a358068345, 이제 commit #을 사용하십시오.

$ git checkout <commit>^ -- <file>

이와 같은 것 : $ git checkout c46e81aa403ecb8a0f7a323a358068345-

복구 할 파일 경로를 찾는 경우 다음 명령은 삭제 된 모든 파일의 요약을 표시합니다.

$ git log --diff-filter=D --summary

파일 목록 만 표시하려면 다음을 수행하십시오.

git log --diff-filter=D --summary | grep "delete mode"

2

나를 위해 일한 것은 git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

예를 들어 git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(파일을 넣을 지점에서 실행)

해당 명령이 실행 된 후 복원 된 파일은 원래 위치에 존재합니다 (커밋해야 함).


및 / 또는 단순히 git checkout master path/to/the/file.bin다른 변경 사항을 잃지 않고 해당 파일의 삭제를 취소 할 수 있습니다. 추신 : 이것은 허용되는 대답이어야합니다 ...
Edoardo

1

ToroiseGIT를 설치 한 경우 상위 폴더 팝업 메뉴에 대해 "복귀 ..."메뉴 항목을 선택하십시오.


1

1. 다음을 사용하여 되돌릴 특정 커밋을 찾으십시오.

   git log
This command will give you a list of commits done by you .

2. 다음을 사용하여 커밋으로 되돌립니다.

    git revert <commit id> 

이제 로컬 브랜치에는 특히 모든 파일이 있습니다.


변경 사항을 이미 커밋 한 경우 작동합니다.
라이브 사랑

1

주의 : 먼저 유지하려는 모든 작업을 커밋하십시오.

작업 공간을 재설정 하고 삭제 된 파일을 복구 할 수 있습니다

git checkout ./*

2
참고로 ...이 명령은 모든 내 작업 파일을 삭제하고 삭제 된 file..beware 회복되지 않았다
hendr1x

따라서이 명령을 사용하여 작업 공간을 재설정하십시오. 나는 그것이 자명하다고 생각했다.
Henrique Florêncio

1
파일이 삭제되면에 걸리지 않기 때문에 해당 명령이 작동하지 않습니다 ./*.
Jean Paul

@JeanPaul 어쩌면 오해 할 수도 있지만 작업 공간을 원래 상태로 둡니다 (삭제 된 파일이 있습니다).
Marc

@Marc 디렉토리에 보이는 파일이없는 경우에만 작동 할 수 있습니다. 그렇지 않으면 ./*git에 보내기 전에 해당 파일과 일치하도록 bash에 의해 확장 되기 때문 입니다.
Jean Paul

0

나는 같은 문제가 있었지만 위의 해결책 중 어느 것도 나를 위해 일하지 않았다. 내가 한 일은 :
-같은 이름으로 빈 파일을 작성하십시오
-이 파일을 로컬 히스토리와 비교하십시오
-빈 파일에 히스토리를 복사하십시오.


-1

나는 같은 문제가 있었고 여기서 시도한 답변 중 어느 것도 나를 위해 일하지 않았다. Intellij git checkout -b minimalExample를 사용하고 있으며 많은 파일을 삭제하고 프로젝트의 다른 많은 것들을 수정하여 일부 문제의 새로운 지점에 대한 "최소 예제"를 만들기 위해 새로운 지점 을 체크 아웃했습니다 . 안타깝게도 새 "최소 예제"브랜치에서 변경 사항을 커밋하지 않더라도 "원래"브랜치를 다시 체크 아웃 할 때 "최소 예제"브랜치의 모든 변경 및 삭제가 " 원래 "지점도 (또는 그렇게 나타남). git status삭제 된 파일 에 따르면 두 지점에서 모두 사라졌습니다.

다행히도 Intellij가 "이 파일을 삭제하면 완전히 복구 할 수는 없다"고 경고했지만 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 로컬 히스토리를 선택하여 파일을 실제로 삭제할 수있는 최소한의 예제 분기에서 복원 할 수있었습니다. > 기록 표시 (및 내가 원하는 가장 최근 기록 항목에서 복원). Intellij가 "최소 예제"분기에서 파일을 복원 한 후 분기를 원래 위치로 푸시했습니다. 그런 다음 "원본"로컬 지점으로 다시 전환 git pull origin minimalExample하여 "원본"지점으로 다시 가져 왔습니다.

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