Git 저장소에서 삭제 된 폴더 복원


101

폴더 안의 모든 내용을 삭제했는데 폴더가 비어 있습니다. 원격 저장소에 여전히 사본이 있습니다. 하지만 내가했을 때 git pull삭제 된 파일을 되 돌리지 않았는데 그렇게해서는 안됩니까?

그래서 몇 가지 조사를했고 다음을 수행하여 파일을 되돌릴 수 있음을 확인했습니다. git checkout <revision> -- <name of file>

그러나 그것은 파일에서만 작동합니다.

디렉토리 안의 모든 파일을 어떻게 검색 할 수 있습니까?


1
git status당신에게 어떤 명령 (들)에 대한 힌트를 줄 것이다 실행
Tavian 반스

1
원격 저장소에 여전히 이전 디렉토리가있는 것처럼 들립니다 (그리고 로컬 저장소에도있을 수 있습니다). 강력한 제안 : 1) 원격 리포지토리에서 리포지토리 로 "풀"을 수행하십시오 (로컬 리포지토리에 더 이상 손상을주지 마십시오). 2) 새로운 로컬 저장소 atlassian.com/git/tutorials/undoing-changes/git-revert 에서 "체크 아웃"... 또는 "되돌리기"를 시도합니다 . 3) 모든 것이 정상이라고 확신하면 원격 저장소를 업데이트하십시오.
paulsm4

답변:


255

파일로 할 수있는 모든 작업은 폴더로도 할 수 있습니다.

또한 참고 찾기 및 Git 저장소에서 삭제 된 파일을 복원


작업 트리에서 파일이 삭제되었지만 아직 커밋되지 않았습니다.

git add변경 사항을 아직 색인화하지 않은 경우 ( ) 디렉토리의 컨텐츠를 되돌릴 수 있습니다.

git checkout -- path/to/folder

삭제가 이미 색인화 된 경우 먼저 재설정해야합니다.

git reset -- path/to/folder
git checkout -- path/to/folder


전체 작업 트리 (단일 폴더가 아님)를 복원하지만 커밋되지 않은 모든 변경 사항이 손실됩니다.

git reset --hard HEAD


과거에 일부 커밋에서 파일이 삭제 된 경우 :

주어진 경로에 영향을 준 마지막 커밋을 찾습니다. 파일이 HEAD 커밋에 없기 때문에이 커밋에서 삭제해야합니다.

git rev-list -n 1 HEAD -- <file_path>

그런 다음 캐럿 ( ^) 기호를 사용하여 이전 커밋에서 버전을 확인합니다 .

git checkout <deleting_commit>^ -- <file_path>


먼 커밋에서 전체 작업 트리 복원

git reset --hard <revision> 

1
git checkout -- path/to/folder/* 일하지 않는 참고 : 문제는 폴더를하지 않는 파일을 복원하는 방법입니다
G 맨

@gman How can I retrieve all the files inside the directory은 디렉토리와 파일 모두를 의미합니다. 그러나 그 명령은 놀랍게도 나에게도 작동하지 않습니다. 1 년 전에 그랬던 것을 기억합니다.
닉 Volynkin

2
@gman이지만 git checkout -- path또는 처럼 작동합니다 git checkout -- 'path/*'. 귀하의 예에서는 git rmOP가 수행하지 않은 것으로 삭제 합니다. 그러한 경우에 대한 지침을 추가했습니다. 감사!
닉 Volynkin

3
Windows에서는 다음과 같이 따옴표를 입력해야합니다.git checkout "<deleting_commit>^" -- <file_path>
Maor

재설정 명령에 폴더를 지정 했음에도 불구하고 전체 저장소에서 많은 것을 언 스테이징했습니다. 이것이 어떻게 말이 되는가? 체크 아웃을 실행하면 내 폴더가 복원 된 것 같습니다. 언 스테이지가 내 코드의 나머지 부분에 어떤 영향을 주 었는지 전혀 모르겠습니다. 중앙 집중식 저장소에 사용되는 피어 투 피어 저장소 관리자의 기쁨은 한숨입니다.
Paul Kenjora

5

변경 사항을 아직 커밋하지 않은 경우 콘텐츠 또는 디렉토리를 되돌릴 수 있습니다.

git checkout -- removed_directory

모든 변경 사항을 되돌리려면 다음을 수행하십시오.

git reset --hard HEAD

3
git checkout -- removed_directory 작동하지 않습니다
G 맨

git checkout -- removed_directory나를 위해 일했지만 이전 에이 디렉토리를 만들었습니다 ( checkout해당 디렉토리의 파일 중 하나). 생성 후 모든 파일은이 명령으로 폴더에 복원되었습니다.
Boolean_Type

5

git restore를 사용하여 파일 또는 폴더를 복원 할 수 있습니다.

git restore --source master~1 "PATH_IN_YOUR_REPO"

여기서 master ~ 1 은 폴더를 마스터 브랜치에서 "1"개정으로 되돌립니다.

출처 : https://git-scm.com/docs/git-restore


4

나를 위해 일한 유일한 것은 다른 폴더의 저장소를 체크 아웃하는 것입니다. 현재 저장소가 /home/me/current.

그런 다음

git clone /home/me/current /home/me/temp

이것은 저장소의 별도 복제본을 만듭니다. /home/me/temp

이제 /home/me/temp내가 원하는대로 가서 할 수 있습니다 . 예를 들면

git reset --hard commit-hash-before-delete

이제 삭제 된 파일 폴더를 다시 복사 할 수 있습니다.

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

임시 폴더를 삭제하십시오.

rm -rf /home/me/temp

의 예

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

작동하지 않습니다

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

같은 다른 예

git reset --hard HEAD

삭제 된 파일 외에도 파괴적입니다. 다른 모든 변경 사항도 손실됩니다.

비슷하게

git reset --hard some-commit

이후 커밋을 잃게됩니다. some-commit


2

git 2.24.0부터 실험적인 새 git 명령이 있습니다. git restore

git restore --staged some/deleted/folder

git : 'restore'가 git 명령이 아님을 보여줍니다
Ahmed C

0

특정 파일을 지정하지 않으면 특정 커밋의 전체 내용을 가져올 수 있어야합니다. 처럼:git checkout 264794319e9695ba843cd6 (해시가 모든 파일을 올바른 상태로 가지고 있다고 가정).

그 이유 pull는 파일을 복원하지 않는 이유 는 git이 삭제 한 내용을 최근 변경 사항으로 간주하여 가져 오는 항목 위에 적용하기 때문입니다.

(새 브랜치에서 실험 해 보는 것이 좋습니다.)


0

삭제 된 폴더를 복구하려는 경우 삭제 후 다른 커밋이있는 경우 github.com에서 프로젝트로 이동할 수도 있습니다.

github.com에서 폴더가있는 마지막 커밋으로 이동합니다. 커밋 메시지가 표시되고 오른쪽에 "파일 찾아보기"라는 버튼이 있습니다. 이것을 클릭하면 커밋 단계의 모든 파일로 이동합니다.

여기에서 코드를 복제하거나 코드를 zip으로 다운로드 할 수 있습니다.


-1

커밋되지 않은 삭제의 경우 다음과 같이 간단합니다.

git reset HEAD rel / path / to / deleted / directory / *

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