문제

이 가능한 변경 사항을 취소해 다음과 같은 명령?그렇다면,어떻게 합니까?

git reset --hard HEAD~1
도움이 되었습니까?

해결책

Pat Notz 올바른 것입니다.을 얻을 수 있습 commit 다시 그렇게 오래로 그것이 이내에 몇 가지 일입니다.git 만 쓰레기 수집에 대한 후 한 달 정도가 명시적으로 동의하지 않는 한 말이 그것을 제거하는 새로운 해당합니다.

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

당신이 볼 수 있는 예제에서는 file2 이 제거되었으로 결과의 하드 재설정되었지만에 다시 넣을 때 내가 다시 설정을 통해 reflog.

다른 팁

당신이 원하는 무엇이 지정하는 sha1 의 commit 복원하려고 합니다.당신이 얻을 수 있는 sha1 을 검토하여 reflog(git reflog 다)및 그런 일을

git reset --hard <sha1 of desired commit>

하지만 너무 오래 기다리지 않는...몇 주 후 git 결국 참 commit 로 참조되지 않고 삭제 모든 해당합니다.

대답은 숨겨진에 대한 자세한 응답,위의 단순히 할 수 있:

$> git reset --hard HEAD@{1}

(참조하십시오 출력 git reflog 표시)

그것은 가능한 경우 복구하 Git 지 않은 쓰레기를 수집한 아직입니다.

의 개요를 얻을 매달려 commits 과 fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

구에 매달려 commit 와 리베:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

는 경우에 당신은 정말 행운이,같이었다,다시 갈 수 있으로 귀하의 텍스트 편집기와 충돌'취소'.

내가 알고 있는지 정말로 적당한 답변,하지만 그것이 나를 구 절반이 하루의 작품은 그렇게 잘하면 그것을 할 거 야 같은 다른 사람을 위해!

예 IRL 경우:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.

내가 알기로, --hard 이 삭제되지 않은 변경사항.이후 이러한지 않으로 추적할 수 있습니다..하지만 당신은 할 수 있습니다. discarded commit.

$ git reflog

이트:

b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....

4bac331discarded commit.

지금은 머리를 이동하는 commit::

$ git reset --hard 4bac331

대부분의 경우,그렇습니다.

상태에 따라 귀하의 저장소에 명령을 실행할 때의 효과 git reset --hard 할 수 있는 범위에서 사소한을 취소,기본적으로 불가능합니다.

아래에 나열되어 다양한 가능 시나리오,그리고 어떻게 회복할 수도 있습니다.

내 모든 변경 사항력,하지만 지금은 커밋 수 있습니다.

이 상황은 일반적으로 발생하면 당신은 실행 git reset 인수와 함께,같이 git reset --hard HEAD~.걱정하지 마세요,이것은 복구하기 쉽다!

는 경우에 당신은 실행 git reset 과 아무것도 하지 않았다는 다른 이후 다시 얻을 수있는,당신은 어디 있었으로 이 one-liner:

git reset --hard @{1}

이 재설정은 현재의 지점은 어떤 상태에 있었기 전에 마지막으로 수정되었(에서 당신의 경우,가장 최근 수정을 지 것 하드 재설정하려고 하는 취소).

는 경우,그러나,당신은 당신 다른 수정을 지점 재설정 이후에,한 줄 위에 작동하지 않습니다.대신 실행해야 합니다 git reflog <branchname> 목록을 참조하십시오의 모든 변경 사항을 지점(을 포함한 다).는 목록은 아래와 같습니다:

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

찾 작업을 이 목록에서 원하는"취소".위의 예에서,그것은 첫 번째 라인,라고 하는 것은"다시 설정:이동하는 머리를~".다음 사본을 표현하 (아래)하는 작업입니다.우리의 경우에는 것 master@{1} (나 3ae5027, 그들은 모두 나타내는 동일한 커밋),그리고 실행 git reset --hard <commit> 를 재설정은 현재 지점에 다시는 것입니다.

내가 개최 나의 변경 git add, 지만,최선을 다하고 적.지금 나의 변경은 간다!

이것은 조금 더 까다에서 복구합니다.git 는 파일의 복사본을 추가,그러나 이러한 복사본 적이 없었는 어떤 특정 commit 복원할 수 없습니다 변화는 한 번에 모두.대신에,당신은 당신을 찾는 개별 파일에서 git 의 데이터베이스를 복원할 수 있습니다.당신이 사용하여 이 작업을 수행할 수 있습 git fsck.

에 대한 자세한 내용을 참조하십시오 취소 git 은 리셋--단단한 커밋되지 않은 파일 준비 지역.

나는 파일 내용을 변경하면서 작업 디렉터리로 나가지 않으로 개최 git add, 고,최선을 다하고 적.지금 나의 변경은 간다!

Uh oh.내가 싫어 말이지만 당신은 아마 운입니다.git 저장하지 않는 변화를 추가하지 않거나 투입하는것,그에 따라 에 대한 문서 git reset:

--단단

리셋이 인덱스 작업 나무입니다. 어떤 변화를 추적 파일에서 작업하기 때문에 나무 <commit> 는 삭제됩니다.

그것은 당신이 당신 를 복구할 수 있 변경 사항이 어떤 종류의 디스크 복구 또는 유틸리티 데이터 복구 전문 서비스,그러나 이 시점에서는 아마 많은 문제보다 가치가있다.

하지 않은 경우에는 쓰레기 수집 귀하의 저장소에(예를들면용 git repack -dgit gc, 하지만 주는 쓰레기 수집할 수 있습도가 자동으로 발생),다음의 commit 는 여전히있다–그것은 단지를 연결할 수 없을 통해 머리에 있습니다.

할 수 있습을 찾아보십시오 당신의 커밋해 보고를 통해 출력 git fsck --lost-found.

최신 버전의 Git 이라는 것"reflog"을 로그의 모든 변경 사항을 심판(반대로 변경된 내용을 저장소 내용).그래서 예를 들어,전환할 때마다 당신의 머리(즉시 git checkout 전환하는 지점은 불가)하는 것이 기록됩니다.그리고 물론,의 git reset 또한 조작하는 머리,그래서 그것은 또한 기록합니다.액세스할 수 있습니다 오래된국의 심판 유사한 방법에 액세스할 수 있는 오래된국의 저장,사용하여 @ 대신 로그인 ~, 처럼, git reset HEAD@{1}.

그것은 내게 이해하려면 어떤 차이가 사 HEAD@{1}및 HEAD~1 다,그래서 여기에 약간의 설명:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

그래서, HEAD~1 의"go to commit commit 하기 전에는 머리를 현재 포인트에서"동 HEAD@{1} 의"go to commit 는 머리에서 지적하기 전에 그것을 지적하는 곳에서는 현재 포인트에서".

는 것을 쉽게 찾을 수 있도록 허용하는 당신의 잃어하는 복구합니다.

내가 이것을 알고 있는 오래된 스레드...하지만 많은 사람들이 찾는 방법을 취소하는 물건에 자식,내가 아직도 생각될 수 있는 좋은 아이디어를 제공하기 위해 계속 팁 여기에.

을 할 때"git 추가"또는 이것에서 왼쪽을 왼쪽 하단에 git gui 의 내용이 파일에 저장되 blob,파일 내용을 복구 할 수 있는 합니다.

그래서 그것은 가능한 파일을 복구되지 않은 경우에도 커지만 그것은 추가되었습니다.

git init  
echo hello >> test.txt  
git add test.txt  

지금 blob 가 만들어지지만 그것은에서 참조하는 색인 것입니다 그래서 더 나열 git fsck 까지 우리는 다시 설정됩니다.그래서 우리는 다시...

git reset --hard  
git fsck  

당신을 얻을 것이 매 blob ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

것이 당신에게 파일의 콘텐츠에"안녕하세요"뒤로

을 찾는 참조되지 않은 커밋을 발견했 끝이 어딘가에 제안이다.

gitk --all $(git log -g --pretty=format:%h)  

나는 그것은 도구로서 git gui 그리고 그것은 매우 편리합니다.

대답하기 전에 추가할 수 있습니다 몇 배경을 설명하고,어떤 이 HEAD.

First of all what is HEAD?

HEAD 단순히 참조하여 현재 commit(최신)현재 지점에 있습니다.
만 사용할 수 있는 단일 HEAD 주어진 시간이다.(제외 git worktree)

콘텐츠 HEAD 내부에 저장됩니다 .git/HEAD 와 그것을 포함 40 바이트 SHA-1 현재다.


detached HEAD

지 않는 경우에는 최신 commit-의미 HEAD 를 가리키는 사전에 투입하는 역사의 소위 detached HEAD.

enter image description here

명령행에 그것은 다음과 같이 표시됩니다-SHA-1 대신 지점의 이름은 이후 HEAD 을 가리키지 않을의 끝에 현재

enter image description here


몇 가지 옵션을 복구하는 방법에 대에서 분리 헤드:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

이 체크아웃 새로운 지점을 가리키는 원다.
이 명령을 체크 아웃 주어진다.
에 이점을 만들 수 있습니다점 작업을 시작하는 이 시점에서.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

당신은 항상 사용할 수 있습니다 reflog 뿐만 아니라.
git reflog 표시됩니다 어떤 변화를 업데이트 HEAD 을 확인하기 원하는 reflog 항목을 설정합니다 HEAD 이다.

모든 시간을 머리에는 수정이있을 것이다 새로운 항목 reflog

git reflog
git checkout HEAD@{...}

이에 당신을 다시 얻을 것이 원하는 커밋

enter image description here


git reset HEAD --hard <commit_id>

"이동"당신의 머리로 다시 원다.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • 참고:(부터 2.7Git)
    사용할 수도 있습니다 git rebase --no-autostash 뿐만 아니라.


git revert <sha-1>

"취소"주어진 커밋거나 범위에 있습니다.
Reset 명령은"취소"모든 변경 사항에 주어진다.
새로운 커밋을 취소 정보를 제공하는 패키지입니다 최선을 다하고 있는 동안 원래 commit 것을 역사에 남아 있을 뿐입니다.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

이 스키마를 설명하는 명령은 무엇입니다.
당신이 볼 수 있듯이 reset && checkoutHEAD.

enter image description here

나는 그냥 하드 재설정에 잘못된 프로젝트입니다.무엇이 내 삶 Eclipse 지역의 역사입니다.IntelliJ 생각했다고 한,너무,그리고 당신의 편집기,그것의 가치 확인:

  1. Eclipse 도움을 주제에 지역의 역사
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F

로 만든 작은 스크립트는 그것을 약간 더 쉽게 찾을 수 있 commit 하나를 찾고 있습니다:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

네,그것을 만들 수 있습니다 상당히 예뻐으로 awk 또는 무언가가 그것을 좋아하지만,그것은 간단하고 그냥 나이 필요합니다.을 저장할 수 있는 다른 사람이 30 초 동안 울립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top