GIT 복원 마지막 분리 HEAD


85

제 프로젝트에 큰 문제가 있습니다. 이것이 시나리오입니다. GIT에 xcode 프로젝트가 있습니다. 오늘 나는 마지막 커밋이 일부 테스트를 위반했음을 깨달았으므로 이전 커밋을 확인했습니다. 나는 SourceTree를 사용했고 이것은 경고입니다.

이렇게하면 작업 복사본이 '분리 된 HEAD'가되므로 더 이상 브랜치에 있지 않을 것입니다. 이 이후에 커밋하려면 브랜치를 다시 체크 아웃하거나 새 브랜치를 생성 할 수 있습니다. 이거 괜찮아?

나는 하루 종일 일했고 결국 모든 것을 다했습니다. 그래서 개발 브랜치에 대한 내 작업을 병합해야했기 때문에 개발 브랜치를 체크 아웃했는데 내 작업이 즉시 사라졌습니다.

HEAD를 분리하는 것이 잘못되었다는 것을 알고 Sourcetree가 경고했습니다.하지만 내 작업을 복원 할 방법이 있습니까?


여기 에 매우 동일한 문제에 대한 관련 스레드와 여기서 발생하는 방법에 대한 기술이 있습니다 .
RBT

답변:


254

를 입력 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해당 커밋에서 분기를 만들 수 있습니다.


4
브라이언 감사합니다. 당신은 내 하루를 구했습니다.
Muzammil

브라이언, 당신이 내 생명을 구했습니다! 감사!!
cldrr

나는 git를 처음 사용하고 fatal: A branch named 'mybranch' already exists.있습니다. 기존 브랜치에 추가하는 방법을 얻고 있습니까?
Ramesh Murugesan 2015 년

1
Brian에게 감사를 표하는 모든 사람들을위한 PSA : 잃고 싶지 않은 일을하고 있다면 몇 시간마다 원격 (예 : github)으로 푸시하십시오. 유성이 컴퓨터에 떨어지면 기뻐할 것입니다. 아직 공동 작업자와 공유 할 준비가되지 않은 경우 지금은 아무도 모르는 브랜치에 저장 한 다음 나중에 마스터로 리베이스하십시오.
MatrixManAtYrService

1
당신이 가진 그 다시 가져올 수있는, 그것의 경우에도 하나의 손실은 다만 사라 커밋 당신이 그것을 발견 git cherry-pick e5b2f7b, e5b2f7b커밋 SHA-1의 인가.
Aidin

10

Sourcetree에서는 GUI를 사용하여이를 수행 할 수 있습니다.

먼저 Command History (view : Show Command Output)에서 메시지를 찾아 "잃어버린"커밋을 찾습니다. 잃어버린 커밋 후 "Switching Branch"명령에있을 것입니다. 이 메시지에 1234567 커밋 ID가있는 커밋 주석이 표시되기를 바랍니다.

커밋 ID를 다음 단계로 이동합니다.

상단 툴바에서 "Branch"버튼을 누르면 특정 커밋을 지정할 수있는 "New Branch"대화 상자가 나타납니다. 거기에 커밋 ID를 넣고 새 브랜치 이름을 지정하고 브랜치 생성을 누르면 잃어버린 커밋으로 새 브랜치를 얻을 수 있습니다!

여기에 이미지 설명 입력


실제로 작동합니다. 커밋 ID와 함께 올바른 주석이 표시되는지 확인하십시오.
Hammad Khan

@blalond 안녕하세요, 귀하의 답변을 읽은 후 약간의 질문이 있습니다 .SourceTree에서 이전 커밋을 두 번 클릭하면 (확인하기 위해) 머리가 분리된다는 동일한 메시지가 표시되므로 궁금합니다. 사람들이 git을 사용하여 이전 개정판으로 간단히 롤백 할 수 있다고 말하는 것은 무엇을 의미합니까? 그러면 특정 커밋으로 어떻게 롤백합니까? 감사합니다

5

분리 된 HEAD의 변경 사항을 유지하고 싶지 않고 최신 브랜치 커밋으로 이동하려면 아래 명령을 직접 사용하십시오.

git checkout - 

참고 : 분리 된 HEAD의 모든 변경 사항을 삭제하겠습니다.


OP는 그들의 일을 유지하도록 요청했습니다. 이것은 원래 질문에 대한 답이 아닙니다. 분기에 유지하는 옵션을 추가하면이 답변이 유용합니다.
manuelvigarcia

1

제 동료가 방금 이런 상황을 겪었습니다. 그의 경우에는 분리 된 헤드 (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 분기가 남았습니다. 이번에는 그것을 개발로 병합하는 것이 빨라졌습니다.


0

이 시나리오를 시도한 결과 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'

이 메시지를 보았습니까?


아니. 아니면 내가주의를 기울이지 않을 수도 있습니다. 나는 timemachine에서 백업을 찾고 있어요; (
IgnazioC

1
@IgnazioC 백업을 볼 필요가 없습니다. 내 대답을 봤어? git reflog필요한 것을 보여줄 것입니다.
Brian Campbell

0

분리 된 머리는 변경하지 않고 원하는 한 괜찮습니다.

커밋을 되돌리려면 특정 분기에서 git revert를 사용할 수 있습니다.

분리 된 머리에서 일하고 커밋을하고 싶다면; 새 분기를 만들고 나중에 병합합니다.


네! 우리는 규칙을 알고 있습니다. 그러나 동료들이 멀어진 머리에서 일한 다음 그 커밋을 떠날 때 그들은 규칙이 아닌 대답을 요구합니다.
manuelvigarcia

0
  1. 먼저 실행 git reflog하여 기록을 확인합니다.
  2. 가장 오래된 개정판이 목록의 마지막 개정판이됩니다.
  3. git checkout -b temp e35d2b3여기를 사용하여 원하는 커밋으로 전환 하십시오. e35dd23은 커밋 의 해시 값입니다.
  4. 그게 다야. 이제 git add합니다. 기타....

문제가 해결되면 대답으로 받아들이십시오. 그렇지 않으면 의견을 공유하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.