git 저장소 기록에서 전체 디렉토리를 복원하는 방법은 무엇입니까?


91

내 git 저장소의 기록에서 전체 디렉토리를 (재귀 적으로) 복원하고 싶습니다.

브랜치 (마스터)는 1 개뿐입니다.

오류가 포함 된 커밋을 알고 있습니다.

부모 커밋의 sha1 해시를 사용하여 오류가 포함되기 전의 디렉터리 상태를 복원 할 수 있습니까?

나는 다음과 같은 것에 대해 생각했다.

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

하지만 작동하지 않았습니다.


7
추가 시도 '-'개정과 경로 사이에 :git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
카를로스 Campderrós

이것은 도움이되었습니다. 대단히 감사합니다.
mostwanted

1
@ CarlosCampderrós은 진짜 답으로 작성하고 다른 사람이 그것을 수행하기 전에 15 점을 수집)
ralphtheninja

@MagnusSkog 그게 효과가 있을지 확신하지 못했기 때문에 확인하기 위해 댓글을 달았습니다. 지금은 작동 확신 것을, 나는 :) 답변으로 그것을 아래로 작성했습니다
카를로스 Campderrós

2
일반적인 힌트로 "작동하지 않았습니다"는 그다지 유용하지 않습니다. 이상적으로는 오류 출력 (매우 길면 잘림)과 함께 작동하지 않는 이유를 알려주십시오 .
me_and

답변:


156

개정판과 경로 사이에 '-'를 추가해보십시오.

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

그리고 이전 커밋에서 디렉토리를 복구하려면 커밋 해시를 HEAD ~ 1로 바꿀 수 있습니다. 예를 들면 다음과 같습니다.

git checkout HEAD~1 -- path/to/the/folder/ 

동일한 명령, 거의 다른 목적 : stackoverflow.com/questions/953481/...
cregox

18
하지만 한 가지 문제가 있습니다. OP는 디렉토리가 여전히 존재하는지 여부를 지정하지 않습니다. 기존 디렉토리를 커밋 상태로 복원하려면 먼저 디렉토리의 내용을 삭제해야합니다. 다른 경우에는 이전 커밋에 없었던 기존 파일이 제거되지 않습니다.
Alberto

7
+1 @Alberto는 확실히 동의합니다. 나는 rm -Rf path/to/the/folder그때를했다 git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/-결과 : 그 경로는 그 커밋에서와 똑같은 파일을 가졌고,이 커밋 후에 생성 된 추가 파일과 차이가 없었습니다. 내가 원하는 것입니다.
therobyouknow

2
무엇을 --합니까?
Ray Foss

2
@RayFoss는 git에게 다음 매개 변수가 파일임을 알려줍니다 (그렇지 않으면 커밋 해시, 분기 또는 다른 것과 혼동 될 수 있음). 보통 그들은이 필요하지 않습니다하지만 그들을 넣어 다치게하지 않습니다
카를로스 Campderrós

3

이를 수행하는 두 가지 쉬운 방법이 있습니다.

오류가 포함 된 커밋에 오류 포함 된 경우를 사용 git revert하여 그 효과를 반전합니다.

그렇지 않은 경우 쉬운 경로는 다음과 같습니다.

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

당신이 단순히 git checkout <SHA-ID> 그것은 일시적으로 그 샤 커밋로 이동합니다.

각 커밋 객체는 당시 디스크의 전체 구조를 유지하므로 파일이 있고 복사해야하는 경우 그렇게 할 수 있습니다. 그러나 경고, 당신은 어떤 브랜치에도 없을 것이므로 파일을 작업 트리에 복사하고 커밋하기 전에 마스터로 돌아 가야합니다.


다시 "마스터로 다시 이동"은 체크 아웃 마스터를 의미합니까?
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.