Git에서 삭제 한 지점을 복구 할 수 있습니까? 있습니까? delete branch 명령을 실행하지

를 실행 git branch -d XYZ하면 지점을 복구하는 방법이 있습니까? delete branch 명령을 실행하지 않은 것처럼 되돌아 갈 수있는 방법이 있습니까?



답변

예, git reflog삭제 된 분기의 끝에서 커밋에 대한 SHA1 을 수행 하고 찾을 수 있어야합니다 git checkout [sha]. 일단 커밋 git checkout -b [branchname]을 마치면 지점을 다시 만들 수 있습니다 .


이 압축 형 / 한-라이너 버전에 대해서는 @Cascabel이 제공합니다.

한 단계로 수행 할 수 있습니다.

git checkout -b <branch> <sha>


답변

도달 할 수없는 커밋은 대부분 reflog에 있습니다. 따라서 가장 먼저 시도해야 할 것은 명령을 사용하여 reflog를 보는 것입니다 (에 대한 refloggit reflog표시 함 HEAD).

커밋이 여전히 존재하는 특정 브랜치의 일부인 경우 더 쉬운 방법은 명령을 사용하는 것 git reflog name-of-my-branch입니다. 당신이 밀어 강제 경우는 예를 들어, 리모컨으로도 작동합니다 (추가 조언 : 항상 선호하는 git push --force-with-lease더 나은 실수를 방지하고 더 복구 할 것을 대신).


커밋이 reflog에없는 경우 (아마도 reflog 에 쓰지 않는 타사 도구에 의해 삭제 되었기 때문에) 그런 명령을 사용하여 찾은 커밋의 sha로 분기를 재설정하여 분기를 성공적으로 복구했습니다. 모든 매달려있는 커밋으로 파일을 만듭니다) :

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

두 번 이상 사용해야하거나 어딘가에 저장하려면 해당 명령으로 별칭을 만들 수도 있습니다 …

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

와 함께 사용 git rescue

찾은 커밋을 조사하기 위해 일부 명령을 사용하여 커밋을 표시 할 수 있습니다.

커밋 메타 데이터 (작성자, 작성 날짜 및 커밋 메시지)를 표시하려면

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

diff도 보려면 :

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

커밋을 찾았 으면 다음과 같이 커밋에 대한 분기를 만듭니다.

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560

Windows 하에서 GUI를 좋아 하는 사용자의 경우 => => 기능을 사용하여 GitExtensions 를 사용하여 커밋 (및 커밋되지 않은 스테이징 파일)을 쉽게 복구 할 수 있습니다RepositoryGit maintenanceRecover lost objects...


삭제 된 준비된 파일을 쉽게 복구하는 비슷한 명령 : https://stackoverflow.com/a/58853981/717372


답변

GUI를 사용하려면 gitk를 사용하여 전체 작업을 수행 할 수 있습니다.

gitk --reflog

이렇게하면 분기가 삭제되지 않은 것처럼 분기의 커밋 기록을 볼 수 있습니다. 이제 가장 최근 지점에 대한 커밋을 마우스 오른쪽 버튼으로 클릭하고 메뉴 옵션을 선택하십시오 Create new branch.


답변

가장 많이 투표 된 솔루션은 실제로 요청 된 것보다 많은 기능을 수행합니다.

git checkout <sha>
git checkout -b <branch>

또는

git checkout -b <branch> <sha>

커밋을 잊어 버린 모든 최근 변경 사항과 함께 새 지점으로 이동하십시오. 특히 브랜치를 잃은 후 “패닉 모드”에있을 때는 의도하지 않을 수 있습니다.

깨끗하고 간단한 솔루션 은 one-liner 인 것처럼 보입니다 ( <sha>with 를 찾은 후 git reflog).

git branch <branch> <sha>

현재 지점이나 커밋되지 않은 변경 사항은 영향을받지 않습니다. 대신에 새 분기 만 생성됩니다 <sha>.

팁이 아닌 경우에도 여전히 작동하며 더 짧은 지점을 얻게 <sha>되며 새 지점 이름으로 다시 시도 할 수 있습니다 .

마지막으로 성공적으로 복원 된 분기의 이름을 다른 이름으로 바꿀 수 있습니다.

git branch -m <restored branch> <final branch>

말할 것도없이, 성공의 열쇠는 올바른 커밋을 찾는 것이 었 <sha>으므로 커밋의 이름을 현명하게 지정하십시오. 🙂


답변

tfe answer 추가 : git-resurrect.sh 스크립트 contrib/는 Git 소스 영역 (git.git 리포지토리에 있음)에 도움이 될 수 있습니다.

git-resurrect <name>이라는 분기 팁의 흔적을 찾으려고 <name>시도하여 부활 시키려고합니다. 현재 reflog에서 체크 아웃 메시지와 -r병합 메시지를 검색 합니다. -m및을 사용하면
-t모든 심판의 기록이 Merge <name> into
other
/ Merge <other> into <name>(각각) 커밋 주제를 스캔하여 다소 느리지 만 다른 사람들의 주제 분기를 부활시킬 수 있습니다.


답변

다음 명령을 사용하여 삭제 된 분기를 찾아서 검색했습니다. 첫 번째 단계는 gcb의 설명입니다.

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

이제 커밋 주석을 기반으로 git commit id (GIT-SHA)를 찾아서 아래 명령에서 사용하십시오. 이전에 찾은 GIT-SHA로 NEW-BRANCH라는 새 지점을 체크 아웃하십시오.

$ git checkout -b NEW-BRANCH GIT-SHA


답변

리플 로그가없는 경우 (예 : reflog를 사용하지 않는 Bare Repository에서 작업 중이고 복구하려는 커밋이 최근에 생성 되었기 때문에 다른 옵션은 최근에 생성 된 커밋 객체를 찾아서 살펴 보는 것입니다.

.git/objects디렉토리 내부에서 다음을 실행하십시오.

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

지난 12 시간 동안 생성 된 모든 객체 (커밋, 파일, 태그 등)를 찾아 커밋 만 표시하도록 필터링합니다. 이를 확인하는 것은 빠른 과정입니다.

Jakub의 답변에 언급 된 git-ressurect.sh 스크립트를 먼저 시도해보십시오 .