etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 9. 25. 23:42
반응형

질문자 :paxos1977


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

 git add myfile.txt

git commit 실행하지 않았습니다. 이 파일을 커밋에 포함하지 않도록 취소할 수 있는 방법이 있습니까?



답변자 : genehack


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

 git reset <file>

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

당신이 사용할 수있는

 git reset

모든 변경 사항을 언스테이징하기 위해 파일 이름 없이. 파일이 너무 많아 적당한 시간에 하나씩 나열할 수 없을 때 유용할 수 있습니다.

Git의 이전 버전에서 위의 명령은 각각 git reset HEAD <file>git reset HEAD HEAD 가 정의되지 않았거나(아직 저장소에 커밋을 하지 않았기 때문에) 모호한 경우 실패합니다. HEAD 라는 브랜치를 만들었습니다. 이것은 당신이 해서는 안 되는 어리석은 일입니다. 이것은 Git 1.8.2에서 변경 되었으므로 최신 버전의 Git에서는 첫 번째 커밋을 하기 전에도 위의 명령을 사용할 수 있습니다.

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

문서: 자식 재설정



답변자 : Rhubarb


당신이 원하는:

 git rm --cached <added_file_to_undo>

추리:

처음 접했을 때 처음 시도한

 git reset .

(내 전체 초기 추가를 취소하기 위해), 이 (그렇지 않은) 유용한 메시지를 얻기 위해서만:

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

이것은 HEAD ref(branch?)가 첫 번째 커밋 이후까지 존재하지 않기 때문입니다. 즉, 나와 같은 워크플로가 다음과 같은 경우 나와 같은 초보자의 문제에 직면하게 됩니다.

  1. 내 멋진 새 프로젝트 디렉토리로 cd하여 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 .

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



답변자 : Paul Beckingham


다음을 입력하는 경우:

 git status

Git은 스테이징 해제 방법에 대한 지침을 포함하여 스테이징된 항목 등을 알려줍니다.

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

나는 Git이 이와 같은 상황에서 올바른 일을 하도록 유도하는 꽤 좋은 일을 한다는 것을 알았다.

참고: 최근 Git 버전(1.8.4.x)은 다음 메시지를 변경했습니다.

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


답변자 : takeshin


명확히 하기 위해: 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


답변자 : leonbloy


허용되는 답변에 추가하여 실수로 추가한 파일이 큰 경우 ' 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'를 수행하는 일반적인 게으른 워크플로(사례 1)를 따르고 커밋, git commit -a 명령을 통해 새 내용을 업데이트하는 경우 이는 그리 중요하지 않습니다.


* (편집: 위의 내용은 실질적으로 정확하지만, 단계적이지만 커밋되지 않고 덮어쓰여진 변경 사항을 복구하기 위한 약간의 해킹/복잡한 방법이 있을 수 있습니다. Johannes Matokic 및 iolsmit의 의견 참조)



답변자 : Alireza


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

 git reset HEAD myfile.txt

설명:

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

다음과 같은 경우에 발생할 수 있는 모든 단계를 포함하여 더 자세한 정보를 위해 아래 이미지의 단계를 만들었습니다.

자식 리셋 HEAD 파일



답변자 : braitsch


git rm --cached . -r

현재 디렉토리에서 추가한 모든 항목을 재귀적으로 "추가 해제"합니다.



답변자 : sjas


Git은 상상할 수 있는 모든 작업에 대한 명령을 가지고 있지만 일을 올바르게 하려면 광범위한 지식이 필요하고 기껏해야 직관적이지 않습니다...

이전에 수행한 작업:

  • 파일을 변경하고 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>


답변자 : Khaja Minhajuddin


운영

 git gui

수동으로 또는 모든 파일을 선택하고 커밋에서 스테이지 해제 버튼을 클릭하여 모든 파일을 제거합니다.



답변자 : Michael_Scharf


질문이 명확하게 제기되지 않습니다. 그 이유는 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


답변자 : electblake


다른 많은 답변에 따라 git reset

하지만:

git unadd 대한 Git 명령(별칭)을 실제로 추가하는 이 멋진 작은 게시물을 찾았습니다. 자세한 내용은 git unadd 를 참조하거나 ..

간단히,

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

이제 할 수 있습니다

 git unadd foo.txt bar.txt

대안으로/직접:

 git reset HEAD foo.txt bar.txt


답변자 : Ana Betts


git reset 사용할 수 없는 경우 "Git bankruptcy"를 선언하고 .git 폴더를 삭제하고 다시 시작하세요.



답변자 : Alex North-Keys


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) # [...]#

대화형 추가로 이동하여 추가를 취소합니다(여기에 git에 입력한 명령은 "r"(되돌리기), "1"(목록 되돌리기의 첫 번째 항목이 표시됨), 되돌리기 모드에서 나가기 위한 '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) $


답변자 : gnud


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

 git help rm


답변자 : Ryan Lundy


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

  • 새 프로젝트의 기본 디렉터리를 만듭니다.
  • git init 실행합니다.
  • 이제 .gitignore 파일을 만듭니다(비어 있더라도).
  • .gitignore 파일을 커밋합니다.

Git은 커밋이 없으면 git reset 을 수행하는 것을 정말 어렵게 만듭니다. 하나를 갖기 위해 작은 초기 커밋을 만든 경우 모든 것을 올바르게 하기 위해 원하는 만큼 git add -Agit reset

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

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


답변자 : powlo


개정을 지정하지 못한 경우 구분 기호를 포함해야 합니다. 내 콘솔의 예:

 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>

(깃트 버전 1.7.5.4)



답변자 : Kokotte23


질문을 게시한 이후로 Git이 발전했을 수 있습니다.

 $> git --version git version 1.6.2.1

이제 다음을 시도할 수 있습니다.

 git reset HEAD .

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



답변자 : Ran


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

 git rm --cached FILE

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



답변자 : Zorayr


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

 git reset *


답변자 : boulder_ruby


* 명령을 사용하여 한 번에 여러 파일을 처리합니다.

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

등.



답변자 : Donovan


git reset 입력하기만 하면 되돌릴 것이고 git add . 마지막 커밋 이후. 전에 커밋했는지 확인하십시오.



답변자 : Vidura Mudalige


newFile.txt 새 파일을 생성한다고 가정합니다.

여기에 이미지 설명 입력

실수로 파일을 추가했다고 가정합니다. git add newFile.txt

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력



답변자 : prosoitos


2019년 업데이트

관련 질문에 다른 사람에 의해 지적합니다 ( 여기 , 여기 , 여기 , 여기 , 여기 , 여기 , 그리고 여기에 ) 당신이 이제 단일 파일 unstage :

 git restore --staged <file>

다음을 사용 하여 모든 파일 (리포지토리의 루트에서)을 언스테이징합니다.

 git restore --staged .

노트

git restore 는 2019년 7월 에 도입되어 버전 2.23에서 출시되었습니다.
--staged 플래그를 사용하여 인덱스의 내용을 복원합니다(여기서 묻는 내용).

git status 를 실행할 때 이제 Git이 파일을 스테이징 해제하는 데 사용하도록 제안합니다(v2.23 이전과 같이 git reset HEAD <file>



답변자 : Hasib Kamal


특정 파일의 경우:

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

추가된 모든 파일의 경우:

  • 자식 리셋 .
  • 자식 체크 아웃 .

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



답변자 : Anirudh Sood


git add 를 실행 취소하려면 다음을 사용하십시오.

 git reset filename


답변자 : Jonathan


대화식 모드도 있습니다.

 git add -i

파일 추가를 취소하려면 옵션 3을 선택하십시오. 제 경우에는 종종 하나 이상의 파일을 추가하고 싶고 대화식 모드에서는 이와 같은 숫자를 사용하여 파일을 추가할 수 있습니다. 4:1, 2, 3, 5를 제외한 모든 것이 필요합니다.

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

Git 스테이징 파일



답변자 : wallerjake


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

 git reset HEAD filename.txt

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

 git add -p

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



답변자 : Rahul Sinha


git reset filename.txt

현재 색인인 "약정 예정" 영역에서 filename.txt라는 파일을 다른 변경 없이 제거합니다.



답변자 : Mohideen bin Mohammed


git add myfile.txt # 파일을 커밋 목록에 추가합니다.

이 명령과 완전히 반대되는 것은,

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

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

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



답변자 : Joseph Mathew


git reset filename.txt

현재 색인인 "약정 예정" 영역에서 filename.txt라는 파일을 다른 변경 없이 제거합니다.



출처 : Here


출처 : http:www.stackoverflow.com/questions/348170/how-do-i-undo-git-add-before-commit">

반응형