수락 된 답변 외에도 실수로 추가 된 파일이 크면 ' git reset
'로 색인에서 파일을 제거한 후에도 여전히 .git
디렉토리의 공간을 차지하는 것으로 보입니다 .
이것은 걱정할 것이 없습니다. 파일은 실제로 저장소에 있지만 "느슨한 개체"로만 존재합니다. 복제, 푸시를 통해 다른 리포지토리에 복사되지 않으며 결국 공간은 곧 재생됩니다. 불안한 경우 다음을 실행할 수 있습니다.
git gc --prune=now
업데이트 (다음은 가장 많이 답변 된 답변에서 발생할 수있는 혼란을 없애려는 나의 시도입니다) :
그렇다면 실제 실행 취소 는 어느 것 git add
입니까?
git reset HEAD <file>
?
또는
git rm --cached <file>
?
엄밀히 말하면, 내가 실수하지 않으면 : none .
git add
일반적으로 안전하게 취소 할 수 없습니다 .
git add <file>
실제로 실제로 무엇을하는지 생각해 보자 .
경우 <file>
한 이전에 추적되지 않습니다 , git add
캐시에 추가 현재의 내용으로.
경우 <file>
한 이미 추적 , git add
현재 내용 저장 캐시에 (스냅 샷, 버전). Git에서는 파일의 두 가지 버전 (스냅 샷)이 두 개의 다른 항목으로 간주 되므로이 작업을 여전히 add 라고 합니다 (따라서 단순히 업데이트 하지 않음 ). 따라서 실제로 캐시에 새 항목을 추가하므로 결국에는 나중에 약속했다.
이것에 비추어, 질문은 약간 모호합니다.
명령을 사용하여 실수로 파일을 추가했습니다 ...
OP의 시나리오는 첫 번째 시나리오 (추적되지 않은 파일) 인 것 같습니다. "실행 취소"를 사용하여 추적 된 항목에서 파일 (현재 내용뿐만 아니라)을 제거하려고합니다. 경우 이런 경우, 그것은 실행 괜찮습니다 git rm --cached <file>
.
그리고 우리는 또한 달릴 수있었습니다 git reset HEAD <file>
. 이는 두 시나리오에서 모두 작동하기 때문에 일반적으로 바람직합니다. 이미 추적 된 항목의 버전을 잘못 추가 한 경우 실행 취소도 수행합니다.
그러나 두 가지 경고가 있습니다.
첫 번째 : (답변에서 지적했듯이) git reset HEAD
작동하지 않는 시나리오가 하나 있지만 git rm --cached
새 리포지토리 (커밋 없음)가 있습니다. 그러나 실제로 이것은 실제로 관련이없는 경우입니다.
둘째 : git reset HEAD
이전에 캐시 된 파일 내용을 마술처럼 복구 할 수 없으며 HEAD에서 다시 동기화합니다. 잘못된 안내로 git add
인해 이전 단계의 커밋되지 않은 버전을 덮어 쓴 경우 복구 할 수 없습니다. 그렇기 때문에 엄밀히 말하면 [*]를 취소 할 수 없습니다.
예:
$ git init
$ echo "version 1" > file.txt
$ git add file.txt # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add file.txt # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff file.txt
-version 2
+version 3
$ git add file.txt # Oops we didn't mean this
$ git reset HEAD file.txt # Undo?
$ git diff --cached file.txt # No dif, of course. stage == HEAD
$ git diff file.txt # We have irrevocably lost "version 2"
-version 1
+version 3
물론 새 파일을 추가하기 위해 'git add'를 수행하는 일반적인 게으른 워크 플로우를 따르고 (case 1) commit, git commit -a
명령을 통해 새 내용을 업데이트하는 경우 이것은 중요하지 않습니다 .
* (편집 : 위의 내용은 실제로 정확하지만 단계적이지만 커밋되지 않은 다음 변경 사항을 복구하는 약간의 해킹 / 복잡한 방법이있을 수 있습니다-Johannes Matokic 및 iolsmit의 의견 참조)
HEAD
되거나 대신head
사용될 수 있습니다 . 왜 그렇게 할 수 있는지 알아 보려면 이 답변 (마지막 섹션) 을 참조하십시오 .@
HEAD