it-swarm-ko.com

실행 취소 방법을 선택 했습니까?

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

git add myfile.txt

아직 git commit를 실행하지 않았습니다. 이 작업을 취소 할 수있는 방법이 있습니까?이 파일은 커밋에 포함되지 않습니다.


지금까지 48 개의 답변이 있습니다 (일부 삭제됨). 새로운 정보가 없으면 새로 추가하지 마십시오.

8101
paxos1977

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

git reset <file>

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

당신이 사용할 수있는

git reset

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

이전 버전의 Git에서 위의 명령은 각각 git reset HEAD <file>git reset HEAD에 해당하며 HEAD이 (가) 아직 정의되지 않은 경우 (리포지토리에서 커밋하지 않았기 때문에) 실패합니다. 또는 모호합니다 (HEAD이라는 브랜치를 만들었으므로해서는 안되는 어리석은 일입니다). 이 Git 1.8.2에서 변경되었습니다 , 그래서 현대 버전의 Git에서는 처음 커밋하기 전에 위의 명령을 사용할 수 있습니다.

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

9480
genehack

당신이 원한다 :

git rm --cached <added_file_to_undo>

추리:

내가 처음이 일을 할 때, 나는 처음에 시도했다.

git reset .

(내 전체 초기 추가를 취소하려면),이 (그렇게) 도움이 메시지를 얻으려면 :

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

HEAD ref (branch?)는 첫 번째 커밋 이후까지 존재하지 않기 때문입니다. 즉, 내 작업 흐름과 같은 워크 플로우가 있다면 다음과 같은 초보자 문제를 겪게 될 것입니다.

  1. 내 위대한 새로운 프로젝트 디렉토리에 힘내, 새로운 섹시 함을 시도 cd
  2. git init
  3. git add .
  4. git status

    ... 쓰레기 두루마리 ...

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

  5. google "git add undo"

    => 스택 오버플로 발견 - 예.

  6. git reset .

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

더 나아가서 버그가 기록됨 메일 링리스트에서 이것이 도움이되지 않는다는 사실이 드러났습니다.

그리고 올바른 솔루션은 Git 상태 출력 (Git status output)에있었습니다 (그래, 나는 쓰레기로 쓰여졌습니다)

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

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

git rm는 파일의 로컬 작업 복사본을 삭제하지만 --cached)를 사용하면 not을 삭제합니다. git help rm의 결과는 다음과 같습니다.

--cached 인덱스에서만 경로를 제거하고 제거하려면이 옵션을 사용하십시오. 수정 여부와 상관없이 작업 트리 파일이 남아 있습니다.

나는 계속 사용한다.

git rm --cached .

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

git rm -r --cached .

좋아, 지금 나는 내가 시작했던 곳으로 돌아왔다. 다음 번에 나는 -n를 사용하여 드라이 런을 수행하고 추가 될 내용을 살펴 보겠습니다.

git add -n .

나는 무엇이든을 파괴하지 않는 git help rm에 대해 --cached를 신뢰하기 전에 안전한 곳으로 모든 것을 압축했습니다 (철자가 틀린 경우).

2047
Rhubarb

다음을 입력하면 :

git status

git은 무대를 만드는 방법에 대한 지시 사항을 포함하여 무대에 올라있는 것을 알려줄 것입니다.

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

나는 이런 상황에서 옳은 일을 할 수있게 해주는 꽤 좋은 일을하고있다.

주의 : 최근의 자식 버전 (1.8.4.x)이이 메시지를 변경했습니다 :

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

명확하게하기 위해 : git add는 현재 작업 디렉토리에서 스테이징 영역 (색인)로 변경 사항을 이동합니다.

이 프로세스를 staging 이라고합니다. 따라서 stage 변경 (변경된 파일)에 대한 가장 자연스러운 명령은 분명합니다.

git stage

git addgit 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
238
takeshin

수락 된 답변 외에도 실수로 추가 한 파일이 거대한 경우 'git reset'가있는 색인에서 파일을 제거한 후에도 여전히 .git 디렉토리의 공간을 차지하는 것으로 보입니다. 걱정할 필요는 없습니다. 파일이 실제로 저장소에 있지만 "느슨한 개체"로만 다른 저장소 (복제, 푸시를 통해)에 복사되지 않으며 결국 공간이 회수됩니다. 아마 머지 않아. 불안한 경우 다음을 실행할 수 있습니다.

git gc --Prune=now

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

그렇다면 git add의 실제 ndo는 무엇입니까?

git reset HEAD <file>?

또는

git rm --cached <file>?

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

git add취소 할 수 없음-일반적으로 안전합니다.

git add <file>가 실제로 무엇을하는지 먼저 생각해 보자 :

  1. <file>이전에 추적되지 않음 인 경우 git add캐시에 추가 (현재 내용 포함).

  2. <file>이미 추적 됨 인 경우 git add현재 내용 저장 (스냅 샷, 버전)을 캐시에 저장합니다. GIT에서이 작업은 여전히 ​​add (단지 update 가 아님)라고하며 두 가지 버전 (스냅 샷) 때문에 파일은 두 가지 다른 항목으로 간주됩니다. 따라서 캐시에 새 항목을 추가하여 나중에 커밋합니다.

이것에 비추어, 질문은 약간 모호합니다.

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

OP의 시나리오는 첫 번째 (추적되지 않은 파일) 것으로 보이며, "실행 취소"를 사용하여 추적 된 항목에서 파일 (현재 내용이 아닌)을 제거하려고합니다. If이 경우 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 lost irrevocably "version 2"
-version 1
+version 3

물론 새 파일을 추가하기 위해 'git add'를 수행하는 일반적인 게으른 워크 플로우를 따르고 (case 1) commit, git commit -a 명령을 통해 새 내용을 업데이트하는 경우 이것은 중요하지 않습니다.


* (편집 : 위의 내용은 실제로 정확하지만 여전히 단계적이지만 커밋되지 않은 다음 변경 사항을 복구하는 약간의 해킹/복잡한 방법이있을 수 있습니다-Johannes Matokic 및 iolsmit의 의견 참조)

161
leonbloy
git rm --cached . -r

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

91
braitsch

운영

git gui

수동으로 또는 모든 파일을 선택하고 커밋에서 무장 해제 버튼을 클릭하여 모든 파일을 제거하십시오.

85
Khaja Minhajuddin

실행 취소 이미 추가 된 파일은 이미 추가 된 myfile.txt를 재설정하기 위해 git 를 사용하여 매우 쉽습니다.

git reset HEAD myfile.txt

설명 :

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

이러한 경우에 발생할 수있는 모든 단계를 포함하여 아래 이미지의 단계를 더 자세히 설명합니다.

 git reset HEAD file

82
Alireza

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

이전에 한 일 :

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

문제는 명확하게 제기되지 않습니다. 그 이유는 _git add_에 두 가지 의미가 있기 때문입니다.

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

의심스러운 경우 사용

_git reset HEAD file
_

두 경우 모두 예상되는 일을하기 때문입니다.

Warning :modified (리포지토리에 존재했던 파일) 파일에 _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
_
74
Michael_Scharf

처음 커밋을하고 git reset를 사용할 수 없다면, "Git 파산"신고를하고 .git 폴더를 삭제하고 다시 시작하십시오.

61
Paul Betts

다른 답변들과 마찬가지로 git reset를 사용할 수 있습니다.

하지만 :

git unadd에 대한 Git 명령 (잘 별칭)을 실제로 추가 한 위대한 작은 게시물을 발견했습니다. 자세한 내용을 보려면 git unadd를 참조하십시오.

간단히,

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

이제 너는 할 수있다.

git unadd foo.txt bar.txt
55
electblake

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

git help rm
46
gnud

다가오는 커밋에서 방금 추가 된 파일을 제거하려면 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"(목록 되돌리기 프로그램의 첫 번째 항목), '돌아 가기'를 선택하여 되돌리기 모드에서 빠져 나오고 '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
Alex North-Keys

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

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

힘내는 커밋이 없다면 git reset을하는 것은 정말 어렵다. 만약 당신이 작은 초기 커밋을 하나만 가지고 있다면, 그 후에는 git add -Agit reset를 원하는만큼 여러 번해서 모든 것을 올바르게 할 수 있습니다.

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

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

Git은 질문을 게시 한 이후로 진화했을 수도 있습니다.

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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

33
Kokotte23

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

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)

33
powlo

위에 제시된 것처럼 준비 영역에서 새 파일을 제거하려면 (새 파일 인 경우에만) :

git rm --cached FILE

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

30
Ran

특정 폴더 (및 해당 하위 폴더)의 모든 파일을 재설정하려면 다음 명령을 사용하십시오.

git reset *
24
Zorayr

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

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

기타

24
boulder_ruby

그냥 git reset를 입력하면 되돌릴 수 있으며 마지막 커밋 이후에 git add .를 입력하지 않은 것과 같습니다. 전에 커밋했는지 확인하십시오.

22
Donovan

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

 enter image description here

우연히 파일을 추가한다고 가정 해 보겠습니다. git add newFile.txt

 enter image description here

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

 enter image description here

18
Vidura Mudalige

특정 파일의 경우 :

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

추가 된 모든 파일 :

  • git reset.
  • git checkout.

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

17
Hasib Kamal

자식 추가 사용을 취소하려면

git reset filename

13
Anirudh Sood

이 명령은 변경 사항을 취소합니다.

git reset HEAD filename.txt

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

git add -p 

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

13
wallerjake

아무도 대화식 모드를 언급하지 않는다는 것에 놀랐습니다.

git add -i

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

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

스테이징 파일

13
Jonathan

git add myfile.txt # 이것은 커밋 될 파일에 파일을 추가합니다.

이 명령의 정반대는,

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

그래서, 당신은 이전 상태에있을 것입니다. 지정되지 않은 목록에 다시 나타납니다 (이전 상태).

그 지정된 파일로 머리를 다시 설정합니다. 그래서, 만약 당신의 머리가 의미가 없다면, 단순히 그것을 재설정 할 것입니다.

9
Silent Spectator
git reset filename.txt

현재 인덱스 인 "about to be committed"영역에서 filename.txt 파일을 다른 것을 변경하지 않고 제거합니다.

9
Rahul Sinha

SourceTree에서는 GUI를 통해 쉽게이 작업을 수행 할 수 있습니다. sourcetree가 파일을 스테이지를 없애기 위해 사용하는 명령을 확인할 수 있습니다.

새 파일을 만들고 git에 추가했습니다. 그럼 SourceTree GUI를 사용하여 unstaged. 결과는 다음과 같습니다.

파일을 unstaging [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree 재설정 -q-path/to/file/filename.Java

SourceTree는 reset을 사용하여 새 파일을 스테이지에서 제거합니다.

8
miva2
git reset filename.txt  

현재 인덱스 인 "about to be committed"영역에서 filename.txt 파일을 다른 것을 변경하지 않고 제거합니다.

7
Joseph Mathew

가장 직관적 인 솔루션 중 하나는 SourceTree 를 사용하는 것입니다.

당신은 단지 파일을 끌어다 놓을 수 있습니다. staged 및 unstaged  enter image description here

7
Marcin Szymczak

git reset 명령은 준비 영역이나 준비 영역 및 작업 트리를 수정하는 데 도움이됩니다. Git이 당신이 원하는 것과 똑같이 커밋을 만드는 기능은 git add 명령을 사용하여 수행 한 변경 사항의 변경 사항을 취소해야하는 경우가 있음을 의미합니다.

git reset HEAD <file to change>를 호출하여이를 수행 할 수 있습니다. 변경 사항을 완전히 없애는 두 가지 옵션이 있습니다. git checkout HEAD <file(s) or path(s)>은 준비 영역 및 작업 트리에 대한 변경 사항을 신속하게 취소 할 수있는 방법입니다. 그러나 작업 트리의 모든 변경 사항이 제거되므로이 명령을주의하십시오. 힘내는 결코 커밋되지 않았기 때문에 그 변화에 대해 알지 못한다. 이 명령을 실행하면 변경 사항을 되돌릴 방법이 없습니다.

처리 할 수있는 또 다른 명령은 git reset --hard입니다. 그것은 작업 트리에 동등하게 파괴적입니다. 커밋되지 않은 변경이나 단계적 변경은 실행 후 손실됩니다. git reset -hard HEAD 실행은 git checkout HEAD와 동일한 작업을 수행합니다. 파일이나 경로가 작동하지 않아도됩니다.

--soft와 함께 git reset를 사용할 수 있습니다. 저장소를 사용자가 지정한 커밋으로 다시 설정하고 모든 변경 사항을 단계별로 처리합니다. 이미 수행 한 변경 사항은 영향을받지 않으며 작업 트리의 변경 사항도 영향을받지 않습니다.

마지막으로 --mixed를 사용하여 변경 사항을 준비하지 않고 작업 트리를 재설정 할 수 있습니다. 이것은 또한 상연 된 모든 변경을 무대화합니다.

1
SAIguru011