마지막 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.