문제

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

git add myfile.txt

저는 아직도 실행 git commit.는 방법이 있을 취소이므로,이러한 파일에 포함되지 않습니다 commit?

도움이 되었습니까?

해결책

당신은 취소 할 수 있습니다 git add 헌신하기 전에

git reset <file>

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

당신이 사용할 수있는

git reset

모든 적절한 변경 사항을 무대에 해제 할 파일 이름이 없으면. 파일이 너무 많은 파일이 합리적인 시간에 하나씩 나열되어있을 때 유용 할 수 있습니다.

기존 버전의 git에서 위의 명령은 git reset HEAD <file> 그리고 git reset HEAD 각각, 그리고 if가 실패합니다 HEAD 정의되지 않았습니다 (리포에서 아직 커밋을하지 않았기 때문에) 또는 모호한 (전화 지점을 만들었 기 때문에 HEAD, 그것은 당신이하지 말아야 할 어리석은 일입니다). 이것 GIT 1.8.2에서 변경되었습니다, 그러나 최신 버전의 git에서는 첫 번째 커밋을하기 전에도 위의 명령을 사용할 수 있습니다.

옵션이나 매개 변수가없는 "Git Reset"(옵션 또는 매개 변수 없음)은 역사에 커밋이 없을 때 오류를 오류 가지만 이제는 빈 색인을 제공합니다 (존재하지 않는 커밋과 일치하지 않음).

다른 팁

당신은 원합니다 :

git rm --cached <added_file_to_undo>

추리:

내가 이것에 익숙했을 때, 나는 먼저 시도했다

git reset .

(내 초기 부가 전체를 취소하려면) 도움이되는 메시지를 얻으려면 다음과 같습니다.

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

이것은 Head Ref (Branch?)가 첫 번째 커밋이 끝날 때까지 존재하지 않기 때문입니다. 즉, 나와 같은 워크 플로우가

  1. CD가 새로운 프로젝트 디렉토리에 CD를 시험해보십시오.
  2. git init
  3. git add .
  4. git status

    ... 많은 쓰레기 스크롤에 의해 ...

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

  5. Google "UNDO GIT ADD"

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

  6. git reset .

    => 치명적 : 유효한 심판으로 '머리'를 해결하지 못했습니다.

또한 그곳에 있음이 더 밝혀졌습니다 버그가 기록되었습니다 메일 링리스트에서 이것의 도움이되지 않는 것에 대해.

그리고 올바른 솔루션은 git 상태 출력에 바로 거기에있었습니다 (예, 나는 'crap으로 글로스를 썼습니다).

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

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

여기있는 다른 곳에서 경고에 주목하십시오. git rm 파일의 로컬 작업 사본을 삭제하지만 ~ 아니다 사용하는 경우 -캐 형성. 결과는 다음과 같습니다 git help rm:

-캐시 된이 옵션을 사용하여 단계를 벗어나 지수에서만 경로를 제거합니다. 수정 여부에 관계없이 작업 트리 파일이 남아 있습니다.

나는 계속 사용한다

git rm --cached .

모든 것을 제거하고 다시 시작합니다. 그래도 작동하지 않았기 때문입니다 add . 재귀 적입니다 rm 필요합니다 -r 재발하기 위해. 한숨을 쉬다.

git rm -r --cached .

좋아, 이제 내가 시작한 곳으로 돌아왔다. 다음에 나는 사용할 것입니다 -n 건식 달리기를하고 추가 할 내용을 확인하십시오.

git add -n .

나는 신뢰하기 전에 모든 것을 안전한 곳으로 향했다. git help rm 대한 --cached 아무것도 파괴하지 않습니다 (그리고 내가 틀린 경우 어떻게해야합니까?).

입력 한 경우 :

git status

GIT는 단계를 벗어나지 않는 방법에 대한 지침을 포함하여 무대 등을 알려줍니다.

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

나는 git이 이런 상황에서 옳은 일을하도록 저를 멍청하게하는 일을 잘한다는 것을 알았습니다.

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

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

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

추가 수락 응답,당신의 실수로 추가된 파일이 있었고,거기 당신은 아마,그 알 수 있도에서 제거한 후의 인덱스로'git reset',그것은 여전히 공간을 차지하기에 .git 디렉토리에 있습니다.이것은 아무 것도 걱정되는 파일은 참으로 아직도에서 저장소만으로"느슨한 개체",그것은 복사되지 않은 다른 저장소(via 복제,밀),그리고 공간이 될 것입니다 결국에는 매립지-그러나 아마도지 않습니다.당신이 불안 경우,실행할 수 있습니다:

git gc --prune=now

업데이트 (어떤 다음과 같은 내을 취소하려고 일부는 혼란에서 발생할 수 있는 가장 투표 답변):

그래서,어떤 것은 실시 취소git add?

git reset HEAD <file> ?

git rm --cached <file>?

엄격히 말하기,그리고 내가 틀리지 않는 경우: 없음.

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

Let's 무엇을 먼저 기억 git add <file> 실제로는:

  1. 는 경우 <file>이전에 추적, git add 추가합니다 캐시, 과 함께,현재 내용입니다.

  2. 는 경우 <file>이미 추적, git add 현재 내용 (스냅샷,버전)을 주시기 바랍니다.GIT,이 행동은 아직도 불 추가,(지 않는 단순한 업데이트 it)기 때문에,두 개의 서로 다른 버전(스냅샷)의 파일로 간주되어 두 가지 다른 항목:따라서,우리는 참으로 추가하는 새로운 항목을 캐시고,궁극적으로 투입니다.

이 질문은 약간의 모호:

나는 실수로 추가된 파일 명령을 사용하여...

OP 의 시나리오를 보이 될 첫 번째 중 하나(되지 않은 파일),우리가 원하는"취소"을 제거한 파일(다만 현재는 내용)에서 추적되는 항목입니다. 는 경우 이 경우,그것은 확인 실행 git rm --cached <file>.

그리고 우리는 또한 할 수 있었습니다 실행 git reset HEAD <file>.이것은 일반적인 것이 바람직하기 때문에,그것은 모두에서 작동합 시나리오:그것은 또한 없이 취소할 때 우리는 잘못을 추가 버전의 이미 추적된 항목입니다.

하지만 두 가지 주의 사항이 있습니다.

먼저:가(로에서 지적한 답변)만에 시나리오는 git reset HEAD 이 작동하지 않지만, git rm --cached 가:새소(아 커밋).하지만 정말,이는 실질적으로 관련이 없는 경우입니다.

두 번째:알 git reset HEAD 할 수 없는 마술로 복구 이전에 캐시 파일 내용,다만 resyncs 그 머리에서.는 경우 우리의 잘못 지도 git add 덮어 이전에 개최 uncommitted 버전을,우리를 복구할 수 없습니다.그 이유는,엄격하게 말하자면,우리는 실행을 취소할 수 없으므로[*].

예제:

$ 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'만에 대한 추가하는 새로운 파일을(case1),그리고 우리는 새로운 콘텐츠를 통해 commit git commit -a 명령입니다.


*(편집:위은 실질적으로 올바른지만,여전히 될 수있는 일부 약간 hackish/복잡한 방법으로 복구하기 위해 변경사항을 벌였지만 노력하지 않고 다음을 덮어쓰-코멘트를 확인하여 요하네스 Matokic 및 iolsmit)

git rm --cached . -r

현재 디렉토리에서 추가 한 모든 내용을 재귀 적으로 "ADD"할 것입니다.

실행 취소 이미 추가 된 파일은 사용하기 쉽습니다 git, 재설정 myfile.txt 이미 추가 된 사용 :

git reset HEAD myfile.txt

설명:

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

이 경우에 발생할 수있는 모든 단계를 포함하여 귀하를위한 자세한 내용으로 아래 이미지의 단계를 만듭니다.

git reset HEAD file

운영

git gui

모든 파일을 수동으로 또는 모든 파일을 선택하고 클릭하여 Commit에서 무시하지 않습니다 단추.

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

이전에 한 일 :

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

당신이 원하는 것 :

  • 인덱스에서 파일을 제거하지만 작업 사본에서 커밋되지 않은 변경 사항이없는 버전으로 유지하고 남겨 두십시오.

    git reset head <file>
    
  • 헤드에서 파일을 마지막 상태로 재설정하고 변경 사항을 취소하고 색인에서 제거합니다.

    # 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> 인덱스 및 버전화에서 작업 사본의 변경 사항이없는 VERSIONED 파일을 유지합니다.

    git rm --cached <file>
    
  • 제거하다 <file> 작업 복사 및 버전 작성에서 :

    git rm <file>
    

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

  1. 추가 a 새로운 파일 스테이징 영역으로, 취소 git rm --cached file.
  2. 추가 a 수정 스테이징 영역에 파일을 파일 한 다음 취소하십시오 git reset HEAD file.

의심스러운 경우 사용하십시오

git reset HEAD file

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

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

git status 파일이 a 새로운 파일 또는 수정:

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 reset, 그냥 "git 파산"을 선언하고 .git 폴더를 시작하고 다시 시작하십시오

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

하지만:

나는 실제로 git 명령 (alias)을 추가하는이 위대한 작은 게시물을 발견했습니다. git unadd: 보다 git unadd 자세한 내용은 ..

간단히,

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

이제 할 수 있습니다

git unadd foo.txt bar.txt

git remove 또는 git rm 이것에 사용할 수 있습니다 --cached 깃발. 노력하다:

git help rm

사용 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"(목록의 첫 번째 항목), '리버스 모드에서 리턴'및 "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)
$

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

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

git은 정말 어렵습니다 git reset 커밋이 없다면. 당신이 하나를 만들기 위해 작은 초기 커밋을 만들면, 그 후에는 git add -A 그리고 git reset 모든 것을 올바르게 얻기 위해 원하는만큼.

이 방법의 또 다른 장점은 나중에 라인 끝 문제를 해결하고 모든 파일을 새로 고쳐야한다면 쉽다는 것입니다.

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

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

$> git --version
git version 1.6.2.1

이제 시도 할 수 있습니다.

git reset HEAD .

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

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

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)

위에서 제안한대로 스테이징 영역에서 새 파일 (새 파일의 경우에만)을 제거합니다.

git rm --cached FILE

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

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

git reset *

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

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

그냥 입력하십시오 git reset 그것은 되돌아 갈 것이고 당신이 타이핑하지 않은 것과 같습니다. git add . 마지막 커밋 이후. 전에 약속한지 확인하십시오.

새 파일을 생성한다고 가정 해 봅시다 newFile.txt.

enter image description here

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

enter image description here

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

enter image description here

특정 파일의 경우 :

  • git Reset my_file.txt
  • git checkout my_file.txt

추가 된 모든 파일의 경우 :

  • git 재설정.
  • git 결제.

메모: 점검 파일의 코드를 변경하고 마지막 업데이트 된 (커밋 된) 상태로 이동합니다. 초기화 코드를 변경하지 않습니다. 헤더를 재설정합니다.

이 명령은 귀하의 변경 사항을 막을 수 없습니다.

git reset HEAD filename.txt

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

git add -p 

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

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

git add -i

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

1-5 타입의 시퀀스를 선택하려면 1에서 5까지 모두 가져갑니다.

git 스테이징 파일

git을 취소하려면 사용을 추가하십시오

git reset filename

git reset filename.txt

현재 인덱스에서 Filename.txt라는 파일을 제거합니다.

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

이 명령과는 반대입니다.

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

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

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

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 새로운 파일을 무대에 끼치게합니다.

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

무대와 무대에서 파일을 드래그 앤 드래그 앤 드래그 할 수 있습니다.enter image description here

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top