분리 된 헤드에서 커밋으로 수행 할 작업


279

자식을 사용하여 이와 같은 것을 만들었습니다.

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

헤드가 분리 된 상태에서도 여전히 커밋 할 수 있다고 말했기 때문에 그렇게했습니다. 그러나 이제 분리 된 헤드 브랜치와 로컬 마스터 브랜치를 병합 한 다음 변경 사항을 원산지 / 마스터로 푸시하고 싶습니다.

그래서 내 질문은 어떻게 마스터 브랜치를 내 실제 상태와 분리 할 수 ​​있습니까?



이 상태에서 커밋 트리의 스크린 샷을 추가 할 수 있습니다 (분리 된 헤드의 커밋이 실제로 gitk 또는 SourceTree에서 어떻게 보이는지).이 질문을 더 좋게 만듭니다.
florisla

불행히도 지금은 할 수 없지만 제공 할 수 있다면 여기서 볼 수있어서 기쁠 것입니다. 무승부 여야하더라도 더 명확 해집니다
benzen

답변:


476

당신이있는 지점을 만든 다음 master로 전환하고 병합하십시오.

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
미래에 어떻게 헤드를 분리하지 않습니까?
ycomp

나는 이것을했고 5 커밋으로 원점보다 앞서 나 자신을 발견했다. 이 경우 git push origin을 수행합니까?
Winnemucca

5
이상하게도 "이미 최신 상태입니다." 내 임시 작업을 병합 할 때
Robert Sinclair

10
"git branch -d my-temporary-work"로 내 임시 작업을 삭제하는 것을 잊지 마십시오
Captain Lepton

5
@ycomp "detached head"는 이전 커밋 파일을 편집 한 다음 분기가없는 파일을 커밋하여 나중에이 새 커밋을 참조 할 때 발생합니다. 분리 된 헤드를 피하려면 이전 커밋을 체크 아웃하지 마십시오. 여전히 모든 파일을 새 커밋으로 원한다면 커밋 자체 대신 커밋에서 디렉토리를 체크 아웃 할 수 있습니다. 이 답변보기
lucidbrot

96

이런 식으로 할 수 있습니다.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

더 간단한 것

git checkout master
git merge HEAD@{1}

그러나 이것은 실수를하면 분리 된 헤드에서 커밋을 복구하는 것이 조금 더 어려울 수있는 약간의 위험이 있습니다.


4
나는 이것이 몇 년 후인 것을 알고 있지만이 답변에 감사드립니다. 나는 임시 지점을 떠나고 싶지 않기 때문에 여기에서 허용 된 답변으로 검색을 수행하지 않았다고 생각 하며이 답변에는 삭제하라는 명령이 있습니다.
Jeremy Pridemore

8
이 명령을 사용하기로 결정했다면 다음 명령을 사용하여 사용하려는 명령 git merge HEAD@{1}인지 확인해야합니다.git reflog
Michael Stramel

3
HEAD @ {1}을 (를) 병합 할 수 있기 때문에 이미 선점 적으로 마스터를 체크 아웃 한 이후 목숨을 구했습니다.
juil

이상하게도 "이미 최신 상태입니다." tmp를 병합 할 때 (하지만 파일이 다름)
Robert Sinclair

18

이것이 내가 한 일입니다.

기본적으로 detached HEAD이름이없는 새로운 지점 으로 생각하십시오 . 다른 지점과 마찬가지로이 지점에 커밋 할 수 있습니다. 커밋이 완료되면 원격으로 푸시하려고합니다.

따라서 가장 먼저해야 할 일은 detached HEAD이름을 지정하는 것입니다. 이 작업을 수행하는 동안 쉽게 좋아할 수 있습니다 detached HEAD.

git checkout -b some-new-branch

이제 다른 지점처럼 원격으로 푸시 할 수 있습니다.

제 경우에는 또한 detached HEAD(이제 some-new-branch) 커밋과 함께이 지점을 마스터하기 위해이 분기를 빨리 진행하고 싶었습니다 . 내가 한 것은

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

물론 나중에에 병합했습니다 master.

그게 다야.


1
이 답변은 다른 사람들이하지 않은 나를 위해 일했습니다. git checkout -b new-branch나를 위해 일했다. 다른 제안은을 요구 git branch new-branch했지만 그로 인해 여전히 분리되어 있었고 새 지점은 변경 사항을 적용하지 못했습니다.
Jesse Patel

17

당신은 할 수 있습니다 git merge <commit-number>또는git cherry-pick <commit> <commit> ...

Ryan Stewart가 제안한 것처럼 현재 HEAD에서 분기를 만들 수도 있습니다.

git branch brand-name

아니면 그냥 태그 :

git tag tag-name

분리 된 헤드에서 커밋 번호를 찾을 수 있습니다git rev-parse HEAD
KOGI

6

HEAD가 분리 된 경우 명명 된 분기가 업데이트되지 않는다는 점을 제외하고는 커밋이 정상적으로 작동합니다. 커밋 된 변경 사항으로 마스터 분기를 업데이트하려면 임시 분기를 현재 위치 (이 방법으로 분리 된 HEAD에서 커밋 된 모든 변경 사항이 적용됨)를 만든 다음 마스터 분기로 전환하고 임시 분기를 주인.

git branch  temp
git checkout master
git merge temp

3

쉬운 수정은 해당 커밋 및 체크 아웃에 대한 새 분기를 만드는 것 git checkout -b <branch-name> <commit-hash>입니다.

이러한 방식으로 모든 변경 사항이 해당 분기에 저장됩니다. 남은 커밋에서 마스터 브랜치를 정리해야하는 경우 반드시 실행하십시오 git reset --hard master.

이를 통해 브랜치를 다시 작성하게되므로 이러한 변경 사항이있는 사람을 방해하지 않도록하십시오. 분리 된 HEAD 상태를 더 잘 설명하려면이 기사를 살펴보십시오 .


1

아마도 가장 좋은 해결책은 아니지만 (역사를 다시 쓰게 될 것입니다) 그러나 당신도 할 수 있습니다 git reset --hard <hash of detached head commit>.

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