취소 - git 초기화




커밋하기 전에 'git add'를 실행 취소하는 방법은 무엇입니까? (20)

나는 실수로 명령을 사용하여 자식에게 파일을 추가했다.

git add myfile.txt

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

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


Git은 질문을 올린 이후로 진화했을 수도 있습니다.

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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


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새 파일을 언 스테이지에 사용 합니다.


다음을 입력 할 경우 :

git status

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

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

나는 이런 상황에서 옳은 일을하기 위해 나를 슬쩍 찌르는 일을 꽤 잘한다.

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

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

당신이 원하는 :

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 를 사용하면 안된다 . git help rm 의 결과는 다음과 같습니다.

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

나는 계속 사용한다.

git rm --cached .

모든 것을 제거하고 다시 시작하십시오. add . 하는 동안, 비록 작동하지 않았다 add . 재귀 적이면 rm-r 을 위해 -r 을 필요로한다. 한숨.

git rm -r --cached .

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

git add -n .

나는 무엇이든을 파괴하지 않는 --cached git help rm 에 대한 git help rm 신뢰하기 전에 안전한 곳으로 모든 것을 압축했다.


명확하게하려면 : git add 는 현재 작업 디렉토리에서부터 스테이징 영역 (인덱스)으로 이동합니다.

이 프로세스를 스테이징 이라고합니다. 따라서 변경 사항을 적용하는 가장 자연스러운 명령 (변경된 파일)은 분명합니다.

git stage

git addgit stage 대한 별칭을 입력하는 것이 더 쉽습니다.

git unstagegit 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

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

  1. 새로운 파일 을 준비 영역에 추가 한 다음 git rm --cached file 하여 실행 취소 git rm --cached file .
  2. 준비 영역에 수정 된 파일을 추가 한 다음 git reset HEAD file 하여 실행 취소 git reset HEAD file .

의심스러운 경우

git reset HEAD file

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

경고 : 수정 된 파일 (저장소에 이전에 존재했던 git rm --cached 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

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

git add -i

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

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

Git 준비 파일


운영

git gui

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


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

git reset HEAD filename.txt

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

git add -p 

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


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

git reset HEAD myfile.txt

설명:

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

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


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


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

git reset <file>

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

당신이 사용할 수있는

git reset

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

이전 버전의 Git에서는 위 명령이 git reset HEAD <file>git reset HEAD 각각 동일하며 HEAD 가 정의되지 않은 경우 (repo에서 아직 커밋하지 않았기 때문에) 또는 모호한 경우 HEAD 라고하는 지점을 만들었습니다. 이것은 멍청한 일입니다.) 이것은 Git 1.8.2에서 변경 되었지만 현대 버전의 Git에서는 첫 번째 커밋을하기 전에 위의 명령을 사용할 수 있습니다.

"git reset"(옵션이나 매개 변수없이)은 히스토리에 커밋을하지 않았을 때 오류가 발생하지만 이제는 비어있는 색인을 제공합니다 (존재하지 않는 커밋과 일치시키기 위해).


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

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

기타


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

git gc --prune=now

업데이트 (다음은 가장 많이 투표 된 답변에서 발생할 수있는 혼란을 없애기위한 시도입니다.)

그래서, git add 의 실제 실행 취소 는 무엇입니까?

git reset HEAD <file> ?

또는

git rm --cached <file> ?

엄밀히 말하면, 그리고 내가 틀리지 않는다면 : none .

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

git add <file> 실제로 git add <file> 하는 것을 먼저 생각해 봅시다.

  1. <file>이전에 추적되지 않았다면 git add 는 캐시 에 현재 내용 git add 합니다 .

  2. <file>이미 추적 되었다면 git add 는 현재 내용 (스냅 샷, 버전)을 캐시에 저장합니다. GIT에서는 파일의 두 가지 다른 버전 (스냅 샷)이 두 개의 다른 항목으로 간주되기 때문에이 작업은 여전히 add (단순히 업데이트 하지 않고)라고합니다. 따라서 결국 캐시에 새 항목을 추가하여 결국에는 나중에 커밋.

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

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

OP의 시나리오가 첫 번째 것 (추적되지 않은 파일) 인 것처럼 보입니다. 추적 된 항목에서 파일을 제거하기위한 "실행 취소"가 필요합니다. 이 경우에는 git rm --cached <file> 을 실행해도 git rm --cached <file> .

그리고 git reset HEAD <file> 실행할 수도 있습니다. 두 시나리오 모두에서 작동하기 때문에 일반적으로 바람직합니다. 이미 추적 된 항목의 버전을 잘못 추가하면 실행 취소가 수행됩니다.

그러나 두 가지주의 사항이 있습니다.

첫 번째 : git reset HEAD 가 작동하지 않지만 git rm --cached 는 다음과 같은 경우에만 하나의 시나리오 만 존재합니다 (새로운 저장소 (커밋 없음)). 그러나 실제로, 이것은 실질적으로 관련이없는 경우입니다.

두번째 : git reset HEAD 는 마침내 이전에 캐시 된 파일 내용을 복구 할 수 없다는 것을 알아 두십시오. 단지 HEAD로부터 다시 동기화됩니다. 잘못 입력 된 위젯이 이전 단계의 커밋되지 않은 버전을 덮어 쓰면 복구 할 수 없습니다. 그래서 엄밀히 말하면, 우리는 [*]를 취소 할 수 없습니다.

예:

$ 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 명령을 통해 새로운 내용을 업데이트하면됩니다.

* (편집 : 위의 내용은 사실이지만 올바르지 만 무대 뒤에도 커밋되지 않고 덮어 쓰지 않은 변경 사항을 복구하기위한 약간의 hackish / convoluted 방법이있을 수 있습니다 - Johannes Matokic 및 iolsmit의 의견 참조)


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)
$

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

이 명령과 정반대로,

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

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

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


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


newFile.txt 파일을 새로 만든다고 가정 newFile.txt .

실수로 파일을 추가한다고 가정하고, git add newFile.txt

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


git reset filename.txt

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


git reset filename.txt  

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





git-stage