GIT 복원 마지막 분리 HEAD
제 프로젝트에 큰 문제가 있습니다. 이것이 시나리오입니다. GIT에 xcode 프로젝트가 있습니다. 오늘 나는 마지막 커밋이 일부 테스트를 위반했음을 깨달았으므로 이전 커밋을 확인했습니다. 나는 SourceTree를 사용했고 이것은 경고입니다.
이렇게하면 작업 복사본이 '분리 된 HEAD'가되므로 더 이상 브랜치에 있지 않을 것입니다. 이 후에 커밋하려면 브랜치를 다시 체크 아웃하거나 새 브랜치를 만들 수 있습니다. 이거 괜찮아?
나는 하루 종일 일했고 결국 모든 것을 다했습니다. 그래서 개발 브랜치에 대한 내 작업을 병합해야했기 때문에 개발 브랜치를 체크 아웃했는데 내 작업이 즉시 사라졌습니다.
HEAD를 분리하는 것이 잘못되었다는 것을 알고 Sourcetree가 경고했습니다.하지만 내 작업을 복원 할 방법이 있습니까?
감사합니다.
을 입력 git reflog
하면 어떤 수정이 HEAD
가리키는 지 기록이 표시 됩니다. 분리 된 머리가 거기에 있어야합니다. 그것을 찾으면 git checkout -b my-new-branch abc123
또는 git branch my-new-branch abc123
( abc123
분리 된 HEAD의 SHA-1은 어디에 있음 ) 분리 된 헤드를 가리키는 새 분기를 만듭니다. 이제 여유 시간에 해당 분기를 병합 할 수 있습니다.
일반적으로 분리 된 헤드에서 작업 한 후 브랜치를 체크 아웃하면 Git은 분리 된 헤드에서 커밋을 알려 주므로 필요에 따라 복구 할 수 있습니다. 저는 SourceTree를 사용한 적이 없으므로 해당 메시지를 전달하는지 모르겠습니다. 그러나 해당 메시지가 표시되면이를 사용하여 커밋을 찾은 다음 다시 사용 git checkout -b
하거나 git branch
해당 커밋에서 분기를 만들 수 있습니다.
Sourcetree에서는 GUI를 사용하여이를 수행 할 수 있습니다.
먼저 Command History (view : Show Command Output)에서 메시지를 찾아 "잃어버린"커밋을 찾습니다. 잃어버린 커밋 후 "Switching Branch"명령에있을 것입니다. 이 메시지에 1234567 커밋 ID가있는 커밋 주석이 표시되기를 바랍니다.
커밋 ID를 다음 단계로 이동합니다.
상단 툴바에서 "Branch"버튼을 누르면 특정 커밋을 지정할 수있는 "New Branch"대화 상자가 나타납니다. 그 커밋 ID를 거기에 넣고 새 브랜치 이름을 지정하고 브랜치 생성을 누르면 잃어버린 커밋이있는 새 브랜치를 얻을 수 있습니다!
분리 된 HEAD의 변경 사항을 유지하고 싶지 않고 최신 브랜치 커밋으로 이동하려면 아래 명령을 직접 사용하십시오.
git checkout -
참고 : 분리 된 HEAD의 모든 변경 사항을 삭제하겠습니다.
제 동료가 방금 이런 상황을 겪었습니다. 그의 경우에는 분리 된 헤드 (R-Studio에서 작동)에 커밋이 있었고이 도구는이 및 해당 SHA 참조를 사용하여 분기를 만들 수 있다고 경고했지만 유일한 옵션은 "닫기"였기 때문입니다. -으! 정보 상자였습니다. 그들은 대화를 닫고 정보를 영원히 잃었습니다 ...
reflog
명령 덕분에 변경 사항이 손실되지 않았 음을 알 수있었습니다. 그러나 우리의 경우 git branch
예상대로 작동하지 않았거나 들어오는 git pull
것이 어떻게 든 엉망으로 만들었습니다. 리플 로그에서 새로 생성 된 브랜치로의 변경 사항을 확인해야했습니다.
git cherry-pick 0b823d42..3cce27fc
우리가 원하는 모든 커밋을 브랜치에 배치했습니다. 그런 다음 develop
문제없이 분기를 병합 할 수 있습니다.
이런 경우이 사람에 대한 정보, 우리가에 커밋을 식별 않았다 분리 된 머리 에 reflog
은 "체크 아웃"표시 사이에 사람들을보고 (이 지점 이동을 식별) :
e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward
우리가 원하는 사람들이었다 HEAD@{8}
에 HEAD@{6}
(모두 포함). 그래서 우리는 다음과 같이 그들을 얻었습니다.
git cherry-pick 0b823d42..3cce27fc
그런 다음 일반적인 병합 해결 및 최종 커밋으로 인해 손실되었다고 생각하는 분리 된 헤드 작업을 호스팅하는 lost_changes 분기가 남았습니다. 이번에는 그것을 개발로 병합하는 것이 빨라졌습니다.
이 시나리오를 시도한 결과 git이 마지막 커밋의 SHA-1을 알려줍니다.
vors@localhost:~/git-test$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
ec600e6 333
If you want to keep them by creating a new branch, this may be a good time
to do so with:
git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7
Switched to branch 'master'
이 메시지를 보았습니까?
분리 된 머리는 변경하지 않고 원하는 한 괜찮습니다.
커밋을 되돌리려면 특정 분기에서 git revert를 사용할 수 있습니다.
분리 된 머리에서 일하고 커밋을하고 싶다면; 새 분기를 만들고 나중에 병합합니다.
참고 URL : https://stackoverflow.com/questions/14757437/git-restore-last-detached-head
'Development Tip' 카테고리의 다른 글
Linux 바이너리 설치 프로그램 (.bin, .sh)은 어떻게 작동합니까? (0) | 2020.11.26 |
---|---|
NSURLConnection 시간 초과? (0) | 2020.11.26 |
ActionBar의 오버플로 메뉴에 아이콘을 표시하는 방법 (0) | 2020.11.25 |
암호 강도 측정기 (0) | 2020.11.25 |
JDBC batch insert performance (0) | 2020.11.25 |