커밋하기 전에 'git add'를 어떻게 취소합니까?


8960

명령을 사용하여 실수로 Git에 파일을 추가했습니다.

git add myfile.txt

나는 아직 달리지 않았다 git commit. 이를 취소 할 수있는 방법이 있습니까? 그래서이 파일들은 커밋에 포함되지 않습니까?


22
Git v1.8.4부터는 아래의 모든 답변 이 대신 사용 HEAD되거나 대신 head사용될 수 있습니다 . 왜 그렇게 할 수 있는지 알아 보려면 이 답변 (마지막 섹션) 을 참조하십시오 . @HEAD

3
파일을 언 스테이지하는 모든 방법을 보여주는 약간 여름이되었습니다 : stackoverflow.com/questions/6919121/…
Daniel Alder

5
왜 git checkout하지 않습니까?
Erik Reppen

13
@ErikReppen git checkout은 커밋 인덱스에서 단계적 변경 사항을 제거하지 않습니다. 그것은 단계적으로 변경되지 않은 변경 사항을 마지막 커밋 된 개정으로 되돌립니다. 어쨌든 내가 원하는 것이 아니며, 변경 사항을 원합니다.
paxos1977

4
Eclipse를 사용하는 경우 커밋 대화 상자에서 파일을 선택 해제하는 것만 큼 간단합니다.
Hamzahfrq

답변:


10365

git add커밋하기 전에 실행 취소 할 수 있습니다

git reset <file>

다른 것을 변경하지 않고 현재 인덱스 ( "커밋 예정"목록)에서 제거합니다.

당신이 사용할 수있는

git reset

파일 이름이 없어서 모든 변경 사항을 취소 할 수 있습니다. 합리적인 시간에 하나씩 나열 할 파일이 너무 많을 때 유용합니다.

이전 버전의 Git에서 위의 명령은 각각 git reset HEAD <file>과 동일하며 정의되지 않은 git reset HEAD경우 HEAD(아직 저장소에서 커밋하지 않았기 때문에) 또는 모호한 경우 (라는 분기를 만들었 기 때문에 HEAD멍청한 일입니다) 하지 말아야합니다). 그러나 이것은 Git 1.8.2에서 변경 되었으므로 최신 버전의 Git에서는 처음 커밋하기 전에도 위 명령을 사용할 수 있습니다.

히스토리에 커밋이 없을 때 오류를 발생시키는 데 사용되는 "git reset"(옵션 또는 매개 변수 없음)이 있지만 현재 존재하지 않는 커밋과 일치하지 않는 빈 인덱스를 제공합니다.


92
물론, git add이전 단계의 커밋되지 않은 버전을 잘못 덮어 쓴 경우 복구 할 수 없기 때문에 이것은 실행 취소가 아닙니다 . 나는 아래 답변에서 이것을 명확히하려고 노력했다.
leonbloy

7
git reset HEAD *.extext추가 할 특정 확장자의 파일은 어디에 있습니까? 나를 위해 그것은 *.bmp&*.zip
boulder_ruby

18
@Jonny, 색인 (일명 준비 영역)은 변경된 파일뿐만 아니라 모든 파일을 포함 합니다. HEAD가 가리키는 커밋의 모든 파일의 복사본으로 "라이브를 시작합니다"(커밋을 체크 아웃하거나 리포지토리를 복제 할 때). 따라서 색인 ( ) 에서 파일 을 제거 하면 해당 파일 git rm --cached삭제 하는 커밋을 준비하고 있음을 의미 합니다. git reset HEAD <filename>반면에 파일은 HEAD에서 인덱스로 파일을 복사하므로 다음 커밋에는 해당 파일에 대한 변경 사항이 표시되지 않습니다.
와일드 카드

11
난 그냥이 있음을 발견 한 git reset -p것처럼 git add -p. 대단해!
donquixote

10
실제로 이전에 준비되었지만 커밋되지 않은 변경 사항을 덮어 쓸 수 있지만 사용자 친화적 인 방법으로 100 % 안전하지는 않습니다 (적어도 내가 찾은 것 없음) : goto .git / objects, git add복구 할 때 생성 된 파일 검색 ( 61/3AF3...- > object id 613AF3...), 그런 다음 git cat-file -p <object-id>(몇 시간의 작업을 복구하고 더 자주 커밋하는 교훈을 얻을 가치가있을 수 있습니다 ...)
Peter Schneider

2151

당신이 원하는 :

git rm --cached <added_file_to_undo>

추리:

내가 이것을 처음 접했을 때, 나는 처음 시도했다

git reset .

(전체 초기 추가를 실행 취소하려면) 유용한 메시지 만 표시하십시오.

fatal: Failed to resolve 'HEAD' as a valid ref.

HEAD ref (branch?)는 첫 번째 커밋 이후까지 존재하지 않기 때문입니다. 즉, 내 워크 플로가 다음과 같은 경우 초보자와 같은 문제가 발생합니다.

  1. 내 새 프로젝트 디렉토리로 이동하여 Git을 시험해 보자.
  2. git init
  3. git add .
  4. git status

    ... 많은 쓰레기 스크롤 ...

    => 젠장, 나는 그 모든 것을 추가하고 싶지 않았습니다.

  5. 구글 "실행 취소 git add"

    => 스택 오버플로 찾기-예

  6. git reset .

    => 치명적인 : 'HEAD'를 유효한 참조로 해결하지 못했습니다.

또한 메일 링리스트에 도움이되지 않는 버그가 기록 되어 있습니다.

그리고 올바른 해결책은 Git 상태 출력에 있습니다 (예, 나는 '쓰레기'로 빛났습니다)

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

그리고 해결책은 실제로 사용하는 것 git rm --cached FILE입니다.

다른 곳의 경고에주의하십시오- git rm파일의 로컬 작업 복사본을 삭제하지만 --cached 를 사용하는 경우는 아닙니다 . 결과는 다음과 같습니다 .git help rm

--cached이 옵션을 사용하면 인덱스에서만 경로를 준비 해제하고 제거 할 수 있습니다. 작업 트리 파일은 수정 여부에 관계없이 남아 있습니다.

사용을 진행합니다

git rm --cached .

모든 것을 제거하고 다시 시작하십시오. add .재귀 하는 동안 재귀가 rm필요 -r하기 때문에 작동하지 않았습니다 . 한숨.

git rm -r --cached .

이제 시작한 곳으로 돌아갑니다. 다음 번 -n에는 드라 이런을하고 무엇이 추가 될지 살펴 보겠습니다 .

git add -n .

나는 아무것도 파괴하지 않는 것에 git help rm대해 믿기 ​​전에 모든 것을 안전한 장소에 압축했다 --cached.


15
하 나는이 같은 과정을 따랐다. 나는 포기하고 말했다 제외하고 rm -rf .git, git init내가 신뢰하지 않았기 때문에 git rm --cached내 작업 복사본을 유지. 그것은 어떤 곳에서 git이 여전히 지나치게 복잡하다는 것에 대해 조금 말합니다. git unstage주식 표준 명령이어야하며 별칭으로 추가 할 수 있는지 상관하지 않습니다.
Adrian Macneil

5
나를 위해 git 말한다git reset HEAD <File>...
drahnr

16
git rm --cached <file>은 <file>을 저장소로 처음 가져 오는 경우 실제로 정답입니다. 파일의 변경 사항을 단계적으로 해제하려는 경우 git reset이 정답입니다. 이 답변이 잘못되었다고 말하는 사람들은 다른 질문을 생각하고 있습니다.
Barry Kelly

14
이것은 실제로 작동하지만 파일이 이전에 존재하지 않았거나 명령이 새 파일을 추가 했지만 기존 파일을 변경 하지 않은 첫 번째 커밋 에서만 작동 합니다. git add
naught101

4
직관적이지 않고 복잡한 자식이 얼마나되는지 보여줍니다. 병렬 "실행 취소"명령을 사용하는 대신 명령을 실행 취소하는 방법을 찾아야합니다. 다리를 빠른 모래에 풀어 놓은 다음 팔을 고착시키고 다른 팔을 고착시키는 것처럼 모든 명령은 GUI를 통해 수행되어야하며 옵션에 대한 드롭 다운 메뉴 항목이 있습니다. 우리는 생산성 향상을 얻었지만 레트로 명령 행 인터페이스가 엉망입니다. git GUI 프로그램이 이것을 더 직관적으로 만드는 것과는 다릅니다.
ahnbizcad

532

입력하면 :

git status

Git은 스테이지를 해제하는 방법에 대한 지시 사항을 포함하여 스테이지 등을 알려줍니다.

use "git reset HEAD <file>..." to unstage

나는 Git이 이런 상황에서 옳은 일을하도록 방해하는 꽤 좋은 일을한다는 것을 알았습니다.

참고 : 최근 Git 버전 (1.8.4.x)에서이 메시지가 변경되었습니다.

(use "git rm --cached <file>..." to unstage)

19
added 파일이 이미 추적되고 있는지에 따라 메시지가 달라집니다 ( add캐시에 새 버전 만 저장 한 경우 여기에 메시지가 표시됨). 파일이 이전에 준비되지 않은 경우 파일이 표시됩니다.use "git rm --cached <file>..." to unstage
leonbloy

큰! git reset HEAD <file>한 경우에 작동합니다 하나만 삭제 파일 unstage 할 것입니다
skerit

2
내 자식 버전 2.14.3 git reset HEAD이 무대에서 나오 라고 말합니다 .
SilverWolf-복원 Monica Monica

246

명확히하려면 : git add현재 작업 디렉토리에서 스테이징 영역 (인덱스) 으로 변경 사항을 이동 합니다.

이 프로세스를 준비 라고 합니다. 가장 자연스러운 명령을 할 수 있도록 무대 의 변경 (변경 파일) 명백한 하나입니다 :

git stage

git add 입력하기 쉬운 별칭입니다. git stage

동정 git unstage이나 git unadd명령 이 없습니다 . 관련있는 것은 추측하거나 기억하기가 어렵지만 매우 분명합니다.

git reset HEAD --

이에 대한 별칭을 쉽게 만들 수 있습니다.

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

마지막으로 새로운 명령이 있습니다.

git add file1
git stage file2
git unadd file2
git unstage file1

개인적으로 나는 더 짧은 별칭을 사용합니다.

git a # For staging
git u # For unstaging

3
"이동"? 이것은 작업 디렉토리에서 벗어 났음을 나타냅니다. 그렇지 않습니다.
Thomas Weller

4
왜 명백한가?
Lenar Hoyt

실제로 Git 및 기타 SCM에서 역사적인 명령 git stage인의 별칭입니다 git add. 내가 말할 수 있다면 그것은 "Git 's git repository"에 commit 11920d28da와 함께 2008 년 12 월에 추가되었다.
흑요석

1
이것은 관련이 없지만, check-command filename && git add filename과 같은 유용한 아이디어로 추가하기 전에 파일을 검증하는 것을 발견했습니다. 내 기계에서 git을 더 짧은 g로 대체했으며 지금까지는 효과가있었습니다. 나를 위해 좋아 : github.com/dataf3l/g , 이것이 누군가에게 유용한 지 모르겠지만, 사람들의 시간을 절약하기 위해 여기에 넣겠습니다.
Felipe Valdes

167

수락 된 답변 외에도 실수로 추가 된 파일이 크면 ' git reset'로 색인에서 파일을 제거한 후에도 여전히 .git디렉토리의 공간을 차지하는 것으로 보입니다 .

이것은 걱정할 것이 없습니다. 파일은 실제로 저장소에 있지만 "느슨한 개체"로만 존재합니다. 복제, 푸시를 통해 다른 리포지토리에 복사되지 않으며 결국 공간은 곧 재생됩니다. 불안한 경우 다음을 실행할 수 있습니다.

git gc --prune=now

업데이트 (다음은 가장 많이 답변 된 답변에서 발생할 수있는 혼란을 없애려는 나의 시도입니다) :

그렇다면 실제 실행 취소 는 어느 것 git add입니까?

git reset HEAD <file> ?

또는

git rm --cached <file>?

엄밀히 말하면, 내가 실수하지 않으면 : none .

git add 일반적으로 안전하게 취소 할 수 없습니다 .

git add <file>실제로 실제로 무엇을하는지 생각해 보자 .

  1. 경우 <file>이전에 추적되지 않습니다 , git add 캐시에 추가 현재의 내용으로.

  2. 경우 <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의 의견 참조)


4
엄밀히 말하면 git add로 대체 된 이미 준비된 파일을 복구하는 방법이 있습니다. 언급했듯이 git add는 파일을 완전히 제거 할 때뿐만 아니라 새로운 내용으로 덮어 쓸 때 느슨한 객체가되는 해당 파일에 대한 git 객체를 만듭니다. 그러나 자동 복구 명령은 없습니다. 대신 수동으로 또는이 경우에만 작성된 도구를 사용하여 파일을 식별하고 추출해야합니다 (libgit2가이를 허용 함). 그러나 파일이 매우 중요하고 크며 이전 버전을 편집하여 다시 빌드 할 수없는 경우에만 지불합니다.
Johannes Matokic

2
스스로 해결하려면 : 느슨한 오브젝트 파일이 발견되면 (작성 날짜 / 시간과 같은 메타 데이터 사용) git cat-file컨텐츠를 복구하는 데 사용될 수 있습니다.
Johannes Matokic

2
또 다른 방법 개최 되었으나 확정되지 다음 덮어되었다 변경 복구 다른 예로는 git add경유 git fsck --unreachable그건 당신이 그때까지 검사 할 수있는 모든 도달 할 수없는 OBJ를 나열됩니다 git show SHA-1_ID또는 git fsck --lost-found그 의지> 쓰기에 물체를달라고 .git/lost-found/commit/하거나 .git/lost-found/other/, 종류에 따라. 참조git fsck --help
iolsmit

110

이미 추가 된 파일을 취소 하면 Git을 사용하는 것이 매우 쉽습니다. myfile.txt이미 추가 된 재설정의 경우 다음을 사용하십시오.

git reset HEAD myfile.txt

설명:

원하지 않는 파일을 준비한 후 실행 취소하려면을 수행 할 수 있습니다 git reset.Head은 로컬의 파일 헤드이고 마지막 매개 변수는 파일 이름입니다.

아래 이미지에서 이러한 경우에 발생할 수있는 모든 단계를 포함하여 자세한 내용을 아래 단계에서 만들었습니다.

자식 재설정 HEAD 파일


이미지 : "명령 추가는 ...""명령은 ... 추가" ( 현재 단순 시제, 세 번째 사람 )
피터 모텐슨

이미지 : 싶어원하는 (사용 속어 할 필요가 여기에 없음)
피터 모텐슨

92
git rm --cached . -r

현재 디렉토리에서 추가 한 모든 내용을 재귀 적으로 "추가 취소"합니다.


3
하나의 특정 파일 만 모든 것을 추가 취소하려고하지 않았습니다.
paxos1977

3
이전 커밋이없는 경우에도 유용합니다. 이전 커밋의 부재에서, git reset HEAD <file>말할 것fatal: Failed to resolve 'HEAD' as a valid ref.
프리 야 란잔 싱

6
아니, 이건 추가 삭제 현재 디렉토리에있는 모든의를. 준비되지 않은 변경과는 매우 다릅니다.
Mark Amery

88

운영

git gui

수동으로 또는 모든 파일을 선택하고 커밋 에서 언 스테이지 버튼을 클릭하여 모든 파일을 제거하십시오 .


1
예, 이해합니다. 난 당신이 "당신이 사용할 수 있습니다 git-gui...." 와 같은 당신의 대답을 암시 적으로 암시하고 싶었습니다 .
Alexander Suraphel

1
"git-gui : command not found"라고 말합니다. 이것이 작동하는지 확실하지 않습니다.
Parinda Rajapaksha

와우, 이것은 당신이 이해하지 못하는 명령 줄을하는 것보다 훨씬 간단합니다. 이것은 나와 같은 초보자에게 권장됩니다. 작성해 주셔서 감사합니다!
Irfandy Jip

감사. 위험을 감수하고 싶지 않았으므로 GUI를 사용해야했습니다.
Sagar Khatri

83

힘내 상상할 수있는 모든 행동에 대한 명령을 가지고 있지만, 물건을 올바르게 얻기 위해서는 광범위한 지식이 필요하며 그로 인해 반 직관적입니다 ...

당신이 전에 한 일 :

  • 파일을 변경하고 git add ., 또는를 사용했습니다 git add <file>.

당신이 원하는 것 :

  • 색인에서 파일을 제거하되 작업 사본에서 커밋되지 않은 변경 사항을 유지하고 버전을 유지하십시오.

    git reset head <file>
    
  • 변경 사항을 취소하고 색인에서 제거하여 HEAD에서 파일을 마지막 상태로 재설정하십시오.

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    git reset --hard HEAD단일 파일에서는 작동하지 않으므로 필요 합니다.

  • <file>버전이없는 파일을 작업 사본의 변경 사항과 함께 유지하면서 색인 및 버전 관리에서 제거하십시오 .

    git rm --cached <file>
    
  • <file>작업 복사본 및 버전 관리에서 완전히 제거하십시오 .

    git rm <file>
    

1
'git reset head <file>'과 'git rm --cached <file>의 차이점을 이해할 수 없습니다. 설명해 주시겠습니까?
jeswang

6
@jeswang 파일은 git to 'known'이거나 (변경 사항을 추적하고 있습니다.) 'versioned'가 아닙니다. reset head현재 변경 사항을 취소하지만 파일은 여전히 ​​git에 의해 모니터링되고 있습니다. rm --cached파일을 버전 관리에서 꺼내어 git은 더 이상 변경 사항을 확인하지 않으며 (또한 이전에 git에 지시 된 색인 된 현재 변경 사항을 제거합니다 add) 변경된 파일은 작업 복사본, 즉 파일 폴더에 보관됩니다 HDD에.
sjas

3
차이점은 git reset HEAD <file>일시적입니다. 명령은 다음 커밋에만 적용되지만 git rm --cached <file>을 (를) 다시 추가 할 때까지 스테이지를 해제합니다 git add <file>. 또한 git rm --cached <file>해당 분기를 원격으로 푸시하면 분기를 당기는 사람은 파일을 폴더에서 실제로 삭제하게됩니다.
DrewT

80

문제는 명확하게 제기되지 않습니다. 그 이유는 git add두 가지 의미가 있습니다.

  1. 준비 영역에 새 파일 을 추가 한 다음로 실행 취소하십시오 git rm --cached file.
  2. 스테이징 영역에 수정 된 파일을 추가 한 다음로 실행 취소하십시오 git reset HEAD file.

확실하지 않은 경우

git reset HEAD file

두 경우 모두 예상되는 작업을 수행하기 때문입니다.

경고 : 당신이 할 경우 git rm --cached file한 파일에 수정 (저장소에 이전에 존재했던 파일), 다음 파일에 제거됩니다 git commit! 파일 시스템에는 여전히 존재하지만 다른 사람이 커밋을 가져 오면 파일이 작업 트리에서 삭제됩니다.

git status파일이 새 파일 인지 또는 수정 되었는지 알려줍니다 .

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

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

7
+1. 이 페이지에 대한 많은 찬사를받은 답변과 의견은의 행동에 대해 잘못 설명되어 있습니다 git rm --cached somefile. 이 답변이 페이지가 모든 허위 주장에 의해 오도되는 것을 막을 수있는 눈에 띄는 위치로 나아가기를 바랍니다.
Mark Amery

여기에 가장 좋은 답변 중 하나, 슬프게도 목록에 상당히 낮습니다
Creos

64

초기 커밋에 있고 사용할 수없는 경우 git reset"Git 파산"을 선언하고 .git폴더를 삭제 하고 다시 시작하십시오.


5
한 가지 팁은 폴더를 삭제하기 전에 원격 원점을 추가 한 경우 .git / config 파일을 복사하는 것입니다.
Tiago

4
@ChrisJohnsen의 코멘트가 자리 잡고 있습니다. 때로는 하나를 제외한 모든 파일을 커밋하려고합니다. git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (이것은 이전 커밋이없는 경우에도 Failed to resolve 'HEAD'문제 가 다시 발생 함)

57

다른 많은 답변에 따라 사용할 수 있습니다 git reset

그러나:

실제로 Git 명령을 추가하는 훌륭한 작은 게시물을 찾았 습니다. 자세한 내용 git unaddgit unadd 를 참조하십시오.

간단히,

git config --global alias.unadd "reset HEAD"

지금 당신은 할 수 있습니다

git unadd foo.txt bar.txt

45

git add -i다음 커밋에서 방금 추가 한 파일을 제거하는 데 사용 합니다. 예:

원하지 않는 파일 추가 :

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

대화식 add로 들어가서 add 명령을 취소하려면 (git에 입력 한 명령은 "r"(revert), "1"(목록 revert가 표시되는 첫 번째 항목), 'return'을 눌러 되돌리기 모드에서 빠져 나오고, "q") (떠나다):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

그게 다야! 다음은 "foo"가 추적되지 않은 목록에 있음을 보여주는 증거입니다.

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

42

git remove또는 플래그 git rm와 함께 사용할 수 있습니다 --cached. 시험:

git help rm

9
이것이 파일을 완전히 제거하지 않습니까?
Willa

8
git rm --cached ...git repo에서 파일을 제거합니다. 그것들은 여전히 ​​컴퓨터에 존재하지만 이것은 파일의 스테이징 변경 과는 매우 다릅니다 . 이것에 걸려 넘어지는 사람에게는 질문에 대한 올바른 대답이 아닙니다.
애디슨

38

새 프로젝트를 시작할 때이 문제를 피하는 방법은 다음과 같습니다.

  • 새 프로젝트의 기본 디렉토리를 작성하십시오.
  • 운영 git init .
  • 이제 비어있는 경우에도 .gitignore 파일을 만듭니다.
  • .gitignore 파일을 커밋하십시오.

힘내 정말 힘들다 git reset 커밋이 없으면 . 당신이 작은 초기, 그냥 하나를 갖는 위해 커밋 만드는 경우 이후에 가능하다고 git add -A하고git reset 당신이 모든 권리를 얻기 위해 원하는만큼 여러 번.

이 방법의 또 다른 장점은 나중에 줄 끝 문제가 발생하여 모든 파일을 새로 고쳐야하는 경우 쉽다는 것입니다.

  • 초기 커밋을 확인하십시오. 모든 파일이 제거됩니다.
  • 그런 다음 가장 최근 커밋을 다시 확인하십시오. 현재 줄 끝 설정을 사용하여 파일의 새로운 사본을 검색합니다.

1
확인했습니다! git add 후 git reset을 시도했습니다. git은 손상된 HEAD에 대해 불평했습니다. 당신의 조언에 따라, 나는 문제없이 앞뒤로 git add & reset 할 수 있습니다 :)
Kounavi

1
두 번째 부분은 효과가 있지만 약간 어색합니다. 줄 끝을 처리하는 방법은 autocrlf값에 따라 다릅니다 ... 설정에 따라 모든 프로젝트에서 작동하지는 않습니다.
sjas

1
이 답변은 게시 당시에는 합리적 이었으나 이제는 더 이상 사용되지 않습니다. git reset somefilegit reset(가) 첫째, 지금 커밋 만들기 위해 모두 일 이전에. 여러 Git이 다시 릴리스 된 이후로이 경우에 해당합니다.
Mark Amery

@MarkAmery, 당신이 옳을 수도 있지만 (어설 션 소스를 게시하면 멋지지만) 깨끗한 커밋 또는 두 번으로 리포를 시작하는 데 여전히 가치가 있습니다.
Ryan Lundy

34

아마 Git은 질문을 게시 한 후 진화했을 것입니다.

$> git --version
git version 1.6.2.1

이제 시도해 볼 수 있습니다 :

git reset HEAD .

이것은 당신이 찾고있는 것이어야합니다.


2
물론 개 이상의 파일 중 하나를 추가 해제하는 방법에 대한 후속 질문이 있습니다. "git reset"매뉴얼은 "git reset <paths>"는 "git add <paths>"와 반대라고 언급합니다.
Alex North-Keys

34

개정을 지정하지 않으면 구분 기호를 포함해야합니다. 내 콘솔의 예 :

git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

git reset -- <path_to_file>
Unstaged changes after reset:
M    <path_to_file>

(Git 버전 1.7.5.4)


2
나는 시도 git reset <path>하고 구분 기호없이 잘 작동합니다. 또한 git 1.9.0을 사용하고 있습니다. 이전 버전에서는 작동하지 않을 수 있습니까?

31

위에서 제안한대로 준비 영역에서 새 파일을 제거하려면 (새 파일의 경우에만) :

git rm --cached FILE

실수로 추가 한 새 파일에 대해서만 rm --cached를 사용하십시오.


4
--cached여기가 정말 중요한 부분 이라는 것을 명심 하십시오.
takeshin

1
-1; 아니요, 파일의 스테이지를 해제하지 않고 실제로 파일을 삭제하지 않고 파일 삭제를 준비합니다.
Mark Amery

25

특정 폴더 (및 해당 하위 폴더)의 모든 파일을 재설정하려면 다음 명령을 사용할 수 있습니다.

git reset *

4
실제로 *는 쉘 확장을 사용하고 도트 파일 (및 도트 디렉토리)을 무시하기 때문에 모든 파일을 재설정하지는 않습니다.
Luc

당신은 git status남아있는 것을보고 수동으로 재설정 할 수 있습니다 git reset file.
Zorayr

25

*명령을 사용하여 한 번에 여러 파일을 처리 하십시오 .

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

기타


3
그 * 보통 dotfiles를 포함하거나 '점 디렉토리'를 명시 적으로 지정하지 않는 한하지 않습니다 마음 .*또는.*.prj

23

그냥 입력 git reset이 다시 복귀하고 사용자가 입력 결코처럼은 git add .마지막 커밋 때문이다. 전에 커밋했는지 확인하십시오.


그것이 일어날 때, 마지막 커밋이 있었지만 커밋의 모든 파일이 아니라 커밋에서 단일 파일을 제거하는 것에 대해 구체적으로 묻고있었습니다.
paxos1977

20

새 파일을 작성한다고 가정하십시오 newFile.txt.

여기에 이미지 설명을 입력하십시오

실수로 파일을 추가한다고 가정 해보십시오 git add newFile.txt.

여기에 이미지 설명을 입력하십시오

이제 커밋 전에이 추가를 취소하고 싶습니다 git reset newFile.txt.

여기에 이미지 설명을 입력하십시오


내가 "git.add"조차하지 않았다는 것을 의미하는 첫 번째 그림에 있다고 가정하자. 또한, 나는이 모든 변화를 원하지 않습니다. git status를 할 때 빨간색 파일이 표시되지 않아야합니다. 마지막 git push 이후 변경된 단일 파일이없는 것처럼 동기화되어야한다는 것을 의미합니다. 그것을 달성하는 방법.
깨지지 않는

따라서 첫 단계에 있다고 가정하십시오. 그리고 "newFile.txt"가 빨간색으로 나타나도록하는 모든 변경을 제거하고 싶습니다.
깨지지 않는

내가 자식 상태를 할 때. 전혀 변화가 없어야합니다. 빨간색 파일은 모두 되돌려 야합니다.
깨지지 않는

안녕하세요, 귀하의 질문은 현재 트리에서 추적되지 않은 파일을 제거하는 방법입니다. 이를 위해 "git clean -f -d"를 사용할 수 있습니다. 추적되지 않은 디렉토리도 제거됩니다.
Vidura Mudalige

추적되지 않은 파일을 삭제하지 않으려면 "-f"플래그를 무시하십시오.
Vidura Mudalige

19

특정 파일의 경우 :

  • 자식 재설정 my_file.txt
  • 자식 체크 아웃 my_file.txt

추가 된 모든 파일 :

  • git reset.
  • git checkout.

참고 : 체크 아웃 은 파일의 코드를 변경하고 마지막 업데이트 (커밋 된) 상태로 이동합니다. reset 은 코드를 변경하지 않습니다. 그냥 헤더를 재설정합니다.


3
사이의 차이를 설명해주십시오 git reset <file>git checkout <file>.
Trent

1
reset은 파일을 바꾸지 않고 단지 스테이지에서 멀리 떨어 뜨려 놓는다 (= 인덱스, git add에 의해 저장된 위치)
franc

체크 아웃 파일의 코드를 변경하고 마지막으로 업데이트 된 상태로 이동합니다. reset은 코드를 변경하지 않고 헤더를 재설정합니다. 예를 들어, 푸시 및 체크 아웃 전에 git add 이전의 마지막 업데이트 / 커밋 된 단계로 돌아 가기 전에 재설정 된 추가 또는 커밋 된 파일의 사용을 재설정하십시오.
Hasib Kamal

1
reset = 파일을 스테이지에서 제거하지만 변경 사항은 계속 유지됩니다. 체크 아웃 = 저장소에서 업데이트 된 파일을 가져 와서 현재 파일보다 우선합니다
이맘 벅스

14

이 명령은 변경 사항을 해제합니다.

git reset HEAD filename.txt

당신은 또한 사용할 수 있습니다

git add -p 

파일의 일부를 추가합니다.


14

대화식 모드도 있습니다.

git add -i

옵션 3을 선택하여 파일을 추가 해제하십시오. 제 경우에는 종종 하나 이상의 파일을 추가하고 싶습니다. 대화식 모드에서는 이와 같은 숫자를 사용하여 파일을 추가 할 수 있습니다. 4 : 1, 2, 3, 5를 제외한 나머지는 모두 걸립니다.

순서를 선택하려면 1-5를 입력하여 1에서 5까지를 모두 취하십시오.

힘내 준비 파일


"나는 아무도 대화 형 모드를 언급 없다 놀랐어요" - 그들이 한 : stackoverflow.com/a/10209776/1709587
마크 Amery


10
git reset filename.txt

다른 것을 변경하지 않고 현재 색인에서 "약속 예정"영역의 filename.txt라는 파일을 제거합니다.


10

git add myfile.txt # 커밋 할 목록에 파일이 추가됩니다.

이 명령과는 정반대입니다.

git reset HEAD myfile.txt  # This will undo it.

따라서 이전 상태에있게됩니다. 지정되지 않은 목록에 다시 지정됩니다 (이전 상태).

지정된 파일로 머리를 재설정합니다. 따라서 머리에 의미가 없으면 간단히 재설정됩니다.


9

Sourcetree에서는 GUI를 통해이를 쉽게 수행 할 수 있습니다. Sourcetree에서 파일을 언 스테이지하는 데 사용하는 명령을 확인할 수 있습니다.

새 파일을 만들어 Git에 추가했습니다. 그런 다음 Sourcetree GUI를 사용하여 스테이지를 해제했습니다. 결과는 다음과 같습니다.

준비 파일 [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-경로 /to/file/filename.java

Sourcetree는 reset새 파일을 스테이지 해제하는 데 사용 합니다.


예, TortoiseGit 과 동일한 기술을 사용 하여 일반적인 사용 사례에 대한 Git 명령을 얻을 수 있습니다 .
피터 Mortensen

8
git reset filename.txt  

다른 것을 변경하지 않고 현재 색인에서 "약속 예정"영역의 filename.txt라는 파일을 제거합니다.


git reset [파일 이름] 예 : git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.