자식에서 삭제 된 파일을 스테이지 해제


504

일반적으로 파일의 변경 사항을 삭제하려면 다음을 수행하십시오.

git checkout -- <file>

삭제하려는 변경이 파일을 삭제하는 경우 어떻게합니까? 위의 줄은 오류가 발생합니다.

error: pathspec '<file>' did not match any file(s) known to git.

다른 변경 사항을 취소하지 않고 단일 파일을 복원하는 명령은 무엇입니까?

보너스 포인트 : 또한 삭제하려는 변경 사항 이 파일을 추가 하는 경우 어떻게됩니까? 그 변화를 무대에서 벗어나는 방법도 알고 싶습니다.


1
변경 사항을 폐기하고 준비를 취소하는 것은 서로 다른 두 가지 작업입니다.
Andrew Marshall

1
이것은 한 게시물에서 두 가지 다른 질문과 문제입니다. 이것은 답변도 너무 불필요하게 혼란스럽게 만듭니다.
David Sopko

답변:


779

다음과 같은 효과 git rm <file>또는 rm <file>git add -A와 유사한 것을 취소하고 싶다고 가정합니다 .

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

취소하기 위해 git add <file>, 아직 커밋하지 않았다고 가정하면 위의 첫 번째 줄이면 충분합니다.


70
--열쇠입니다. git reset <file>작동하지 않아서 여기로 왔어요.

2
end-of-options-marker삭제 된 파일 사례에만 필요한 이유는 무엇 입니까?
haridsv

5
@handsv 엄격하게 요구되는 것은 아니지만 (또는 git reset HEAD <file>이와 동등한 방법으로 수행 할 수 있지만) git reset첫 번째 인수를 end-of-options-marker파일 이름이 아닌 참조 이름으로 취급합니다 . 좀 더 유연하게 작성할 수 있습니까? 아마. 왜 안 되었어? 아마도 개발자들만 알고있을 것입니다.
twalberg

2
@twalberg git reset filename는 삭제되지 않은 파일에 적합합니다.
브라이언 고든

1
@AaronMahan - 당신은 사이의 차이를 설명하십시오 수 git reset <file>git reset -- <file>. Google에서 답변을 찾는 데 어려움을 겪고 있습니다.
Neeraj B.

56

두 질문에 모두 답변되어 git status있습니다.

새 파일 추가를 스테이지 해제하려면 git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

파일 삭제를 스테이지 해제하려면 git reset HEAD filename.ext

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test

반면, git checkout --스테이지를 해제하지 않고 스테이지되지 않은 변경 사항 만 버립니다.


5
데비안에서 git 1.7.2.5에 삭제 된 파일에 대한 힌트가 표시되지 않습니다.
tripleee

git status인용 된 것을 반갑습니다 . 는 사용자에게 현재와 다음에 자조하는 방법을 보여 주며, 향후 git 버전에서 정보가 추가되거나 업데이트되는 경우를 보여줍니다.
Will Cain

이것은 잘못이다. "커밋 할 변경 사항"은 이전에 표시 되는 내용 git reset입니다. git reset , 당신은 "변경하지만 업데이트되지"참조 수단이 분명히, 자식 저자의 모국어로 "변경은 개최하지"한다. 더 중요한 것은 "git status는 당신이 아는 모든 것을 말해줍니다"에 관한 교리 전체가 거짓말이라는 것입니다. (사람들의 시간을 낭비하고 해고해야한다고 말한다 매니저.)
personal_cloud

11

두 질문에 대한 답변은 서로 관련이 있습니다. 두 번째부터 시작하겠습니다.

파일을 스테이징 한 후에 (종종 git add다른 명령은 암시 적으로 변경 사항을 스테이징하지만)로 변경 사항을 git rm취소 할 수 있습니다 git reset -- <file>.

귀하의 경우 git rm파일을 제거하는 데 사용해야 합니다. 이는 단순히 파일을 제거한 rm다음 변경 사항을 준비하는 것과 같습니다 . 처음으로 스테이지를 해제 git reset -- <file>하면로 복구 할 수 있습니다 git checkout -- <file>.


7

준비되고 커밋 된 경우 다음이 파일을 재설정합니다.

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

이것은 이전에 여러 커밋이 발생한 삭제에 효과적입니다.


1
그것은 더 효율적입니다git revert COMMIT_HASH
감각

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