HOWTO · Git
Git에서 rm을 취소하는 방법
삭제가 아직 스테이징 상태인지 이미 커밋되었는지에 관계없이 git rm으로 제거한 파일을 복구하는 방법을 알아봅니다. 인덱스나 커밋에서 원하는 버전을 복원할 안전한 Git 명령을 선택하세요.
이 페이지의 내용
git rm을 취소하려면 먼저 삭제가 아직 스테이징 상태인지 이미 커밋되었는지 확인하세요. 커밋 전에는 HEAD에서 경로를 복원하고, 커밋 후에는 원하는 버전이 포함된 커밋을 선택해 그 커밋에서 경로를 복원합니다. Git은 커밋된 버전은 복구할 수 있지만, 한 번도 커밋되지 않은 파일 내용은 다시 만들 수 없습니다.
git rm이 변경하는 내용
git rm <path>은 추적 중인 파일을 작업 트리에서 제거하고 그 삭제를 인덱스에 스테이징합니다. 따라서 삭제는 다음 커밋에 포함될 준비가 됩니다. rm 명령은 git remove의 별칭이 아닙니다. rm은 셸 명령이고, git rm은 Git의 인덱스도 업데이트합니다.
파일 추적을 중단하되 작업 트리 복사본은 유지하려면 git rm --cached <path>를 사용하세요. 그러면 인덱스에서의 제거가 스테이징되고 파일은 디스크에 남습니다. 파일이 로컬에는 남아 있어야 하지만 저장소에는 더 이상 속하지 않아야 할 때 자주 사용됩니다.
커밋 전에 삭제 복원하기
삭제가 스테이징되어 있고 마지막으로 커밋된 버전이 필요하다면, git restore --source=HEAD --staged --worktree -- <path>를 사용해 HEAD에서 인덱스와 작업 트리 모두에 경로를 복원하세요. 사용하기 전에 설치된 Git이 git restore를 제공하는지 확인하세요. 제공하지 않는다면 git checkout HEAD -- <path>가 HEAD에서 인덱스와 작업 트리로 해당 경로를 복원합니다.
이 명령들은 작업 트리에만 존재했던 편집이 아니라 커밋된 버전을 복구합니다. 두 위치를 모두 복원하면 해당 경로가 선택한 버전으로 교체되므로, 먼저 그 경로에 대한 스테이징된 변경이나 로컬 변경을 검사하세요. 여러 경로를 복원하려면 -- 뒤에 각 경로를 나열하세요.
이 독립 실행 예제는 임시 저장소를 만들고, 메모를 커밋하고, 그 제거를 스테이징한 뒤 커밋된 버전을 복원합니다. 마지막 줄이 복원된 파일 내용입니다.
set -eu
repo_dir="$(mktemp -d)"
trap 'rm -rf "$repo_dir"' EXIT
cd "$repo_dir"
git init -q
git config user.name "Example User"
git config user.email "example@example.invalid"
printf 'A tracked note.\n' > notes.txt
git add notes.txt
git commit -qm "Add note"
git rm -q notes.txt
if git restore --source=HEAD --staged --worktree -- notes.txt 2>/dev/null; then
:
else
git checkout HEAD -- notes.txt
fi
cat notes.txt
예상 표준 출력:
A tracked note.
커밋 후에 삭제 복구하기
커밋이 삭제를 기록한 뒤에는 원하는 파일 버전이 포함된 커밋을 선택하세요. 그런 다음 git restore --source=<commit> --staged --worktree -- <path>를 사용해 해당 경로만 복원합니다. git restore를 사용할 수 없으면 git checkout <commit> -- <path>를 사용하세요. <commit>과 <path>를 선택한 커밋과 저장소 상대 경로로 바꾸세요.
하나의 경로를 복원해도 그것을 삭제한 커밋이 취소되는 것은 아닙니다. 파일 복원이 스테이징되어 검토하고 커밋할 수 있게 됩니다. HEAD~1이 올바른 소스라고 가정하지 마세요. 이후 커밋이 존재할 수 있고, 바로 이전 커밋에 필요한 버전이 없을 수도 있습니다.
Git 기록에서 이전 버전 찾기
git log --all -- <path>를 사용해 해당 경로를 변경한 커밋을 검사하고 원하는 버전이 포함된 커밋을 찾으세요. git reflog는 최근 브랜치 끝 위치를 기록하며, 리셋과 같은 브랜치 이동 후 커밋을 찾는 데 도움이 됩니다. 파일 내용을 별도로 저장하지는 않습니다. 선택하는 커밋에 원하는 파일 버전이 포함되어 있어야 합니다.
후보를 찾으면 그 커밋에 해당 경로가 포함되어 있는지 확인한 뒤, 위의 명령을 사용해 후보 커밋에서 그 경로를 복원하세요. Git 기록은 내용이 커밋된 경우에만 도움이 됩니다. 파일이 한 번도 커밋되지 않았다면 대신 편집기 백업, 시스템 백업 또는 다른 복사본을 확인하세요.
안전한 복구 방법 선택하기
저장소 상태에 따라 소스를 선택하세요. 커밋되지 않은 스테이징 삭제는 HEAD에서 복원하고, 커밋된 삭제는 특정 이전 커밋에서 복원합니다. 복구한 파일을 커밋하기 전에 스테이징된 차이와 작업 트리 상태를 검토하세요. 특히 같은 경로에 다른 작업이 있을 경우 주의하세요.
하나의 파일을 복구하는 일상적인 방법으로 git reset --hard는 피하세요. 인덱스와 작업 트리를 초기화하고 관련 없는 미커밋 변경을 버릴 수 있습니다. 선택한 커밋에서 단일 경로만 복원하는 편이 더 대상이 명확합니다. 여러 파일에 대해서는 복원 명령에 각 경로를 제공하고, 커밋하기 전에 결과 변경을 검토하세요.