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 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
하는 것이 가장 안전한 방법입니다.
- 복원할 상태에 대한 커밋 헤드 번호 찾기
git reflog
또는git reflog | grep your_phrase
- 새 분기를 생성합니다.
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
'programing' 카테고리의 다른 글
ThreadPoolExecutor().map이 ThreadPoolExecutor().submit와 어떻게 다릅니까? (0) | 2023.05.16 |
---|---|
WP7 응용 프로그램 모음 아이콘이 시뮬레이터에 표시되지 않음(단, 블렌드에서는 작동함) (0) | 2023.05.16 |
Git에서 현재 분기만 표시 (0) | 2023.05.16 |
node.js 파일 제거 (0) | 2023.05.16 |
확인란이 선택되어 있는지 여부를 jQuery (0) | 2023.05.16 |