자식 : 새 파일을 포함하여 모든 작업 디렉토리 변경 사항을 취소


1151

추적되지 않은 새 파일을 포함하여 작업 디렉토리에서 모든 변경 사항을 삭제하는 방법 나는 그렇게 git checkout -f하지만, 마지막 커밋 이후에 생성 된 새로운 추적되지 않은 파일을 삭제하지는 않습니다.

아무도 그것을하는 방법을 알고 있습니까?


1
@Joel & 나그네 : 당신은 왜 시도하지 않는 git help resetgit help clean
SHernandez

3
당신의 자식 설정이 별칭을 만드는 것은 좋은 생각입니다)
anubina

답변:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

실제로 삭제하지 않고 미리 삭제되는 내용을 보려면 -n플래그를 사용하십시오 (기본적으로 테스트 실행). 실제로 삭제할 준비가되면 -n플래그 를 제거하십시오 .

git clean -nfd


16
참고 : git reset --hard는 작업 디렉토리 변경뿐만 아니라 단계적 변경도 제거합니다. 또한 git clean -f -d는 추적되지 않은 새 파일을 추가하는 것과 반대되는 것이 좋습니다. 질문에서 asker는 현재 무시 된 파일 세트에 매우 만족할 것입니다.
CB Bailey

7
다음 답변을 읽고 -x 스위치를 조심하십시오. (암호 / db 설정 파일과 같은 로컬 구성을 제거 할 수도 있습니다 (예 : database.yml)
Boris

9
이 경우 -x 스위치는 불필요하며 다소 위험합니다.
Tim Gautier

66
git clean -fxd무엇을하고 있는지 모른다면 실제로 위험 할 수 있습니다. 데이터베이스 등과 같이 매우 중요한 미 추적 파일을 영구적으로 삭제하게 될 수 있습니다.주의하십시오.
메이슨 스튜어트

10
참고 git clean -f -d너무 무시 폴더에서 파일을 삭제합니다. 따라서 모든 로컬 로그와 그와 같은 것들이 사라질 것입니다. 일반적으로 큰 문제는 아니지만 아는 것이 좋습니다.
cyriel

299

가장 자주 사용하는 가장 안전한 방법 :

git clean -fd

/docs/git-clean페이지 당 구문 설명 :

  • -f(별칭 :) --force. Git 구성 변수 clean.requireForce가 false로 설정되지 않은 경우, git clean은 -f, -n 또는 -i를 지정하지 않으면 파일 또는 디렉토리 삭제를 거부합니다. Git은 두 번째 -f를 지정하지 않으면 .git 하위 디렉토리 또는 파일이있는 디렉토리 삭제를 거부합니다.
  • -d. 추적되지 않은 파일 외에 추적되지 않은 디렉토리를 제거하십시오. 추적되지 않은 디렉토리가 다른 Git 저장소에 의해 관리되는 경우 기본적으로 제거되지 않습니다. 그러한 디렉토리를 실제로 제거하려면 -f 옵션을 두 번 사용하십시오.

주석에서 언급했듯이 git clean -nd드라이 런을 수행하고 실제로 삭제하기 전에 삭제할 항목을 알려주는 것이 좋습니다.

git clean문서 페이지 링크 : https://git-scm.com/docs/git-clean


124
나는 항상 git clean -nd .실제로 사용하여 파일을 삭제하기 전에git clean -fd .
tbear

14
왜? 세부 사항을 설명해 주시겠습니까?
Greg B

31
git clean -n 옵션 당 실제로는 아무것도 제거하지 않는 건식 실행이며 수행 할 작업을 보여줍니다.
RNickMcCandless

2
@tbear, 당신은 항상 전에 항상 공백 add -A+ commit -a+를 할 수 있습니다 . 모든 삭제를 검토하는 것은 주요 시나리오에 맞게 확장되지 않습니다. 또한 건식 달리기는 은색 총알이 아닙니다 . 검토 중에 무언가를 놓치 거나 실수를 한 경우 어떻게해야합니까? revert headgit clean
Pacerier

1
이렇게하면 파일이 제거되지만 수정 작업은 취소되지 않습니다.
donquixote

202

모든 내용은 unstaged 파일을 사용합니다 :

git checkout -- .

.끝에 중요하다.

.하위 디렉토리 이름으로 바꾸어 프로젝트의 특정 하위 디렉토리 만 지울 수 있습니다. 이 문제는 특별히 여기에서 해결 됩니다 .


7
@Vincent :--더 이상 매개 변수가 지정되지 않았 음을 checkout 명령에 지시하여 입력 오류를 방지합니다. 그것들이 없으면 현재 분기를 재설정하는 대신 새 분기로 끝날 수 있습니다!
Igor Rodriguez

2
이것이 가장 안전한 방법이지만 추적되지 않은 파일 (새로 추가 된 파일)은 제거하지 않습니다.
TinkerTenorSoftwareGuy

5
삭제되었지만 아직 커밋되지 않은 파일은 복원되지 않습니다.
Cerin

참고로 나는 이것을 놓쳤다. 준비되지 않은 변경 사항을 삭제하려는 디렉토리에 있는지 확인하십시오. 예를 들어, 지점의 다른 위치에서 2 개의 다른 파일 (예 : src/app/work/filename.js및) 이 변경되었습니다 ../app/working/test/filename.js. git checkout -- .지점에서 사용 하면 첫 번째 파일 만 선행 ../없이 삭제되었습니다 . 그래서 cd ../그 명령을 사용하여 두 번째 파일을 삭제하려면 두 번째 위치 디렉토리 로 올라 가야했습니다 .
Chris22

57

git clean명령을 살펴보십시오 .

git-clean-작업 트리에서 추적되지 않은 파일 제거

현재 디렉토리에서 시작하여 버전 제어가 아닌 파일을 재귀 적으로 제거하여 작업 트리를 정리합니다.

일반적으로 git에 알려지지 않은 파일 만 제거되지만 -x 옵션을 지정하면 무시 된 파일도 제거됩니다. 예를 들어 모든 빌드 제품을 제거하는 데 유용 할 수 있습니다.


나는 git clean -i메뉴에서 "깨끗한"을 시도 하고 선택했습니다-이것은 마침내 새로운 파일을 제거했습니다.
Sany

43

다음과 같이 작동합니다.

git add -A .
git stash
git stash drop stash@{0}

이렇게하면 비 단계적 및 단계적 로컬 변경 사항이 모두 삭제됩니다. 따라서이 명령을 실행하기 전에 유지하려는 모든 것을 커밋해야합니다.

일반적인 사용 사례 : 많은 파일이나 디렉토리를 이동 한 다음 원래 상태로 되돌리려 고합니다.

크레딧 : https://stackoverflow.com/a/52719/246724


1
왜 대신에 stash @ {0}을 참조하고 git stash drop있습니까?
maikel

솔직히, 나는 기억하지 않는다 :)
donquixote

이것은 효과가 있었다. 참고로, 홈 디렉토리 ( git add -A .) 에 있는지 확인하십시오 . 일치하는 파일이 없었기 때문에 30m을 잃었습니다. 감사!
user9869932

나는이 접근법을 사용했지만 장점이 있습니다. 그러나 jfountain과 Heath Dutton이 제안한 솔루션이 원래 문제인 IMHO에 더 적합하다는 것을 알았습니다.
HeyZiko

2
git stash drop stash @ {0} git stash를 사용하면 최신 stash를 삭제합니다. git stash
stashe

42

이 작업은 두 단계로 수행 할 수 있습니다.

  1. 수정 된 파일 되돌리기 : git checkout -f
  2. 추적되지 않은 파일을 제거하십시오. git clean -fd

3
단순하기 때문에 +1 또한 작동하고 OP로 원하는 것을 정확하게하지 않기 때문에 모든 것을 삭제합니다.
geekzster

30

나는 그것이 생각했다 ( 경고 : 다음 모든 것을 지울 것이다 )

$ git reset --hard HEAD
$ git clean -fd

reset변경 사항을 취소합니다. 은 clean어떤 비 추적 제거하는 F의 세틸 및 개발 irectories한다.


그래도 문제가 해결되지 않고 git pull나중에 계속해서 충돌 경고가 표시됩니다 . CONFLICT (content): Merge conflict in...이 문제는 다음과 같이 해결했습니다.git pull --strategy=ours
rubo77


4

git clean -i먼저 삭제할 항목을 표시하고 확인 후 진행합니다. 실수로 삭제해서는 안되는 중요한 파일을 다룰 때 유용합니다.

git help clean다른 유용한 옵션을 포함하여 자세한 내용을 참조하십시오 .


4

모든 변경 사항을 삭제하려면의 별칭에서 유효한 옵션을 사용할 수 있습니다 .gitconfig. 예를 들어 :

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

용법: git discard


1
내가 매우 좋아하는이 별칭
플래그

3

다른 해결책은 변경 사항을 커밋 한 다음 해당 커밋을 제거하는 것입니다. 처음에는 즉각적인 이점이 없지만 청크를 커밋하고 백업을 위해 git 태그를 만들 수 있습니다.

현재 분기에서 다음과 같이 할 수 있습니다.

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

또는 분리 된 HEAD에서 할 수 있습니다. (BRANCHNAME 지점에서 시작한다고 가정) :

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

그러나, 내가 보통하는 일은 청크로 커밋 한 다음, 커밋의 일부 또는 전부를 "DISCARD : ..."로 명명하는 것입니다. 그런 다음 대화식 리베이스를 사용하여 잘못된 커밋을 제거하고 좋은 커밋을 유지하십시오.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

이것은 더 장황하지만, 어떤 변경 사항을 취소 할 것인지 정확하게 검토 할 수 있습니다.

git lolgit lola 바로 가기이 워크 플로에 매우 도움이되었습니다.



0

이것은 아마도 멍청한 대답이지만, Windows에는 TortoiseGit을 사용하며 REVERT라는 멋진 기능이 있습니다. 따라서 로컬 비 단계 비 푸시 변경 사항을 되돌리려면 다음을 수행하십시오.

  1. 필요한 폴더의 상황에 맞는 메뉴를 불러오고 되돌리기를 선택하면 되 돌린 / 복구 할 변경된 파일을 선택할 수있는 되돌리기 팝업이 표시됩니다.
  2. git에 있지 않은 추가 파일을 삭제하려면 동일한 컨텍스트 메뉴에서 커밋을 클릭하면 커밋 팝업이 나타나고 추가 된 파일이 표시됩니다. 그런 다음 각 파일을 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택하십시오. 그러나 커밋을 원하지는 않지만 추가 된 파일 만보고 여기에서 삭제하므로이 팝업에서 Commit btn을 누르지 마십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.