파일 및 폴더를 포함하여 커밋되지 않은 변경 사항을 되 돌리는 방법은 무엇입니까?


1071

작업 트리 및 색인에서 커밋되지 않은 모든 변경 사항을 되돌리고 새로 만든 파일과 폴더를 제거하는 git 명령이 있습니까?



1
글쎄, 아래의 다양하고 기억하기 어려운 답변을 모두 읽었으며, 경고가있는 경우와 "사고가 XXX 인 경우의 작업"과 함께 전체 저장소를 삭제하고 편집하고 추가 한 모든 파일을 제거하기 위해 복제했습니다. . 또한 두 개의 명령입니다. rm -r projectdir; 자식 클론 xxx. 나를 위해 이것은 빈번한 작업입니다-repo play를 확인한 다음 깨끗한 체크 아웃으로 돌아가서 수정을 시작할 수 있습니다. 좋지는 않지만 100 % 작동합니다. 언젠가 그들은 이것에 대한 간단한 명령을 추가하기를 바라고 있습니다.
John Little

답변:


1771

다음 두 명령을 실행할 수 있습니다.

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
git clean을 실행하기 전에 변경 내용을 미리 보려면 'git clean -nd'를 실행하는 것이 좋습니다. 추적되지 않은 파일이나 디렉토리가 제거되지 않도록하십시오.
jpw

79
-f는 강제이고, -d는 디렉토리를 제거하고, -n은 드라 이런입니다 (아직 드라이 드라이브; 아무 것도하지 않고 출력을 보여줍니다)
Aaron Campbell

12
git clean -i대화식 모드.
galath

준비되지 않은 파일을 재설정하지 않았으므로 먼저 준비해야했습니다.
Aron Lorincz

4
@IgorGanapolsky 아마도 당신은 아마도 병합 충돌의 중간에있을 것입니다. 실행 해보십시오 git merge --abort.
htanata

555

현재 작업 디렉토리에서만 변경 사항을 되돌리려면 다음을 사용하십시오.

git checkout -- .

그리고 그 전에 실제로 어떤 작업을 수행하지 않고 되돌릴 파일을 나열하여 다음 작업을 수행 할 수 있습니다.

git checkout --

1
이것을 시도하면 "error : pathspec '." git으로 알려진 파일과 일치하지 않습니다
Mike K

34
이것과의 차이점은 무엇 git reset --hard입니까?
Felipe Almeida

104
'git reset --hard'는 단계적 변경과 비 단계적 변경을 취소하지만 'git checkout-'입니다. 단지 unstaged 변경 사항을 취소합니다
divideByZero

그러나 체크 아웃을 사용하고 파일을 수정 한 경우 cmd는이 변경 사항을 되돌려 야 할 때에도 병합을 수행해야한다고 반환합니다.
Vinicius Monteiro

7
git checkout-되돌릴 파일을 간단히 나열합니다 (작업 없음, 목록 만 표시). 이것은 git checkout-을 수행하기 전에 어떤 파일이 영향을 받는지 확인하려는 경우에 유용합니다.
크리 쉬 스 리니 바산

107

"git checkout-..."을 사용하여 작업 디렉토리의 변경 사항을 버립니다.

git checkout -- app/views/posts/index.html.erb

또는

git checkout -- *

git 상태에서 스테이지되지 않은 파일에 대한 모든 변경 사항을 제거합니다.

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *변경된 파일이있는 디렉토리에 있지 않으면 나를 위해 작동하지 않습니다. 전체 저장소에서 모든 파일을 체크 아웃을 수행해야합니다git checkout -- :/
waldyrious

git checkout -- *, 별은 현재 디렉토리에있는 모든 파일과 디렉토리, 쉘에 의해 대체된다. 따라서 하위 디렉토리로 이동해야합니다. 그것은 나를 위해 작동합니다. 그러나 제 의견으로는 더 깔끔한 ": /"구문을 강조해 주셔서 감사합니다.
mcoolive

53

사소한 방법 중 하나는 다음 두 명령을 실행하는 것입니다.

  1. git stash 그러면 변경 사항이 숨김으로 이동하여 HEAD 상태로 돌아갑니다.
  2. git stash drop 마지막 명령에서 생성 된 최신 숨김이 삭제됩니다.

3
커밋되지 않은 변경에는 적용되지 않으며 커밋 된 변경에만 적용됩니다.
b0xxed1n

4
커밋되지 않은 변경에 사용했으며 작동합니다.
Paul D. Eden

7
@ b0xxed1n Stashing은 커밋되지 않은 변경에 관한 것이며 분명히 효과가 있습니다.
TJ

git stash는 커밋되지 않은 변경 사항을 저장하여 커밋하지 않고 저장할 수 있습니다.
Rob

git stash 는 다음과 같은 오류를 발생시킵니다 :fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

도움이되지 않았지만 새로운 파일이 남아있었습니다. 내가 한 일은 모든 작업 트리를 완전히 삭제 한 다음

git reset --hard

정리 옵션을 추가하는 데 대한 조언은 " git에서 로컬 작업 디렉토리를 지우려면 어떻게합니까? "를 참조하십시오 -x.

git clean -fdx

참고 -x 플래그는 Git에서 무시되는 모든 파일을 제거하므로 조심하십시오 (내가 대답하는 답변의 토론 참조).


-fdx 란 무엇입니까? "강제, 디렉토리 및 x는?
Adi Prasetyo

@AdiPrasetyo -x 플래그는 무시 된 모든 파일도 제거합니다. 원하지 않는 효과 일 수 있으므로 답변을 업데이트했습니다.
Fr0sT

나는 여전히 재베이스를 할 수 없습니다. 오류 : 오류 : 변경 사항을 병합하지 못했습니다. 에서 발견되어 패치가 실패하는 패치의 복사본을 호출 다시 만들기 0003에서 실패
IgorGanapolsky

13

다음 명령을 사용할 수 있다고 생각합니다. git reset --hard


흠 ... 나는 그것을했지만 내 파일은 여전히 ​​거기에 있습니다. 내가 뭔가를해야합니까?
MEM

1
git reset은 작업 트리에서 커밋되지 않은 변경 사항 만 되돌립니다. 새 파일과 폴더는 제거되지 않습니다. git
Josnidhin에서

1
따라서 새로운 파일과 폴더를 추가하여 시스템 디렉토리를 변경 한 다음 해당 디렉토리를 이전 상태로 되돌리려면 (그 파일과 폴더가없는) git? 그래서 우리가 할 수있는 가장 좋은 것은 파일 상태를 되 돌리는 것입니까? 그러나 파일을 만든 후에는 수동으로하지 않으면 해당 파일을 제거 할 수 없습니까?
MEM

6

사라지지 않는 파일이 여전히있을 수 있습니다. 파일은 편집되지 않았지만 git은 CRLF / LF 변경으로 인해 편집 된 것으로 표시했을 수 있습니다. .gitattributes최근에 변경 한 사항이 있는지 확인하십시오 .

필자의 경우 .gitattributes파일 에 CRLF 설정을 추가 했으며 이로 인해 모든 파일이 "수정 된 파일"목록에 남아있었습니다. .gitattributes 설정을 변경하면 사라졌습니다.


6

커밋되지 않은 변경 사항 (작업 복사본에만 해당)이 최신 커밋에서 복사본으로 되돌리려면 다음을 수행하십시오.

git checkout filename

커밋되지 않은 후에 시도하고 있는데 git rm filename작동하지 않습니다. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

파멸의 솔루션 git rm입니다git checkout master -- filename
falsePockets

3

Git 2.23은 git restore작업 트리 파일을 복원하는 명령을 도입했습니다 .

https://git-scm.com/docs/git-restore

현재 디렉토리의 모든 파일을 복원하려면

자식 복원.

인덱스의 버전과 일치하도록 모든 C 소스 파일을 복원하려는 경우 수행 할 수 있습니다.

자식 복원 '* .c'


1
그건 자식 2.23 가 아닌 2.13
phuclv

2

다음 git 명령을 사용하면 리포지토리에서 커밋되지 않은 모든 변경 사항을 되돌릴 수 있습니다.

git checkout .

예:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

나는 일반적으로 다음과 같이 잘 작동합니다.

mv fold/file /tmp
git checkout fold/file

이것은 357 명의 "좋아요"를 가진 사람이 제안한 것과 정확히 동일합니다. 새로 체크 아웃 한 파일의 백업 만 작성하십시오.
Matthias

-3

안전하고 먼 길 :

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

사용하다:

git reset HEAD filepath

예를 들면 다음과 같습니다.

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