Git 관리 프로젝트의 모든 로컬 변경 사항을 이전 상태로 되돌리려면 어떻게해야합니까?


1913

내가 실행 한 프로젝트가 git init있습니다. 여러 번 커밋 한 후에 git status모든 것이 최신 상태이며 로컬 변경 사항이 없다고 말했습니다.

그런 다음 몇 가지 연속적인 변경을 수행하고 모든 것을 버리고 원래 상태로 돌아가고 싶다는 것을 깨달았습니다. 이 명령이 저에게 도움이됩니까?

git reset --hard HEAD

답변:


3388

작업 사본의 변경 사항을 되돌리려면 다음과 같이하십시오.

git checkout .

색인에 대한 변경 사항을 되돌리려면 (즉 추가 한 내용)이를 수행하십시오. 경고하면 푸시되지 않은 커밋이 모두 마스터로 재설정됩니다! :

git reset

커밋 한 변경 사항을 되돌리려면 다음과 같이하십시오.

git revert <commit 1> <commit 2>

추적되지 않은 파일 (예 : 새 파일, 생성 된 파일)을 제거하려는 경우 :

git clean -f

또는 추적되지 않은 디렉토리 (예 : 새 디렉토리 또는 자동으로 생성 된 디렉토리) :

git clean -fd

133
오랜 시간 동안 git checkout path/to/filepath/to/file
뒤틀린

29
git clean -f (추적되지 않은 변경 사항을 제거하기 위해)와 -fd (추적되지 않은 디렉토리를 제거하기 위해)를 언급하는 아래 답변에 +1
ptdev

3
추적되지 않은 파일도 정리하려면이 stackoverflow.com/questions/61212/…를 참조하십시오.
Surasin Tancharoen

9
git checkout .git reset [--hard HEAD]작동하지 않았다, 나는해야했다 git clean -fd나의 변화를 되돌릴.
BrainSlugs83

7
git reset변경 사항을 재설정하지 않습니다 git reset --hard.
Cerin

388

참고 : 실행하고 싶을 수도 있습니다

git clean -fd

같이

git reset --hard

추적 되지 않은 파일 은 제거 하지 않습니다 . 여기서 git-clean은 추적 된 루트 디렉토리에서 git 추적에없는 파일을 제거합니다. 경고-이 점에주의하십시오! 무엇을 삭제할지 확인하려면 먼저 git-clean으로 드라 이런을 실행하는 것이 좋습니다.

이 오류 메시지가 나타날 때 특히 유용합니다

~"performing this command will cause an un-tracked file to be overwritten"

여러 가지 일을 할 때 발생할 수있는 일 중 하나는 나와 친구가 같은 이름의 새 파일을 추가했을 때 작업 사본을 업데이트하는 중이지만 먼저 소스 제어에 커밋 한 후 추적되지 않은 사본을 삭제하지 않아도됩니다. .

이 경우 드라이 런을 수행하면 덮어 쓸 파일 목록이 표시됩니다.


13
파일 정리 명령은 "git clean -f"입니다. 추적되지 않은 디렉토리는 "git clean -d"로 제거됩니다.
Jonathan Mitchell

35
git clean -fd (-d에는 힘이 필요합니다)
electblake

14
-n 또는 --dry-run은 드라 이런 플래그입니다.
stephenbez

2
자식 저장소에 다른 자식 저장소가있는 경우 git clean -ffd. 이중 f가 없으면 제거되지 않습니다.
Trismegistos

148

복제

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ 푸시되지 않은 로컬 커밋을 삭제합니다.
  • ✅ 추적 된 파일에 대한 변경 사항을 되돌립니다
  • ✅ 삭제 한 추적 파일을 복원합니다
  • .gitignorebuild 빌드 파일과 같이 나열된 파일 / 디렉토리를 삭제합니다.
  • ✅ 추적되지 않은 파일 / 디렉토리를 삭제합니다. .gitignore
  • 😀이 접근법을 잊지 않을 것입니다
  • 😔 낭비 대역폭

다음은 내가 잊어 버린 다른 명령입니다.

청소 및 재설정

git clean --force -d -x
git reset --hard
  • ❌ 푸시되지 않은 로컬 커밋을 삭제합니다.
  • ✅ 추적 된 파일에 대한 변경 사항을 되돌립니다
  • ✅ 삭제 한 추적 파일을 복원합니다
  • .gitignorebuild 빌드 파일과 같이 나열된 파일 / 디렉토리를 삭제합니다.
  • ✅ 추적되지 않은 파일 / 디렉토리를 삭제합니다. .gitignore

깨끗한

git clean --force -d -x
  • ❌ 푸시되지 않은 로컬 커밋을 삭제합니다.
  • ❌ 추적 된 파일의 변경 사항을 되돌립니다
  • ❌ 삭제 한 추적 파일을 복원합니다
  • .gitignorebuild 빌드 파일과 같이 나열된 파일 / 디렉토리를 삭제합니다.
  • ✅ 추적되지 않은 파일 / 디렉토리를 삭제합니다. .gitignore

초기화

git reset --hard
  • ❌ 푸시되지 않은 로컬 커밋을 삭제합니다.
  • ✅ 추적 된 파일에 대한 변경 사항을 되돌립니다
  • ✅ 삭제 한 추적 파일을 복원합니다
  • .gitignore(빌드 파일과 같이)에 나열된 파일 / 디렉토리를 삭제합니다
  • ❌ 추적되지 않은 파일 / 디렉토리를 삭제합니다. .gitignore

노트

위의 모든 사항을 확인하기위한 테스트 사례 (bash 또는 sh 사용) :

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

또한보십시오

  • git revert 이전 커밋을 취소하는 새로운 커밋 만들기
  • git checkout 이전 커밋으로 시간을 되돌리려면 (위의 명령을 먼저 실행해야 할 수도 있음)
  • git stashgit reset위와 동일 하지만 실행 취소 할 수 있습니다

위의 답변을 훔쳐서 죄송합니다. 나는이 참조를 지속적으로 사용하여 주로 나를 위해 게시합니다.
윌리엄 Entriken

1
첫 번째 옵션 ( Re-clone )은 실제로 "푸시되지 않은 로컬 커밋 삭제"를 수행합니다. :)
Marandil

1
@styfle ✅가하는 일, ❌가하지 않는 일
William Entriken

3
@FullDecent 읽는 것이 혼란 스럽습니다. "❌ 푸시되지 않은 로컬 커밋을 삭제하지 않습니다". 그것은 삭제되지 않음을 의미합니다. 이중 부정은 삭제한다는 의미입니까?
styfle

1
-x 플래그 정보 git clean -f -d -x: -x 옵션을 지정하면 무시 된 파일도 제거됩니다. 예를 들어, 모든 빌드 제품을 제거하는 데 유용 할 수 있습니다.
Alex

82

모든 변경 사항을 되돌리고 현재 원격 마스터를 최신 상태로 유지하려면 (예를 들어, 마스터 HEAD가 분기되어 앞으로 밀렸으며 푸시가 '거부 됨'인 경우) 다음을 사용할 수 있습니다.

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

(작동하는) 을 지정 origin하는 것이 중요해 보입니다. git reset --hard origin/master– (없이 git reset --hard) 아무것도 바뀌지 않는 것 같습니다.
Jake

나는 --hard 원산지 / 마스터를 다시 힘내 한 모든 명령에 의해 그들을 제거 할 수 일부 로컬 변경하지 있었고, 그것은뿐만 아니라 풀 마스터의 변경을 할 수 있었다
abhishek ringsia

50

git-reflog를 살펴보십시오. 기억하는 모든 상태가 나열되며 (기본값은 30 일) 원하는 상태를 간단히 체크 아웃 할 수 있습니다. 예를 들면 다음과 같습니다.

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

git reflog에 대해 많은 William에게 감사드립니다. 트리를 이전 버전으로 재설정하고 최근 검색 방법을 잘 모르겠습니다. git reflog가 나를 저장했습니다. 다시 한번 감사합니다.
palaniraja

1
저를 구했습니다! 제 경우에는 모험 git rebase -i이 잘못되었습니다 (편집 실수로 커밋을 지우는 것으로 끝났습니다). 이 팁 덕분에 나는 좋은 상태로 돌아 왔습니다!
paneer_tikka 2013 년

기본 30 일이란 무엇입니까?!
Mohe TheDreamy

@MoheTheDreamy 시간 제한이 있음을 의미합니다. 결국 가비지 수집기는 연령이 제한을 초과하면 도달 할 수없는 참조를 삭제합니다. 기본값은 30 일이었습니다. 따라서 이전 참조는 사용하지 못할 수 있습니다.
윌리엄 Pursell

36

위험 미리보기 : (주석을 읽으십시오. 내 답변에서 제안한 명령을 실행하면 원하는 것보다 더 많이 삭제 될 수 있습니다)

내가 실행 해야하는 디렉토리를 포함한 모든 파일을 완전히 제거하려면

git clean -f -d

13
방금 겪은 고통을 저장하려면 .gitignore-d 파일도 삭제됩니다!
landons

내가 문제를 일으킨다면 죄송합니다. 그때 나는 그 폴더의 모든 것을 되돌리고 삭제하려고했습니다. 나는 정확한 상황을 기억하지 못하지만 "-d"만이 나를 위해 일한 것입니다. 나는 당신에게 너무 많은 고통을주지 않기를 바랍니다 :-)
Tobias Gassmann

1
해를 끼치 지 않습니다. 나는 백업을 가지고 있지만 이것은 아마도 면책 조항을 보증합니다;)
landons

35

많은 답변을 읽고 시도한 후 때로는 작업 복사본을 완전히 정리하지 못하는 다양한 경우를 발견했습니다.

여기에 현재 bash 스크립트가 있습니다. 항상 작동합니다.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

작업 사본 루트 디렉토리에서 실행하십시오.


10
마지막 명령으로error: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
내가 "-"를 꺼내면 그것은 나를 위해 일했습니다. git checkout HEAD
Jester September

4
git reset --hard추적 된 파일을 되돌 리거나 (단계적 또는하지 않음) git clean -f -d추적 되지 않은 파일을 제거합니다. git checkout -- HEAD왜 필요한가요?
v.shashenko

이중 하이픈이 필요하지 않습니다. 오타 여야합니다.
Farax

35

간단히 실행하십시오-

git stash

모든 로컬 변경 사항이 제거됩니다. 나중에 실행하여 사용할 수도 있습니다-

git stash apply 

3
사용 git stash pop하면 자동으로 가장 많이 변경된 변경 사항이 자동으로 제거됩니다.
Arrow Cen

8
git stash drop작업 복사본에 적용하지 않고 최신 숨김 상태를 제거합니다.
deerchao

git stash apply는 새로 생성 된 파일을 추가하지 않습니다
Ravistm

27

나는 비슷한 문제를 만났다. 해결책은git log 어떤 버전의 로컬 커밋이 원격과 다른지를 찾는 하는 것입니다. (예 : 버전은 3c74a11530697214cbcc4b7b98bf7a65952a34ec)입니다.

그런 다음을 사용 git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec하여 변경 사항을 되 돌리십시오.


16

비슷한 문제를 검색했습니다.

지역 커밋을 버리고 싶었습니다.

  1. 저장소를 복제했습니다 (git clone)
  2. dev 브랜치로 전환 (git checkout dev)
  3. 커밋이 거의 없습니다 (git commit -m "commit 1")
  4. 그러나이 로컬 커밋을 버리고 원격 (origin / dev)

아래도 마찬가지였습니다.

git reset --hard origin/dev

검사:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

이제 로컬 커밋이 손실되고 처음 복제 된 상태로 돌아갑니다 (위의 1 지점).


1
고마워, 그것은 나를 위해 일한 유일한 것- "git reset --hard origin"
Nisim Naim

도움이 된 것을 알게되어 기쁩니다.
마노 하르 레디 포로 디

7

작업 디렉토리에 작업 / 파일을 숨기고 싶을 필요는 없지만 대신 완전히 제거하십시오. 명령 git clean이이를 수행합니다.

이 작업을 수행하는 일반적인 사용 사례는 병합 또는 외부 도구로 생성 된 크래프트제거 하거나 다른 파일을 제거하여 깨끗한 빌드를 실행할 수 있습니다.

이 명령은 추적되지 않는 로컬 작업 디렉토리에서 파일을 제거하도록 설계되었으므로이 명령에 매우주의해야합니다. 이 명령을 실행 한 후 갑자기 마음이 바뀌면 제거 된 파일의 내용을 다시 볼 수 없습니다. 더 안전한 대안은 실행하는 것입니다.

git stash --all

모든 것을 제거하지만 모두 숨김 상태로 저장합니다. 그런 다음이 숨김을 나중에 사용할 수 있습니다.

그러나 모든 파일을 제거하고 작업 디렉토리를 정리하려면 실제로 실행해야합니다.

git clean -f -d

이렇게하면 명령의 결과로 항목이없는 파일과 하위 디렉토리가 제거됩니다. git clean -f -d명령을 실행 하기 전에해야 할 현명한 일은

git clean -f -d -n

실행 후 제거 할 내용의 미리보기가 표시됩니다 git clean -f -d

가장 공격적인 것부터 가장 덜 공격적인 것까지의 옵션 요약은 다음과 같습니다.


옵션 1 : 모든 파일을 로컬에서 제거

git clean -f -d

옵션 2 : 위의 영향 미리보기 (가장 공격적인 미리보기)

git clean -f -d -n

옵션 3 : 모든 파일 숨김 (최소 공격적)

`git stash --all` 

6

로컬 브랜치에서 커밋되지 않은 모든 변경 사항을 되돌리려면 이것을 시도하십시오

$ git reset --hard HEAD

그러나 다음과 같은 오류가 표시되면

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

'.git'폴더로 이동 한 다음 index.lock 파일을 삭제할 수 있습니다.

$ cd /directory/for/your/project/.git/
$ rm index.lock

마지막으로 다음 명령을 다시 실행하십시오.

$ git reset --hard HEAD

0

이 질문은 더 넓은 저장소 재설정 / 되돌리기에 관한 것이지만 개별 변경 사항을 되 돌리는 데 관심이있는 경우 비슷한 대답을 여기에 추가했습니다.

https://stackoverflow.com/a/60890371/2338477

질문에 대한 답변 :

  • git history에서 변경 유지 여부에 관계없이 개별 변경 사항을 되 돌리는 방법

  • 같은 상태에서 다시 시작하기 위해 이전 버전으로 돌아가는 방법

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