programing

Git에서 손실된 커밋을 복구하려면 어떻게 해야 합니까?

muds 2023. 5. 16. 23:11
반응형

Git에서 손실된 커밋을 복구하려면 어떻게 해야 합니까?

먼저 "당신의 브랜치가 오리진/마스터보다 3 커밋 앞서 있습니다"라는 메시지를 받은 후, 제 앱은 이전의 변경 사항으로 이전 시간으로 되돌아갔습니다.

어떻게 하면 지난 11시간 동안 했던 일을 되돌릴 수 있을까요?

git reflog 당신의 친구입니다.해당 목록에서 사용할 커밋을 찾은 다음 이 커밋으로 재설정할 수 있습니다(예:git reset --hard e870e41).

(변경 사항을 커밋하지 않은 경우...당신은 곤경에 처할 수 있습니다 - 일찍 약속하고, 자주 약속하세요!)

답변하기 전에 배경을 추가하여 설명하겠습니다.HEAD사실은.

First of all what is HEAD?

HEAD는 현재 분기의 현재 커밋(커밋)에 대한 단순한 참조입니다.
있을 수 .HEAD든지 (단 언든제지외(제제)) 제외)git worktree).

HEAD는 내에저다니됩 에 저장됩니다..git/HEAD현재 커밋의 40바이트 SHA-1이 포함되어 있습니다.


detached HEAD

최신 커밋에 참여하지 않은 경우 - 즉,HEAD역사상 이전의 커밋을 가리키고 있습니다.

여기에 이미지 설명 입력

이름 대신 됩니다. 지점 이름 대신 SHA-1.HEAD가 현재 분기의 끝을 가리키고 있지 않습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력


분리된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션:


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다시 이 약속으로 돌아가겠습니다.

마다 HEAD에 새 됩니다.reflog

git reflog
git checkout HEAD@{...}

원하는 커밋으로 돌아갑니다.

여기에 이미지 설명 입력


git reset --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.
  • 참고: (Git 2.7 이후) 또한 사용할 수 있습니다.git rebase --no-autostash뿐만 아니라.

git revert <sha-1>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
재설정 명령은 지정된 커밋에서 변경한 내용을 "실행 취소"합니다.
원래 커밋이 기록에 남아 있는 동안 실행 취소 패치를 사용하여 새 커밋이 커밋됩니다.

# Add a 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 && checkout를 수정합니다.HEAD.

여기에 이미지 설명 입력

하는 또 은 " ▁anothergit fsck지휘권

git fsck --lost-found

그러면 마지막 줄에 다음과 같이 출력됩니다.

dangling commit xyz

다음을 사용하여 동일한 커밋인지 확인할 수 있습니다.reflog다른 답변에서 제시한 바와 같이이제 할 수 있습니다.git merge

git merge xyz

참조:
우리는 을 수는커되없다니로 되돌릴 수 .fsck 경우한행실미를 했다면.git gc매달린 커밋에 대한 참조를 제거하는 명령입니다.

바로 오늘 저에게 이런 일이 있어서 저에게 생명의 은인으로 나온 것을 씁니다.제 대답은 @Amber의 대답과 매우 유사합니다.

는 를 했습니다.git reflog그리고 그 특정 커밋의 해시를 검색한 다음, 그 해시를 복사하고 실행했습니다.git cherry-pick <hash>으로 모든 에 대한 시켰습니다.이것은 잃어버린 약속에서 현재 지점으로 모든 변화를 가져왔고, GIT에 대한 저의 믿음을 회복시켰습니다.

좋은 하루 보내세요!

시도해 보십시오. 일정 기간 동안 Git에 기록된 모든 커밋이 표시됩니다.

git reflog

원하는 커밋 찾기

git log HEAD@{3}

또는

git log -p HEAD@{3}    

그렇다면 올바른 것인지 확인해 보십시오.

git checkout HEAD@{3}

그러면 해당 커밋에 대한 분리된 헤드가 생성됩니다.필요한 경우 변경사항 추가 및 커밋

git status 
git add
git commit -m "temp_work" 

이제 분기에 커밋을 다시 복원하려면 마스터라고 말하면 이 분기 스위치의 이름을 마스터로 지정한 다음 마스터로 병합해야 합니다.

git branch temp
git checkout master
git merge temp

Git 튜토리얼 사이트의 reflog에 대한 링크도 다음과 같습니다.아틀라스 깃 튜토리얼

이 당신의 약속을 수 .git reflog그리고 당신은 IntelliJIDE를 사용하고 있었습니다 당신은 할 수 있습니다.right click on your project root folder -> Local History -> Show History변경 내용을 되돌립니다.

가 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 하다가 요.git rebase와 함께git push -f로컬 및 원격 저장소에서 커밋이 삭제되었기 때문에 이것이 진정으로 저를 구했습니다.

누군가의 하루를 구하는 희망

건배.

우선 git reflog를 사용하여 잃어버린 커밋조차도 모든 커밋을 나열합니다.

git reflog

그런 다음 git log HEAD@{your_commit_number}을(를) 사용하여 원하는 커밋을 찾습니다.

git log HEAD@{17}

git checkout HEAD@{your_commit_number}을(를) 사용하여 커밋을 찾은 후 커밋에 체크인합니다.

git checkout HEAD@{17}

변경 사항을 추가하고 커밋해야 할 수도 있습니다.

git add .
git commit -m"quuck_fix"

그런 다음 임시 분기를 생성하여 분기에 커밋을 다시 복원해야 합니다.

git branch temp

마지막으로 기존 분기를 체크아웃한 다음 임시 분기를 병합합니다.

#git checkout <your_existing_branch> e.g

git checkout main
git merge temp

하는 것이 가장 안전한 방법입니다.

  1. 복원할 상태에 대한 커밋 헤드 번호 찾기

git reflog또는git reflog | grep your_phrase

  1. 새 분기를 생성합니다.

git checkout -b your-branch HEAD@{<your-number>}

슬프게도 git은 너무 믿을 수 없어요 :( 저는 방금 이틀간 일을 잃었어요 :(

커밋하기 전에 수동으로 백업하는 것이 가장 좋습니다.나는 그냥 "git commit"을 했고 아무 말 없이 내 모든 변화를 파괴했습니다.

저는 교훈을 얻었습니다. 다음 번에는 백업을 먼저 하고 다음에는 커밋을 해야 합니다.어떤 일에도 깃을 믿지 마.

언급URL : https://stackoverflow.com/questions/10099258/how-can-i-recover-a-lost-commit-in-git

반응형