"git rm --cached x"대 "git reset head ---- x"?


163

GitRef.org-기본 :

git rm준비 영역에서 항목을 제거합니다. 이것은 git reset HEAD"언 스테이지"파일 과는 조금 다릅니다 . "무단계"는 스테이징 영역을 수정하기 전에 있던 영역으로 되 돌리는 것을 의미합니다. git rm반면에 파일은 스테이지에서 완전히 걷어차 기 때문에 다음 커밋 스냅 샷에 포함되지 않으므로 효과적으로 삭제됩니다.

기본적으로 a git rm file는 준비 영역에서 파일을 완전히 제거하고 디스크 (작업 디렉토리)에서도 제거합니다. 파일을 작업 디렉토리에 두려면을 사용할 수 있습니다 git rm --cached.

그러나 git rm --cached asd와 의 차이점은 정확히 무엇 git reset head -- asd입니까?

답변:


219

예를 들어 트리, 인덱스 및 작업 복사본과 같이 파일이있을 수있는 위치는 세 곳입니다. 폴더에 파일을 추가하면 작업 사본에 파일이 추가됩니다.

같은 일을 할 때 git add file색인에 추가하십시오. 그리고 커밋하면 트리에도 추가됩니다.

git reset에서 세 가지 일반적인 플래그를 아는 데 도움이 될 것입니다.

자식 리셋 [- <mode>] [ <commit>]

이 양식은에 따라 현재 분기 헤드를 <commit>재설정하고 인덱스 (트리의 재설정 <commit>) 및 작업 트리 <mode>를 업데이트합니다. --soft 중 하나 여야합니다.
--soft

인덱스 파일이나 작업 트리를 전혀 만지지 마십시오 (그러나 <commit>모든 모드와 마찬가지로 헤드를로 재설정하십시오 ). 이것은 git status에 의해 변경된 모든 파일을 "Commit to commit"으로 남겨둔다.

-혼합

작업 트리가 아닌 색인을 재설정하고 (즉, 변경된 파일은 유지되지만 커밋으로 표시되지 않음) 업데이트되지 않은 내용을보고합니다. 이것이 기본 동작입니다.

--단단한

색인 및 작업 트리를 재설정합니다. 작업 트리에서 추적 된 파일에 대한 모든 변경 내용 <commit>은 삭제됩니다.

지금, 당신은 뭔가를 할 때 git reset HEAD- 당신이 실제로하고있는 것은 git reset HEAD --mixed그것을 당신이 (를 통해 인덱스를 수정 / 추가 파일을 추가 시작하기 전의 상태로 인덱스 "리셋"한다 git add) 이 경우, 작업 복사본과에서를 index (또는 staging)가 동기화되었지만 재설정 후 HEAD와 인덱스가 동기화되도록했습니다.

git rm반면에 작업 디렉토리와 색인에서 파일을 제거하고 커밋하면 트리에서도 파일이 제거됩니다. git rm --cached그러나 색인에서만 파일을 제거하고 작업 사본에 보관합니다. 이 경우와 정확히 반대입니다 git add file .이 경우 HEAD와 작업 색인을 다르게 만들었습니다. HEAD에 이전에 커밋 된 파일 버전이 있기 때문에 HEAD의 내용이나 내용이 파일과 색인에서 파일을 제거했습니다. 커밋은 이제 인덱스와 트리를 동기화하고 파일이 제거됩니다.


명령 후에 git rm --cachedgit diffdiff가 표시되지 않지만 git diff --cached여전히 캐시되어있는 것처럼 diff가 표시됩니다. 는 git status하지만 인으로 파일을 보여줍니다 Untracked. 일관성이없는 것 같습니다.
haridsv

7
신경 쓰지 마 ... 내가 사용해야 했어 git reset --mixed. 나는 git rm --cached반대 되는 진술에 약간 혼란 스러웠다 git add. 말 그대로, 그것은 정확하지 않으며 손상을 일으킬 수 있습니다. 필자의 경우 git add에는 스테이징 영역에 수정 된 파일을 추가하고 파일의 초기 추가가 아닌 "추가"의 반대를 원했습니다. + Greg Hewgill의 답변을 통해보다 명확한 그림을 얻을 수있었습니다.
haridsv

12
작업 사본, 트리 및 작업 트리를 사용하는 것이 약간 혼란 스럽습니다. 작업 트리는 작업 복사본입니까, 아니면 트리입니까?
Nealv

3
@haridsv가 언급했듯이 git rm --cached'정확한 반대입니다 git add file' 라고 말하는 것은 오해의 소지가 있습니다. git reset file의 반대에 가깝습니다 git add file.
Matt Browne

@Nealv는 늦었지만이 스레드를 찾는 다른 사람들을 위해 : 작업 사본, 트리 및 작업 트리는 모두 동일한 것을 참조합니다 (git의 맥락에서).
데 노보

83

아마도 예제가 도움이 될 것입니다.

git rm --cached asd
git commit -m "the file asd is gone from the repository"

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

다른 것을 변경하지 않으면 두 번째 커밋은 실제로 아무것도하지 않습니다.


3
HEAD가 실제로 의미 한 후에 이중 하이픈이 무엇인지 말해 줄 수 있습니까?
yuva

30
@yuva : --파일 이름과 명령 옵션을 구분하는 데 사용됩니다. 둘 다를이 있다면 지점파일 이름 asd, 다음 git reset HEAD asd모호 할 것이다. 는 --"모든 것을 다음이 파일 이름이다"말했다.
Greg Hewgill

인가 git reset HEAD <file>와 동일 정확히 git rm --cached <file>다음과 git add --intent-to-add <file>?
알코올은 악하다

1
특별한 경우를 제외하고 @alcoholisevil no. 훌륭한 간결한 답변을 참조하십시오 .
데 노보

45

git rm --cached file것이다 제거 단계에서 파일을. 즉, 커밋하면 파일이 제거됩니다. git reset HEAD -- file스테이징 영역의 파일을 HEAD 커밋에 있던 상태로 재설정합니다. 즉, 마지막 커밋 이후에 변경 한 사항을 취소합니다. 해당 변경으로 인해 파일이 새로 추가 된 경우에는 동일합니다.


7
git rm --cached file반대 되는 개념 (다른 답변에서 언급했듯이)과 관련 git add하여이 답변은 나에게 많은 의미가 있었고 간결했습니다. 이 의견만큼이나 짧음;)
rbatt

2
@rbatt는 의견을 여기에 넣고 명확히 git rm --cached file하는 것과 반대가 아닙니다git add file . git add file이전에 추적되지 않은 새 파일을 추가 한 특정 경우에는 동작이 반대입니다 . 다른 모든 경우의 반대 git add file이다 git reset HEAD file. git reset HEAD file또한 git add file첫 번째 경우 (추적되지 않은 파일 추가)에서 역전 되며 모든 경우에 git add를 역전하려는 경우 git이 제안하는 이유입니다.
데 노보
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.