etc./StackOverFlow

Git에서 삭제한 브랜치를 복구할 수 있습니까?

청렴결백한 만능 재주꾼 2023. 4. 28. 04:05
반응형

질문자 :prosseek


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



git reflog --no-abbrev 하고 삭제된 분기의 끝에서 커밋에 대한 SHA1을 찾은 다음 git checkout [sha] 할 수 있어야 합니다. 그리고 해당 커밋에 도달하면 git checkout -b [branchname] 을 사용하여 거기에서 분기를 다시 만들 수 있습니다.


이 축약형/한 줄짜리 버전에 대해서는 @Cascabel에게, 샤를 얻는 방법에 대해서는 @Snowcrash에게 감사드립니다.

분기를 방금 삭제했다면 터미널에 Deleted branch <your-branch> (was <sha>) 와 같은 내용이 표시됩니다. 그런 다음 이 한 줄짜리에서 <sha>

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

tfe

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

커밋이 아직 존재하는 특정 분기의 일부인 경우 더 쉬운 방법은 git reflog name-of-my-branch 명령을 사용하는 것입니다. 예를 들어 강제로 푸시한 경우 원격에서도 작동합니다(추가 조언: 실수를 더 잘 방지하고 복구할 수 있는 git push --force-with-lease 대신 항상 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

GUI를 Windows에서하고 좋아하는 사람들을 위해, 당신은 쉽게와 커밋 (도 미트되지 않은 파일을 상연)를 복구 할 수 GitExtensions을 기능을 사용하여 Repository => Git maintenance => Recover lost objects...


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


Philippe

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

 gitk --reflog

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


Brent Bradburn

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

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

또는

 git checkout -b <branch> <sha>

커밋하는 것을 잊었을 수 있는 모든 최근 변경 사항과 함께 새 분기로 이동합니다. 이것은 특히 분기를 잃은 후 "패닉 모드"에 있을 때 의도하지 않을 수 있습니다.

깨끗한 (그리고 더 간단한) 솔루션 은 한 줄로 보입니다 ( git reflog <sha> 를 찾은 후):

 git branch <branch> <sha>

이제 현재 브랜치나 커밋되지 않은 변경 사항이 영향을 받지 않습니다. <sha> 까지 새 분기만 생성됩니다.

팁이 아닌 경우 여전히 작동하고 더 짧은 분기를 얻은 다음 올바르게 얻을 때까지 <sha>

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

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

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


Dmitri Zaitsev

tfe 답변에 추가: contrib/ 영역(git.git 저장소에 있음) 에도 git-resurrect.sh 스크립트가 있어 도움이 될 수 있습니다.

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


Jakub Narębski

다음 명령을 사용하여 삭제된 분기를 찾고 검색했습니다. 첫 번째 단계는 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

Patrick Koorevaar

예를 들어 reflog가 없는 경우. reflog가 활성화되지 않은 베어 리포지토리에서 작업 중이고 복구하려는 커밋이 최근에 생성되었기 때문에 또 다른 옵션은 최근에 생성된 커밋 객체를 찾아 살펴보는 것입니다.

.git/objects 디렉토리 내부에서 다음을 실행합니다.

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

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

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


Robert Knight

Git이 설치되지 않은 GitHub 사용자의 경우:

GitHub 웹 사이트에서 복원 하려면 해당 API 를 사용하여 repo 관련 이벤트 목록을 가져올 수 있습니다.

첫 번째

  • 해당 SHA(커밋 해시)를 찾습니다.

    curl -i https://api.github.com/repos/PublicUser/PublicRepo/events

    ... 또는 개인 저장소의 경우:

    curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events

    (GitHub 암호를 묻는 메시지가 표시됩니다)

    • (리포지토리에 2단계 인증이 필요한 경우 아래 이 답변에 대한 설명을 참조하세요.)

다음

  • GitHub 로 이동하여 영구적으로 삭제될 새 임시 분기를 만듭니다( Chrome 이 선호됨).

• 지점으로 이동하여 해당 지점을 삭제합니다.

같은 페이지에서 다시 로드하지 않고 DevTools, Network 패널을 엽니다. 이제 준비...

• 복원을 클릭합니다. 새로운 "라인"이 보일 것입니다. 그것을 마우스 오른쪽 버튼으로 클릭하고 "cURL로 복사"를 선택하고 이 텍스트를 일부 편집기에 저장하십시오.

• 복사한 코드 줄 끝에 -H "Cookie=" 합니다.

이제 다음과 같이 표시됩니다.

 curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed

마지막 단계

  • "BranchSHA"를 SHA 해시로 바꾸고 BranchName을 원하는 이름으로 바꿉니다(BTW, 웹에서 브랜치의 이름을 바꾸는 것은 좋은 방법입니다). 너무 느리지 않다면 어쨌든 이 요청을 해야 합니다. 예를 들어 터미널에 복사하여 붙여넣기만 하면 됩니다.

추신

나는 이것이 "가장 간단한 솔루션" 또는 "올바른" 솔루션이 아닐 수도 있다는 것을 알고 있지만 누군가가 유용하다고 생각하는 경우를 위해 제공됩니다.


Maxim Mazurok

삭제하려는 분기가 다른 분기에 도달할 수 있는 경우 다음을 사용하여 안전하게 삭제할 수 있습니다.

 git branch -d [branch]

작업은 손실되지 않습니다. 분기는 스냅샷이 아니라 스냅샷에 대한 포인터임을 기억하십시오. 따라서 분기를 삭제하면 포인터가 삭제됩니다.

다른 분기가 도달할 수 없는 분기를 삭제해도 작업을 잃지 않습니다. 물론 커밋 해시를 확인하는 것만큼 쉽지는 않겠지만 여전히 할 수 있습니다. -d 를 사용하여 도달할 수 없는 분기를 삭제할 수 없는 이유입니다. 대신 사용해야합니다

 git branch -D [branch]

이것은 Git에 대한 Scott Chacon의 반드시 봐야 할 비디오의 일부입니다. 58:00 분에 그가 분기에 대해 이야기하고 어떻게 삭제하는지 확인하십시오.

GitHub의 Scott Chacon과 함께하는 Git 소개


fabiopagoti

삭제된 브랜치를 복구하려면 먼저 reflog 기록을 살펴보고,

 git reflog -n 60

여기서 n은 마지막 n개의 커밋을 나타냅니다. 그런 다음 적절한 머리를 찾고 해당 머리로 분기를 만듭니다.

 git branch testbranch HEAD@{30}

sajin tm

이 모든 작업을 로컬에서 수행하고 Bitbucket Cloud로 푸시하기 전에 저장소가 원하는 상태인지 확인하십시오. 현재 저장소를 복제하고 이러한 솔루션을 먼저 테스트하는 것도 좋은 생각일 수 있습니다.

  1. 방금 분기를 삭제한 경우 터미널에 다음과 같은 내용이 표시됩니다.
 Deleted branch <your-branch> (was <sha>)

2. 분기를 복원하려면 다음을 사용하십시오.

 git checkout -b <branch> <sha>

머리 꼭대기에서 '샤'를 모르는 경우 다음을 수행할 수 있습니다.

  1. 다음을 사용하여 삭제된 분기의 끝에서 커밋에 대한 'sha'를 찾습니다.
 git reflog
  1. 분기를 복원하려면 다음을 사용하십시오.
 git checkout -b <branch> <sha>

커밋이 reflog에 없는 경우:

  1. 다음과 같은 명령을 사용하여 찾은 커밋의 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

2. 그런 다음 다음 중 하나를 사용하여 각 커밋을 표시할 수 있습니다.

 git log -p <commit> git cat-file -p <commit>

uyghurbeg

브랜치를 제거하고 커밋 ID를 잊어버린 경우 다음 명령을 수행할 수 있습니다.

 git log --graph --decorate $(git rev-list -g --all)

이 후에 모든 커밋을 볼 수 있습니다. 그런 다음 git checkout 을 수행하고 이 커밋 아래에 새 분기를 만들 수 있습니다.


borkafight

나는 원하지 않는 커밋 몇 개를 지우기 위해 원격에서 분기를 다시 기반으로 했으며 내가 원하는 올바른 커밋을 선택하려고 했습니다. 물론 제가 SHA를 잘못 썼습니다...

다음은 내가 찾은 방법입니다(여기에 있는 답변에서 주로 더 쉬운 인터페이스/상호작용).

먼저 로그에 느슨한 커밋 목록을 생성합니다. 가비지 수집기에 의해 덤프될 수 있으므로 가능한 한 빨리 이 작업을 수행하고 작업을 중지합니다.

 git fsck --full --no-reflogs --unreachable --lost-found > lost

이것은 당신이 봐야 할 모든 커밋과 함께 lost 파일을 생성합니다. 우리의 삶을 단순화하기 위해 SHA만 잘라 봅시다.

 cat lost | cut -d\ -f3 > commits

이제 확인해야 하는 commits 이 포함된 커밋 파일이 있습니다.

Bash를 사용한다고 가정하면 마지막 단계는 다음과 같습니다.

 for c in `cat commits`; do git show $c; read; done

이렇게 하면 각각에 대한 diff 및 커밋 정보가 표시됩니다. Enter 키 를 누를 때까지 기다립니다. 이제 원하는 것을 모두 적어두고 체리를 선택하십시오. 완료되면 Ctrl-C를 누르십시오.


gcb

큰 예

GIT를 사용하는 경우 다음 간단한 단계를 따르십시오. https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

smartgit을 사용 중이고 이미 해당 분기 를 원점으로 푸시하는 경우 해당 분기를 찾아 마우스 오른쪽 버튼으로 클릭한 다음 체크아웃하십시오.


Aljohn Yamaro

분기를 삭제하는 컴퓨터에서 이 작업을 수행했습니다.

git reflog

응답:

 74b2383 (develope) HEAD@{1}: checkout: moving from master to develope 40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master 74b2383 (develope) HEAD@{3}: checkout: moving from master to develope 40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD 40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git

이 명령으로 분기를 검색합니다.

git checkout -b newBranchName 74b2383


Ammar Bozorgvar

먼저 git batch로 이동하여 다음과 같이 프로젝트로 이동합니다.

 cd android studio project cd Myproject then type : git reflog

당신은 모두 변경 사항 목록을 가지고 있으며 참조 번호는 참조 번호를 가지고 체크 아웃합니다.
Android 스튜디오 또는 git betcha에서. 다른 솔루션은 참조 번호를 가져 와서 Android 스튜디오로 이동하여 git 분기를 클릭 한 다음 참조 번호를 지나서 체크 아웃 태그 또는 개정을 클릭 한 다음 분기가 있습니다.


FAHAD HAMMAD ALOTAIBI

tfe의 답변에 추가하여 커밋이 가비지 수집되지 않는 한 언급된 이 프로세스로 복구할 수 있습니다. Git 브랜치는 단순히 커밋 트리의 특정 커밋에 대한 포인터입니다. 그러나 포인터를 삭제하고 해당 분기의 커밋이 다른 기존 분기에 병합되지 않으면 git은 이를 매달린 커밋으로 처리하고 주기적으로 자동으로 실행될 수 있는 가비지 수집 중에 제거합니다.

분기가 기존 분기에 병합되지 않고 가비지 수집된 경우 분기가 기존 분기에서 분기된 지점까지 모든 커밋을 잃게 됩니다.


Rajeshwar Agrawal

관련 문제: "삭제된 분기를 아는 방법"을 검색한 후 이 페이지에 왔습니다.

많은 오래된 브랜치를 삭제하는 동안 새로운 브랜치 중 하나를 실수로 삭제했다고 느꼈지만 복구할 이름을 모릅니다.

최근에 삭제된 분기를 확인하려면 다음을 수행하십시오.

Git URL로 이동하면 다음과 같이 표시됩니다.

 https://your-website-name/orgs/your-org-name/dashboard

그런 다음 최근에 삭제된 내용, 삭제된 사람의 피드를 볼 수 있습니다.


Manohar Reddy Poreddy

git reflog 사용하는 것만으로 sha 가 반환되지 않았습니다. commit id 만(길이는 8자이고 샤는 훨씬 더 깁니다)

그래서 git reflog --no-abbrev

그런 다음 위에서 언급한 것과 동일하게 수행합니다. git checkout -b <branch> <sha>


MarvinVK

당신이 VSCode를 사용하여 ... 그리고 경우에 당신은 그것을 삭제하기 전에 어떤 점에서 서버와 지사를 동기화 ...

git branch delete는 서버의 복사본이 아닌 로컬 복사본만 삭제합니다. 먼저 Git 패널(왼쪽 도구 모음의 git 아이콘)에서 분기를 살펴보고 "origin/your_branch_name" 아래에 여전히 분기가 있는지 확인합니다. 그렇다면 그것을 선택하기만 하면 코드를 다시 받아야 합니다(즉시 복사/붙여넣기/다른 곳에 로컬로 저장하는 것이 좋습니다).

"origin/your_branch_name"이 표시되지 않으면 GitLens 확장을 설치합니다. 이를 통해 서버 리포지토리를 시각적으로 둘러보고 서버에 동기화한 복사본을 찾을 수 있습니다. 여러 리포지토리가 있는 경우 GitLens에 리포지토리를 표시하려면 원하는 리포지토리에서 하나 이상의 파일을 열어야 할 수 있습니다. 그 다음에:

  1. GitLens 패널 열기

  2. 저장소 확장

  3. Branches / Contributors / Remotes / Stashes 등의 카테고리 목록이 표시되어야 합니다.

"Branches" 또는 "Remotes -> Origins"에서 YourLostTreasure를 찾아야 합니다. 바라건대 원하는 이름의 분기가 표시되기를 바랍니다. 확장하면 해당 분기에서 변경한 파일이 표시되어야 합니다. 파일 이름을 두 번 클릭하여 열고 즉시 해당 코드를 백업하십시오.

잃어버린 브랜치가 즉시 보이지 않으면 주변을 둘러보고 유망한 것을 찾으면 즉시 열고 코드를 잡으십시오. TheGoldenBranch를 찾을 때까지 꽤 주위를 찔러야 했습니다. 그리고 나서도 코드에 마지막 하나 또는 두 개의 저장이 누락되었습니다(아마도 내가 브랜치 병합을 시도하기 전에 서버에 동기화하지 못했지만 실수로 클릭했기 때문일 수 있습니다). 분기 삭제). 처음 지점을 찾았을 때 이름이 정확하지 않아 계속 찾고 있었고 첫 번째 지점을 다시 찾는 데 시간이 걸렸기 때문에 검색이 불필요하게 길어졌습니다. (따라서, 카르페 Carpum 다음 찾고 계속.)


cssyphus

Git 확장을 사용하는 경우

오래되었지만 이 스레드는 Google에서 삭제된 분기를 복구할 때 목록의 맨 위에 있습니다. 나는 명령줄보다 git 확장을 사용하므로 명령에 익숙하지 않지만 reflog 명령이 단서를 제공하므로 이 글을 읽을 수 있는 git 확장을 사용하는 다른 사람들을 위해 내 git 확장 솔루션을 여기에 게시합니다.

  1. 도구 모음에서 보기 드롭다운으로 이동
  2. reflog 참조 표시를 선택하십시오.

이제 삭제된 분기를 보고 선택할 수 있습니다. 클릭하고 확인하기만 하면 됩니다.


Dax

출처 : http:www.stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git

반응형