sourcetip

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

fileupload 2023. 4. 23. 11:03
반응형

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

★★★★★★★를 실행했을 경우git branch -d XYZ런치 회회 ?? 법? ?? ???명령어 branch를 하지 않은 수 있는 방법이 있습니까?

ㅇㅇㅇ, ㅇㅇㄹ 수 예요.git reflog --no-abbrev브랜치 SHA1만 찾습니다.git checkout [sha]커밋이 '그냥' 돼요git checkout -b [branchname]이치노


@Cascabel은 이 요약/원라이너 버전을, @Snowcrash는 sha를 얻는 방법을 인정합니다.

지 얼마 안 돼서 게 Deleted branch <your-branch> (was <sha>) 그냥 <sha>에서는 : in in in in in in in 。

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

(재) 커밋 해시를 얻은 후 브랜치 생성

다음은 새 분기를 만드는 명령어입니다.

git branch <my-new-branch-name> <commit-hash>

따라서 커밋 해시를 찾아야 합니다.다음 2가지 옵션이 있습니다.


명령줄에서 커밋 해시를 찾는 중

이 「」에 .reflog

대부분의 경우 도달 불가능한 커밋은 reflog에 있습니다.따라서 먼저 다음 명령어를 사용하여 reflog를 확인합니다.git reflog됩니다).HEAD를 참조해 주세요.

더 쉬운 도 모릅니다.git reflog name-of-my-branch커밋이 아직 존재하는 특정 브랜치의 일부인 경우.또, 리모트에서도 동작합니다.예를들 、 제단단단단단 ( )git push --force-with-lease실수를 방지하고 복구가 용이합니다.)


reflog

커밋이 reflog에 없는 경우(아마도 reflog에 쓰지 않는 서드파티 툴에 의해 삭제되었을 수 있습니다), 이 명령어를 사용하여 모든 커밋이 있는 파일을 작성할 수 있습니다.

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

다음으로 누락된 커밋의 SHA를 읽고 브런치를 리셋합니다.

사용하는 는 에일리어스를 수 .git rescue.

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 cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

「다이프」도 참조해 주세요.

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

발견된 커밋에 브랜치를 만듭니다.

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560

Windows에서 GitExtensions GUI 사용

명령줄에서 수행할 수 있는 것과 마찬가지로 reflog 또는 dangling 커밋에서 커밋해시를 가져올 수 있습니다.

리플로그부터

넌 두가지 옵션이 있다 :

  • 리비전 그리드에 매달리는 커밋을 표시합니다(가장 쉬운 경우도 있습니다).[ ] View> =>Show reflog references리플로그에 존재하는 달랑거리는 커밋을 확인할 수 있습니다.
  • : HEAD의 리프로그 콘텐츠:Commands> =>Show reflogs... 재로그

재로그에 없는 커밋 찾기

커밋 않은 파일은 메뉴에서 할 수 .Repository> =>Git maintenance> =>Recover lost objects.... 날짜별로 정렬된 각 커밋에 대해 해시, 커밋 메시지가 있으며 커밋 차이를 쉽게 표시할 수 있습니다.잃어버린 커밋의 회복

관련:이전에 스테이징된 삭제된 파일을 쉽게 복구

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

gitk --reflog

브랜치가 삭제되지 않은 것처럼 브랜치의 커밋 이력을 표시할 수 있습니다.에 대한 옵션을 합니다.Create new branch.

투표율이 가장 높은 솔루션은 실제로 요구 이상의 성과를 내고 있습니다.

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

또는

git checkout -b <branch> <sha>

커밋하는 것을 잊어버렸을 가능성이 있는 최근의 모든 변경과 함께 새로운 브랜치로 이동합니다.이것은, 특히 브랜치를 상실한 후에 「패닉 모드」가 되어 있는 경우는, 의도하지 않는 경우가 있습니다.

보다 깔끔한(심플한) 솔루션은 (고객이 찾은 후) 하나의 라인인 것 같습니다.<sha>git reflog

git branch <branch> <sha>

현재 브랜치 또는 커밋되지 않은 변경은 영향을 받지 않습니다., 것입니다.<sha>.

더브런치를 브런치로 할 수 .<sha>새로운 지점명을 입력해 주세요.

마지막으로 정상적으로 복원된 브랜치의 이름을 이름이 지정된 브랜치 또는 다른 이름으로 변경할 수 있습니다.

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

필요도 의 열쇠는 올바른 을 찾는 이었습니다.<sha>을 현명하게 지정해 주세요 : ) ,그 , , , , , ,) : )

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

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

이 작업이 끝나면 모든 커밋을 볼 수 있습니다.이렇게 하면 요.git checkout이 ID와 이 커밋 아래에 새로운 브런치를 만듭니다.

tfe 답변에 추가: git-resurrect도 있습니다.sh 스크립트 in the sh scriptcontrib/Git.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

제1종

git reflog

터미널에 있습니다.

후, 그, 그, 그, 그, 그 ,HEAD@{**number**}HEAD@{12}를 참조해 주세요.

이제 다음을 입력합니다.

git checkout -b 'branch_name' 'HEAD@{22}'

삭제할 브런치에 다른 브런치가 도달할 수 있는 경우는, 다음의 방법으로 안전하게 삭제할 수 있는 것으로 알고 있습니다.

git branch -d [branch]

그리고 당신의 일은 손실되지 않습니다.브랜치는 스냅샷이 아니라 브랜치에 대한 포인터입니다.분기를 삭제할 때는 포인터를 삭제합니다.

다른 브랜치가 도달할 수 없는 브랜치를 삭제해도 작업이 손실되지 않습니다.물론 커밋 해시를 확인하는 것만큼 쉽지는 않지만 그래도 할 수 있습니다.에 Git은 Git를 사용하여 할 수 할 수 .-d . . . 、 용 、 용 、 용 、 。

git branch -D [branch]

이것은 Scott Chacon이 Git에 대해 꼭 봐야 하는 비디오의 일부입니다.58:00분에 지점과 지점 삭제 방법에 대해 얘기할 때 확인해봐

GitHub의 Scott Chacon과 Git 소개

reflog가 활성화되지 않은 빈 저장소에서 작업 중이고 복구하려는 커밋이 최근에 생성되었기 때문에 reflog가 없는 경우 다른 옵션은 최근에 생성된 커밋 개체를 찾아서 확인하는 것입니다.

★★★의 내부에서.git/objects다음 중 하나:

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

그러면 최근 12시간 동안 작성된 모든 개체(커밋, 파일, 태그 등)가 검색되고 커밋만 표시되도록 필터링됩니다.이 체크는 빠른 프로세스입니다.

제가 한번 해보겠습니다.먼저 Jakub의 답변에서 언급된 sh 스크립트입니다.

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, 네트워크 패널을 엽니다.이제 준비...

• restore를 클릭합니다.새로운 「행」이 표시됩니다.마우스 오른쪽 버튼을 클릭하여 "Copy as 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-hash로 대체하고 BranchName을 원하는 이름으로 바꿉니다(BTW, 웹에서 브랜치 이름을 변경하는 것은 훌륭한 해킹입니다).너무 느리지 않았다면 어쨌든 이 요청을 해야 합니다.예를 들어 단말기에 복사 붙여넣기만 하면 됩니다.

추신.

이것이 "가장 간단한 해결책"이나 "올바른" 해결책이 아닐 수도 있다는 것을 알지만, 누군가가 유용하다고 생각할 경우에 대비하여 제공되는 것입니다.

여러분 모두 감사합니다.

GitLab(리모트)과 GIT(로컬)에서 브랜치를 삭제한 것이 문제였습니다.

어찌된 일인지 난 내 약속을 돌려받았어

  1. 처음에 나는 마지막 커밋(SHA)을 받았다.
git log --graph --decorate $(git rev-list -g --all)

  1. 나는 지난 SHA를 간단하게 체크한다.
git checkout <SHA>
  1. 그런 다음 새로운 지점(원하는 대로 이름 지어짐)을 만들었습니다.
git switch -c <branch-name> 

그리고 나서 나는 내 약속을 되찾았다 나는 나뭇가지를 다시 밀었다.

하나님 감사 합니다.

ps: 어떻게든(SHA)는 커밋 코드입니다.

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>

삭제된 브런치를 회복하려면 먼저 reflog 이력을 확인합니다.

git reflog -n 60

여기서 n은 마지막 n개의 커밋을 나타냅니다.그런 다음 적절한 헤드를 찾아 해당 헤드로 브랜치를 만듭니다.

git branch testbranch HEAD@{30}

리모트로부터 브랜치를 리빌드 해, 필요 없는 커밋을 몇개 클리어 해, 마음에 드는 커밋을 체리픽 하려고 했습니다.물론 SHA를 잘못 썼지만...

그 결과(대부분의 경우, 여기서의 답변에 대해 보다 알기 쉬운 인터페이스/인터랙션을 얻을 수 있었습니다)는 다음과 같습니다.

먼저 로그에 loose commit 목록을 생성합니다.가능한 한 빨리 작업을 중지하십시오. 쓰레기 수집기에 의해 폐기될 수 있습니다.

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 및 commit 정보가 표시됩니다.그리고 를 누르기를 기다립니다.이제 네가 원하는 걸 다 적어놓고, 그것들을 집어 넣어라.완료되면 Ctrl+C 키를 누르기만 하면 됩니다.

삭제된 브런치를 회복하는 일반적인 문제의 가장 일반적인 서브 문제는 기능 브런치를 Marge 후 회복한 후 삭제하는 것입니다(일반적인 관행과 같습니다).

SO 게시물에서는 성공적으로 병합된 경우 삭제된 분기를 언제든지 복구할 수 있습니다.브랜치는 커밋에 대한 화려한 포인터일 뿐이며, 머지했기 때문에 커밋은 아직 존재하기 때문입니다.병합 커밋은 병합된 두 개 이상의 분기의 헤드 커밋 해시를 나열합니다.예를 들어 다음과 같습니다.

        git show master
        commit 849675951d41497e7b07d34096ebf36dc713221 (HEAD -> master)
        Merge: fc1c9ce 97f8a60
        Author: Me
        Date:   Sun Jan 9 16:14:24 2022 +0100

            Merge branch 'feature'

는 '기능'을 때 ''기능'을 회복하려면 '기능'을 사용하세요.git checkout -b feature 97f8a60 - 다시 기록할 필요가 없습니다. - 다시 기록할 필요가 없습니다.

큰폭으로

GIT사용하고 있는 경우는, 다음의 간단한 순서에 따릅니다.https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

smartgit을 사용하고 있고 이미 그 브랜치를 푸시하고 있는 경우 오리진으로 이동하여 해당 지점을 찾은 후 마우스 오른쪽 버튼을 클릭한 후 체크아웃합니다.

브랜치를 삭제한 컴퓨터에서 이 작업을 수행했습니다.

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

Git Extensions를 사용하는 경우

오래된 스레드이지만 삭제된 분기를 구글로 복구할 때 이 스레드가 목록의 맨 위에 있습니다.저는 명령줄보다 git 확장자를 사용하고 있기 때문에 명령어에 익숙하지 않습니다만, reflog 명령어는 힌트를 주었습니다.그래서 git 확장자를 사용하는 다른 사용자를 위해 여기에 git 확장자 솔루션을 올립니다.

  1. 도구 모음의 보기 드롭다운으로 이동합니다.
  2. Reflog 참조 표시를 선택합니다.

삭제된 브랜치를 표시 및 선택할 수 있습니다.클릭 후 체크하기만 하면 됩니다.

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

cd android studio project
cd Myproject
then type :
git reflog

참조 한 후 아웃합니다.
Android studio 또cha chacha chacha 。 다른 솔루션은 참조 번호를 가지고 Android studio로 가서 아래 git branches를 클릭한 다음 체크 아웃 태그 또는 참조 번호를 통과한 revision을 클릭하면 branches를 얻을 수 있습니다.

tfe의 응답에 커밋이 가비지 수집되지 않는 한 언급된 프로세스를 사용하여 복구할 수 있습니다.Git 브랜치는 단순히 커밋 트리의 특정 커밋에 대한 포인터입니다.단, 포인터를 삭제하고 해당 브랜치의 커밋이 다른 기존 브랜치에 병합되지 않으면 git은 이를 당글링 커밋으로 처리하여 가비지 컬렉션 중에 그것들을 삭제합니다.이 경우 포인터는 자동으로 정기적으로 실행됩니다.

브런치가 기존 브런치에 Marge되지 않고 가비지가 수집된 경우 브런치가 기존 브런치에서 분기된 지점까지 모든 커밋을 해제합니다.

사용법git reflog하지 않다sha★★★★★★★★★commit id (팔자 길이 8자)

저는 ★★★★★★★★★★★★★★★★★★★★★.git reflog --no-abbrev

처럼 똑같이 .git checkout -b <branch> <sha>

VSCode를 사용하는 경우...브랜치를 삭제하기 전에 서버와의 동기화를 실시했습니다.

git branch delete는 서버상의 복사본이 아닌 로컬 복사본만 삭제합니다.먼저 Git 패널(왼쪽 툴바의 git 아이콘)에서 브랜치를 살펴보고 브랜치가 "origin/your_branch_name" 아래에 있는지 확인합니다.이 경우 코드를 선택하면 코드를 다시 얻을 수 있습니다(즉시 복사/붙여넣기/저장할 것을 권장합니다).

"origin/your_branch_name"이 표시되지 않으면 GitLens 확장을 설치합니다.이를 통해 서버 저장소를 시각적으로 탐색하고 서버에 동기화된 복사본을 찾을 수 있습니다.여러 저장소가 있는 경우 저장소가 GitLens에 표시되도록 하려면 원하는 저장소에서 파일을 하나 이상 열어야 할 수 있습니다.그 후, 다음과 같이 입력합니다.

  1. GitLens 패널을 엽니다.

  2. 저장소를 확장합니다.

  3. 카테고리 리스트가 표시됩니다.브런치 / 컨트리뷰터 / 리모트 / 스태시 등

"Branches" 또는 "Remotes -> Origins" 아래에 Your Lost Treasure를 찾을 수 있습니다.원하는 이름의 브런치가 표시되기를 바랍니다.브런치를 펼치면 그 브런치에서 변경한 파일이 표시됩니다.파일 이름을 두 번 클릭하여 열고 해당 코드를 즉시 백업합니다.

잃어버린 나뭇가지를 바로 볼 수 없다면, 주위를 둘러보고, 뭔가 유망한 것을 발견하면 즉시 그것을 열고 코드를 잡으세요.The Golden Branch를 찾을 때까지 꽤 많은 시간을 조사해야 했고, 그 후에도 코드는 마지막 한두 개의 저장을 놓치고 있었습니다(아마도 Branch-Merge-but-A-Branch-Delete를 클릭하기 전에 서버와의 동기화에 실패했기 때문일 것입니다).처음 그 지점을 발견했을 때 이름이 완전히 맞는지 확신이 서지 않아 계속 찾고 있었고, 첫 번째 지점을 다시 찾는 데 시간이 좀 걸렸습니다(따라서 Carpe Carpum, 그리고 계속 찾아봅니다).

하고 있는 는, 「」를 .git checkout <branch>합니다.

언급URL : https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git

반응형