마지막 git add를 어떻게 취소 할 수 있습니까?


193

그것은 변화 (커밋되지 않은) 개최 지난 unstage하는 것이 가능 자식을 ? 현재 브랜치에 파일이 많았고 일부는 준비되었지만 일부는 아니라고 가정합니다. 어떤 시점에서 어리석은 프로그래머가 실수로 다음을 실행했습니다.

git add -- .

...대신에:

git checkout -- .

이 프로그래머는 이제 마법의 git 명령으로 마지막 변경 사항을 취소 할 수 있습니까 ? 아니면 처음 실험하기 전에 커밋 했어야합니까?


허. 우리는 유용한 질문과 답변을 얻었습니다.
— steveha


나는 그것이 중복이 아니라고 생각합니다. 다른 질문에서 OP는 이것을 취소하거나 커밋에서 이러한 파일을 제거하는 방법을 요구하고 있습니다. 마지막 git add명령 으로 추가 된 변경 사항 , 특히 이미 변경 사항을 이미 준비하고 취소되지 않은 일부 변경 사항이있는 파일 의 변경 사항을 정확하고 취소하기 를 원했습니다. 다른 질문은 관련이 없다고 말할 수 없습니다.
— Septagram 2018 년

1
어쩌면 그는 처음부터 실험하기 전에 / been / 헌신했을 것입니다.
— android.weasel

@ android.weasel 예, 몇 년 전 ...
— Septagram

답변:


299

사용할 수 있습니다 git reset. 마지막 커밋 후에 추가 한 모든 파일을 '무비'합니다.

일부 파일 만 스테이지 해제하려면을 사용하십시오 git reset -- <file 1> <file 2> <file n>.

또한을 사용하여 파일의 일부 변경 사항을 스테이지 해제 할 수 있습니다 git reset -p.


3
얼마나 슬픈. 커밋 관행에 문제가 있다고 생각합니다. -p스위치 를 언급했기 때문에이 답변을 수락합니다 . 감사! :)
— Septagram

오류 : 치명적 : 'HEAD'를 유효한 참조로 해결하지 못했습니다. 나는 아직 (새로운 저장소) 아무것도 커밋하지 않았다 .git add. 후회했다. 전체 추가, 하나의 디렉토리 만 재설정하고 싶지 않습니다. git reset-dir /*.*는 위의 오류를 생성합니다.
— Francis Davey

... 아, 나에게 무슨 일이 일어나고 있는지 봅니다. HEAD가 아직 가리킬 것이 없으므로 git reset이 실패했습니다 (HEAD에서 작동하기 때문에).
— Francis Davey

42

당신은 취소 할 수 없습니다 최신 자식 추가,하지만 당신은 모든 취소 할 수 있습니다 add마지막 커밋 이후들. git reset커밋 인수가 없으면 인덱스가 재설정됩니다 (단계별 스테이지 변경 사항).

git reset

2
" 최신 git add 명령을 취소 할 수 없습니다 ." 이에 대한 확실한 소스가 있습니까? 또한 그럴만한 이유가 있습니까? 감사!
— Andrew Moylan

@AndrewMoylan : 글쎄, 자동 방법은 없습니다 . 항상 reset단일 파일을 사용하거나 reset -p특정 덩어리를 스테이지 해제하는 데 사용할 수 있습니다 .
— knittl

15

따라서 실제 답변

이 프로그래머는 이제 마법의 git 명령으로 마지막 변경 사항을 취소 할 수 있습니까?

실제로 : 아니요, 마지막 단계 만 스테이지 해제 할 수 없습니다 git add.

우리가 다음 상황에서와 같이 질문을 해석하는 경우입니다.

초기 파일 :

void foo() {

}

main() {
    foo();
}

첫 번째 변경 다음에 git add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

두 번째 변화는 다음과 git add같습니다.

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

이 경우 git reset -p가장 작은 단위가 선이므로 도움이되지 않습니다. git다음의 중간 상태에 대해 알지 못합니다.

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

더 이상.


나는 새로운 git 사용자이기 때문에 내 친구가 "좋은 체크인 위생을 가짐"으로 설명하는 것을 강조하는 정말 중요한 차이점입니다. 개인 경험- "카풀 링"(나쁜!)으로 묘사되었습니다.
— benc


3

날짜 git 프롬프트에서 :

  1. use "git rm --cached <file>..." to unstage파일이 저장소에없는 경우 파일을 보관하지 않고 보관합니다.
  2. use "git reset HEAD <file>..." to unstage파일이 저장소에 있고 수정 된대로 추가하는 경우 파일을 그대로 유지하고 스테이지를 해제합니다.

내 지식으로는 취소 git add --할 수 없지만 위에서 언급 한대로 파일 목록을 취소 할 수 있습니다.


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

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

    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>
    

2

커밋을 위해 git에서 추가 된 모든 파일 을 제거 하려는 경우

git reset

개별 파일 을 제거 하려는 경우

git rm <file>

1

당신이 사용할 수있는

git reset

최근에 추가 한 로컬 파일을 취소하려면

 git reset file_name

특정 파일에 대한 변경 사항을 취소하려면


0

어려운 규모와 규모에 따라 스크래치 (임시) 브랜치를 만들고 현재 작업을 커밋 할 수 있습니다.

그런 다음 원래 분기로 전환하여 체크 아웃하고 스크래치 커밋에서 적절한 파일을 선택하십시오.

최소한 현재 상태와 이전 상태에 대한 영구적 인 기록이 있어야 스크래치 브랜치를 삭제할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.