준비 영역에서 단일 파일을 제거하는 방법은 무엇입니까?


1230

상황 : 이미 색인에 파일이있는 Git 저장소가 있습니다. 여러 파일을 변경하고 Git을 연 다음 "git add"를 사용하여이 파일을 준비 영역에 추가합니다.

질문 : 준비 영역에서 해당 파일 중 하나를 제거하지만 인덱스에서 제거하거나 파일 자체의 변경 내용을 실행 취소하지 않는 방법은 무엇입니까?


40
준비 영역 인덱스이므로 정확히 무엇을 의미하는지 명확하게 알 수 있습니까?
CB Bailey


답변:


1902

질문을 올바르게 이해하면 git add해당 파일에 대해 수행 한 질문을 "실행 취소"하려고 합니다.

준비 영역에서 단일 파일 을 제거해야하는 경우

git reset HEAD -- <file>

준비 영역에서 전체 디렉토리 (폴더) 를 제거해야하는 경우

git reset HEAD -- <directoryName>

수정 사항이 유지됩니다. 실행 git status하면 파일이 다시 한 번 수정되었지만 아직 준비되지 않은 것으로 표시됩니다.

자세한 내용은 git reset매뉴얼 페이지 를 참조하십시오.


41
고마워 ... 방금 준비된 파일 바로 위에 표시되어 있음을 알았습니다. 내가 오랫동안 그 화면을보고있는 것 같아요. 내가보고 싶은 것을 선택적으로 선택했습니다.
PHLAK

2
이것은 내가 어디에서나 얻은 모든 조언 (맨 페이지, 여기, 친구, & c)과 달리 모든 변경 사항을 취소합니다. 나는 언젠가 그것이 광고되는 것을 할 것이라고 생각하지만, 아닙니다.
rektide

6
어쨌든 저장소에 커밋이 없을 때 준비에서 파일을 제거 할 수 있습니까?
Jared Forsyth

3
나는이 질문에 계속오고있다. 더 이상 투표를 할 수없는 이유는 무엇입니까? :)
Puce September

3
@Jared Forsyth 스테이지에서 커밋되지 않은 파일을 제거하려면 git rm --cached FILE다른 답변에서 제안한 명령 을 사용하십시오 .
chmike

150
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
사실, git reset여기 에서 사용하는 것이 좋습니다 . --chached 옵션을 생략하고 다음 git rm명령을 사용하여 빠르게 슬퍼 git reset할 수 있습니다. 매일 사용하기 위해 "새로워"있도록 변경 사항을 유지하십시오 git reset --hard.
Konrad 'ktoso'Malawski

20
이 방법은 이전 커밋이없는 경우에 유용합니다.
SomeKittens

2
git rm --cached FILE작업 트리에서 파일을 삭제하지 않고 파일 삭제를 준비합니다. 이것은 실행 취소에 관한 질문과 다릅니다 git add.
Sampo Smolander

1
작업 트리에서 파일을 삭제 한 경우이 답변에서 오류가 발생합니다.
Samuel Robert

3
git rm --cached파일을 색인에서 제거 합니다. 즉, 파일이 추적되지 않은 파일이됩니다. 나는 이것이 OP가 원하는 것이라고 생각하지 않습니다. 여기에서 관련 스레드를 참조하십시오 : stackoverflow.com/questions/45047810/…
smwikipedia

88

git reset <file>

이전 커밋이 있는지 여부에 관계없이 작동합니다.


53

따라서 Tim Henigan의 답변을 약간 조정하십시오. 파일 이름 앞에-를 사용해야합니다. 다음과 같이 보일 것입니다 :

git reset HEAD -- <file>

6
무엇을 --하고 왜 추가합니까? 나는 그것을 git reset HEAD <file>했고 효과가 있었다.
Paolo

15
--일종의 분배기입니다. 파일 이름이 틀린 경우 eg ( -for master) git은 파일 이름 대신 명령 줄 인수 또는 분기 이름으로 해석합니다. 여기를 참조하십시오
Andrew

3
이것은 파일이없는 커밋이 없기 때문에 명령이없는 명령에서 나에게 도움이되었습니다. 감사.
Matt

17
git reset filename.txt

filename.txt에서 수정 한 내용이 있으면 실수로 스테이지에 추가하고 파일을 준비에서 제거하려고하지만 변경 내용을 잃고 싶지는 않습니다.


6

파일 변경 사항의 서브 세트를 제거하려는 경우 다음을 사용할 수 있습니다.

git reset -p

또는

git reset -p <file_name>

이 명령은 기본적으로 반대입니다 git add -p. 준비 영역에서 선택한 변경 사항 만 제거합니다. 실수로 추가 한 내용을 "언딩"하는 데 매우 유용합니다.



2

당신이 원하는 :

  • 단일 파일에 영향

  • 준비 영역에서 파일 제거

  • 색인에서 단일 파일을 제거하지 않습니다

  • 변경 자체를 취소하지 마십시오

해결책은

git reset HEAD file_name.ext

또는

git reset HEAD path/to/file/file_name.ext

2

할 때 git status, Git은 스테이지를 해제하는 방법을 알려줍니다.

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

그래서 git reset HEAD <file>나를 위해 일했고 변경 사항은 그대로 유지되었습니다.


2

@CB Bailey가 다음 과 같이 언급 한 것처럼 index 개념과 혼동되었을 것입니다 .

준비 영역은 인덱스입니다.

스테이징 디렉토리인덱스를 같은 것으로 고려할 수 있습니다 . @Tim Henigan의 답변
과 마찬가지로 다음과 같이 생각합니다.

git add해당 파일에 대해 수행 한 작업 을 "실행 취소"하려고 합니다.



내 대답은 다음과 같습니다.

일반적 으로 다른 답변이 이미 언급했듯이 스테이지 작업 을 실행 취소하는 두 가지 방법이 있습니다 .

git reset HEAD <file>

git rm --cached <file>

그러나 차이점은 무엇입니까?

파일이 스테이징 되고 작업 디렉토리 에도 존재 한다고 가정하고 스테이징 디렉토리 에서 파일 git rm --cached <file>을 제거하려는 경우 사용 하고 파일을 작업 디렉토리 에 유지하십시오 . 그러나이 작업은에서 파일을 제거하지 않습니다 통지 스테이징 디렉토리 에 파일을로뿐만 아니라 표시 에 디렉토리를 준비 당신이 사용하는 경우,deleted

git status

이 작업 후에 다음이 표시됩니다.

        deleted:    <file>

스테이징 디렉토리 에서 파일을 제거한 레코드입니다 . 해당 레코드를 유지하지 않고 단순히 파일의 이전 단계 작업을 실행 취소하려는 경우 git reset HEAD <file>대신 사용하십시오.


-------- 답변의 끝 --------

추신 : 나는 언급 된 답변을 발견했습니다.

git checkout -- <file>

파일이되었을 때이 명령은 상황이다 개최 하지만, 파일에 수정 된 작업 디렉토리 가있는 파일을 복원하려면이 작업을 사용, 개최 후 작업 디렉토리 에서 디렉토리를 준비 . 즉,이 작업 후 스테이징 디렉토리가 아닌 작업 디렉토리 에서 변경 사항이 발생합니다 .


2

버전 이후 2.23Git은이 git restore를 수행하는 데 사용할 수 있는 명령을 도입 했습니다. 공식 문서 인용 :

작업 트리에서 지정된 경로를 복원 소스의 일부 내용으로 복원하십시오. 경로가 추적되었지만 복원 소스에 존재하지 않으면 소스와 일치하도록 경로가 제거됩니다.

이 명령을 사용하여을 사용하여 색인의 내용을 복원하거나을 사용 --staged하여 작업 트리와 색인을 모두 복원 할 수 있습니다 --staged --worktree.

따라서 git restore --staged <path>파일을 호출 하고 스테이지 해제 할 수 있지만 변경 한 내용도 유지할 수 있습니다. 파일이 준비되지 않은 경우 파일에 대한 모든 변경 사항이 손실됩니다.


1

많은 추적 된 파일을 변경했지만 그 중 몇 개만 준비하려는 경우

git add .

추적 된 모든 파일을 준비하기 때문에 항상 바람직하지 않거나 권장되는 것은 아닙니다 (일부 경우에만 변경 사항을 유지하고 원격 저장소에 저장하지 않으려는 경우).

또한 무리를하는 것이 이상적이지 않습니다.

git add path/to/file1 path/to/file2

중첩 된 디렉토리가 많은 경우 (대부분의 프로젝트의 경우)-성가신

그것은 Git GUI가 도움이 될 때입니다 (아마도 그것을 사용했을 때만). Git GUI를 열면 스테이지 및 스테이지되지 않은 파일 섹션이 표시됩니다. 준비를 해제하려는 준비된 섹션에서 파일을 선택하고

Ctrl+U (윈도우 용)

무대를 비우기 위해.


1

최신 버전의 Git에는 git restore --staged <file>.

git statusGit 버전으로 할 때 2.26.2.windows.1언 스테이징에도 권장됩니다.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( 게시물은 이전 버전 git reset HEAD에서이 시점에서 권장 되었음을 보여줍니다 )

내가보기 엔 추천 사이의 차이점을 설명하는 글을 git revert, git restoregit reset과도 추가 매개 변수 git restore.


0

내 샘플 :

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

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

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

알다시피

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

-1

파일의 디렉토리에 있어야하고 터미널에 다음을 입력하십시오.

git reset HEAD .

가정은 하나의 파일 만 재설정해야한다는 것입니다.



-10

git checkout -- <file>

스테이징 영역에서 파일을 완벽하게 제거합니다.


4
아래에서 언급 한 것처럼 파일 변경 사항을 되 돌리면 OP가 원하는 것보다 한 단계 더 발전합니다.
stolli

git rm flie.txt --cached
Juan Ramirez

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