programing

Git 분리 헤드는 어떻게 고치나요?

oldcodes 2023. 4. 14. 22:06
반응형

Git 분리 헤드는 어떻게 고치나요?

저장소에서 작업을 수행하다가 파일이 로컬로 변경되었음을 발견했습니다.더 이상 필요없어서 파일을 삭제했는데, 그냥 새 사본을 체크아웃하면 될 것 같아서요.나는 Git에 해당하는 것을 하고 싶었다.

svn up .

「」를 사용합니다.git pull랜덤 사이트했습니다.

git checkout HEAD^ src/

)src는, 삭제된 파일이 격납되어 있는 디렉토리입니다).

이제서야 내가 냉정한 머리를 가졌다는 걸 알게 됐어.난 그게 뭔지 전혀 모르겠어.어떻게 되돌릴 수 있죠?

분리된 헤드는 더 이상 지점에 있지 않고 이력에서 단일 커밋을 체크 아웃했음을 의미합니다(이 경우 HEAD 앞의 커밋, 즉 HEAD^).

분리된 HEAD와 관련된 변경 내용을 삭제하는 경우

예를 들어, 자신이 있던 지점만, 예를 들면 다음과 같습니다.

git checkout master

다음 번에 파일을 변경한 후 인덱스에 있는 상태로 복원하려면 먼저 파일을 삭제하지 말고 다음 작업을 수행하십시오.

git checkout -- path/to/foo

그러면 파일 foo가 인덱스에 있는 상태로 복원됩니다.

분리된 HEAD와 관련된 변경 사항을 유지하려는 경우

  1. 실행합니다.git branch tmp 새로 됩니다.tmp.
  2. 실행합니다.git checkout master
  3. 을 에 master , run , runfilename.git merge tmp master분점.당신은 그 위에 있어야 합니다.mastergit checkout master.

잃어버리고 싶지 않은 파일을 변경한 경우 파일을 푸시할 수 있습니다.분리모드로 커밋하고 나서 임시 브랜치로 이동하여 나중에 마스터로 통합할 수 있습니다.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

추출처:

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

일시적인 브런치 또는 머지 커밋이 없는 솔루션

이 모드에서 이미 변경 후 변경 내용을 저장하고자 할 때 분리된 HEAD 상태를 종료("수정")하는 방법:

  1. 유지할 변경을 커밋합니다.분리된 HEAD 상태에서 변경한 내용을 인계받으려면 해당 내용을 커밋하십시오.예를 들어 다음과 같습니다.

    git commit -a -m "your commit message"
    
  2. 유지하지 않을 변경 내용을 삭제합니다.하드 리셋은 분리된 HEAD 상태에서 수행한 커밋되지 않은 변경을 모두 폐기합니다.

    git reset --hard
    

(이렇게 하지 않으면 스텝3이 실패하고 분리된 HEAD 내의 커밋되지 않은 변경 파일에 대한 불만이 제기됩니다).

  1. 지점을 확인합니다.이전에 작업한 지점을 체크하여 분리된 HEAD 상태를 종료합니다.다음은 예를 제시하겠습니다.

    git checkout master
    
  2. 커밋을 이어받으세요.이제 다른 질문에 대한 답변에서 보듯이 분리된 HEAD 상태에서 한 커밋을 체리피킹으로 이어받을 수 있습니다.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> ...
    

분리 헤드는 다음을 의미합니다.

  1. 당신은 더 이상 지점에 있지 않습니다.
  2. 이력에서 단일 커밋을 체크아웃했습니다.

변경이 없는 경우: 다음 명령을 적용하여 마스터로 전환할 수 있습니다.

  git checkout master

유지할 변경이 있는 경우:

분리된 HEAD의 경우 지정된 브랜치가 업데이트되지 않는 경우를 제외하고 커밋은 정상적으로 동작합니다.마스터 브랜치를 커밋된 변경으로 갱신하려면 현재 위치에 임시 브랜치를 만듭니다(이렇게 하면 임시 브랜치에는 분리된 HEAD에서 수행한 모든 커밋된 변경이 포함됩니다).그런 다음 마스터 분기로 전환하여 임시 분기와 마스터를 병합합니다.

git branch  temp
git checkout master
git merge temp

HEAD는 포인터로 직접 또는 간접적으로 특정 커밋을 가리킵니다.

Attached HEAD는 일부 분기(즉, 분기)에 연결되어 있는 것을 의미합니다.
분리 헤드는 어떤 브랜치에도 연결되어 있지 않다는 것을 의미합니다.즉, 어떤 커밋을 직접 가리키고 있습니다.

여기에 이미지 설명 입력

즉, 다음과 같습니다.

  • 커밋을 직접 가리키면 HEAD가 분리됩니다.
  • 간접적으로 커밋을 가리키는 경우(즉, 커밋을 가리키는 브랜치), HEAD가 부착됩니다.

HEAD가 부착/분리되어 있는 상황을 보다 잘 이해하기 위해 위의 4중으로 이어지는 단계를 보여 줍니다.

먼저 저장소의 동일한 상태로 시작합니다(모든 사분면의 그림은 동일).

여기에 이미지 설명 입력


, 그럼 이번에는 공연해 요?git checkout- 개개의 사진에 다른 타겟이 있는 경우(이러한 명령어만 적용한다는 것을 강조하기 위해 그 위에 있는 타겟이 흐리게 표시됩니다).

여기에 이미지 설명 입력


다음 명령어를 실행하면 다음과 같은 상황이 됩니다.

여기에 이미지 설명 입력

보시는 바와 같이 HEAD는 타겟을 가리키고 있습니다.git checkout명령어: 브랜치(쿼드러플릿의 첫 번째 3개의 이미지) 또는 커밋(쿼드러플릿의 마지막 이미지)에 (커밋)합니다.

작업 디렉토리의 내용도 적절한 커밋(스냅샷), 즉 헤드가 지시한 커밋(직접 또는 간접)에 따라 변경됩니다.


따라서 우리는 이 답변의 시작과 같은 상황에 처해 있습니다.

여기에 이미지 설명 입력

변경을 가한 후 분리된 헤드에 있는 것을 알게 되면 stash -> checkout master -> stash pop: 를 실행할 수 있습니다.

git stash
git checkout master   # Fix the detached head state
git stash pop         # Or for extra safety use 'stash apply' then later 
                      #   after fixing everything do 'stash drop'

커밋되지 않은 변경 사항과 아무 일도 없었던 것처럼 일반적인 "첨부" 헤드가 표시됩니다.

여기 제가 고립된 상태이고 이미 몇 가지 변화를 주고 있다는 것을 깨달은 후에 제가 방금 한 일이 있습니다.

제가 변경했습니다.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

커밋의 해시(1fe56ad)가 생각났습니다.그리고 제가 있어야 할 지점을 확인했습니다.

$ git checkout master
Switched to branch 'master'

마지막으로 커밋의 변경을 브랜치에 적용했습니다.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

저는 이것이 임시 지점을 만드는 것보다 조금 더 쉽다고 생각합니다.

에서 을 체크 때git결국 머리가 벗겨진 상태가 되고...즉, 작업 복사본은 더 이상 명명된 참조 상태("마스터")를 반영하지 않습니다.이 기능은 저장소의 과거 상태를 검사하는 데 유용하지만 실제로 변경 사항을 되돌리려는 경우에는 원하는 상태가 아닙니다.

폐기하는 를 할 수 .checkout츠키다

git checkout myfile

이렇게 하면 커밋되지 않은 변경 내용이 모두 폐기되고 파일이 현재 브랜치 선두에 있는 상태로 돌아갑니다.커밋한 는, 「」를 할 수 .reset명령어를 입력합니다.예를 들어 저장소를 이전 커밋 상태로 리셋하고 이후의 변경은 모두 폐기합니다.

git reset --hard HEAD^

를 다른에는 ,, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, however, however, however, however, however, however, however, however, however, however, however, git reset가 중단될 가능성이 있습니다(저장소 이력의 일부를 삭제하기 때문입니다).했다면, 으로는 '보다 낫다'를 보는 .git revertantic Commit(안틱 커밋)

Git Book에 더 자세한 내용이 있습니다.

" state"Disparted Head state"를 합니다.git checkout -당신이 마지막으로 탔던 나뭇가지에 앉게다

은 아마 했을 거예요.git reset --hard origin/your-branch

just냥 try try 。git checkout your-branch

"헤드"에 있다는 것은 HEAD가 특정 이름 없는 커밋(지정된 브랜치와는 반대)을 참조한다는 것을 의미합니다(cf: https://git-scm.com/docs/git-checkout 섹션의 분리 헤드).실제로는 커밋을 체크아웃했지만 연관된 브랜치 이름은 없음을 의미합니다.

커밋과 관련된 새로운 브랜치만 작성하도록 선택할 수 있습니다.

git branch new-branch-name.

하면 현재 를 새 할 수 .new-branch-name and 에 있지 detached head아!

이전 상태로 되돌리려면 이전에 선택한 브랜치를 선택해야 합니다.

git checkout @{-1}

@Philippe Gerber의 답변을 더 명확히 하기 위해 다음과 같이 설명합니다.

겟체리픽

★★의 앞cherry-pick ,a ,agit checkout master이 경우 필요합니다.한 것은, 「」, 「」, 「」, 「E-」입니다.commitdetached head.

부록

'돌아가다', '돌아가다'를 사용할 수 .checkout @{-1}이전 체크아웃으로 돌아갑니다.

이붙일 수 를 들어, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」등의 것이 있습니다.git global --config alias.prev ' 하면 요'라고만 입력하면 돼요.git prev이전 체크아웃으로 돌아갑니다.

분리 헤드는 지점을 제대로 체크 아웃하지 않았거나 단일 커밋을 체크 아웃한 것을 의미합니다.

이러한 문제가 발생하면 먼저 로컬 변경 내용을 저장하여 변경 내용이 손실되지 않도록 하십시오.

그 후에...다음 명령을 사용하여 원하는 지점을 체크 아웃합니다.

예를 들어 브랜치 My Original Branch를 사용하고 싶다고 합시다.

git checkout - b someName origin / My Original Branch

@theeninja @theeninja 。" " 를한 후 이 git checkout master:

지점을 전환하기 전에 변경 내용을 커밋하거나 저장하십시오.중단 중

그런 다음 -f 플래그를 사용하여 다음과 같이 체크아웃을 강제할 수 있습니다.

git checkout -f master

이로 인해 분리 모드에서 수행된 모든 변경 내용이 손실된다고 합니다.그러니 조심해서 사용하세요.

이 접근방식은 커밋 이력의 일부를 폐기할 가능성이 있지만 오래된 마스터브런치와 현재 상태의 결합이 까다롭거나 커밋 이력의 일부를 잃는 것을 꺼리는 것을 꺼리지 않는 경우에 더 쉬워집니다.

현재 분리된 HEAD를 마스터 브랜치로 변환하지 않고 현재 상태를 유지하려면 다음과 같이 하십시오.

  1. 예기치 않게 문제가 발생했을 경우에 대비하여 저장소를 수동으로 백업합니다.
  2. 유지할 마지막 변경을 커밋합니다.
  3. 분기를 만들다.detached-head현재 상태의 파일이 포함됩니다.
git checkout -b detached-head
  1. (a) 보유할 필요가 없는 경우 마스터 브랜치를 삭제한다.
git branch -D master
  1. (b) 유지하려면 이름을 변경하십시오.
git branch -M master old-master
  1. 임시 분기의 이름을 새 마스터 분기로 변경합니다.
git branch -M detached-head master

크레디트: 게리 라이의 이 중간 기사에서 개작했습니다.

Git이 방법을 알려줬어.

입력한 경우:

git checkout <some-commit_number>

상태 저장

git add .
git commit -m "some message"

그 후, 다음과 같이 입력합니다.

 git push origin HEAD:<name-of-remote-branch>

츠키노
어떤 이유로든 나는 분리된 헤드를 갖게 되었다 - 나는 내가 있는 줄 알았던 지점과 같은 경로에서 커밋을 했다 - EG HEAD는 지점 태그의 아이였지만 어떤 이유로 지점 태그는 역사적인 커밋에 머물러 있었다...가가밀 었었?

내가 있다고 생각했던 나뭇가지에 있는 줄 몰랐기 때문에 밀지 못하게 했다.

같은 건 싶지 8주 정도 걸렸어요reset --hard★★★★★★★★★★★★★★★★★★★!

해결 방법은 다음과 같습니다.

git branch -f myStuckBranch HEAD
git checkout myStuckBranch

현재 HEAD와 myStuckBranch가 같은 것을 가리키고 있는데도 체크아웃을 해야 합니다.이는 아직 분리된 헤드 상태(브런치 위가 아님)로 간주되기 때문입니다.

저는 git의 전문가는 아니지만(이러한 상황을 일으키지 않는 mercurial을 주로 사용했기 때문에) 이 명령어는 "myStuckBranch를 HEAD로 포인트 변경"이라고 되어 있습니다.

작업 디렉토리를 교환할 필요 없이 가져오기 후 마스터에서 변경 내용을 병합하기 위해 이 명령을 사용합니다.그렇지 않으면 이전 버전의 마스터를 사용하려고 합니다.

git fetch
git branch -f master origin/master  -- err yeah don't just ignore what's been going on remotely - eg point my master at the real master
git merge master -- merge the changes into my local branch

항상 수동으로 작업 디렉토리를 변경해야 하는 것은 다소 번거롭지만, 변경 사항을 병합하기 위해 작업 디렉토리를 변경해야 하는 것보다 더 좋습니다.

통상은 「」입니다.HEAD커밋 해시를 경우69e51문제를 하려면 두 .이 문제를 해결하려면 두 지점을 가리켜야 합니다.두 가지 방법으로 고칠 수 있습니다.

  1. checkout // commit git checkout other_branch // 코드가 한 경우 합니다.hash
  2. 새로운 브런치를 생성하여 커밋해시를 새로 작성한 브런치를 포인트 합니다.

HEAD는 브런치를 가리켜야 합니다.커밋 해시가 황금 규칙이 아닙니다.

git를 사용하기 시작했을 때 혼란스러웠는데, 나중에 왜 이런 일이 일어나는지, 어떻게 대처하는 것이 가장 좋은지 알게 되었습니다.

이러한 발생의 근본 원인은 보통 git HEAD가 항상 어떤 브랜치를 가리키고 있으며 HEAD가 특정 커밋을 가리키려고 할 때 HEAD가 분리된 HEAD 상태가 되기 때문입니다.

HEAD가 부착된 상태일 때 -

cat .git/HEAD     # output--> ref: refs/heads/master or ref: refs/heads/main

HEAD가 분리 상태일 때 -

cat .git/HEAD     # output--> b96660a90cad75867453ebe1b8d11754bbb68b0e <commit hash>

솔루션 -

git stash           # Temporarily shelves (or stashes) changes
git branch          # Find your default branch
git switch master   # Point HEAD to master or main branch
git stash pop       # Apply all the changes you had previously

Git : 현재 지점에 없습니다.

Git에 표시되는 시간:

현재(분리된 HEAD) 상태로 이어지는 이력을 푸시하려면

git push origin HEAD:<name-of-remote-branch>

의미는 다음과 같습니다.

2개의 명령어를 실행하려면 다음 절차를 따릅니다.

  1. git branch -f {{your_working_branch}} HEAD--브런치를 머리에 붙입니다.
  2. git checkout {{your_working_branch}}-- checkout==스위치 브랜치

잔돈은 그대로 두고 싶어서 이걸 고치고...

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git push TOYOURCURRENTBRANCH

그것은 나에게 효과가 있다.

헤드가 분리되고 새 파일이 생성된 경우 먼저 다음과 같은 새 파일이 인덱스에 추가되었는지 확인하십시오.

git add .

그러나 기존 파일만 변경 또는 삭제한 경우에는 (-a)를 추가하는 동시에 다음 방법을 통해 메시지(-m)와 함께 커밋할 수 있습니다.

git commit -a -m "my adjustment message"

다음으로 현재 상태로 새 브랜치를 만들 수 있습니다.

git checkout -b new_branch_name

새로운 지점을 개설하게 되면 모든 조정은 그 지점에서 이루어집니다.그런 다음 원격 및/또는 체크아웃/풀/머지를 원하는 대로 계속할 수 있습니다.

알지 채 것을 (떨어져 있는 처럼) 나는 또한 그것을 얻으려고 되었다.merge,rebase ★★★★★★★★★★★★★★★★★」cherry-pick수백 건의 마지 컨플릭트를 유발했기 때문에 다른 접근법을 취했습니다.

  1. (모든 것이 커밋되어 있다고 가정합니다(워킹 트리는 '깨끗'합니다).

  2. 메시지:git log > /tmp/log

  3. 트리를 합니다:mkdir /tmp/backup && cp -a all_my files_and_directories /tmp/backup

  4. mastergit checkout master

  5. 및 를 모두 합니다.rm ...

  6. 백을을사사 use use use use use use use use를 사용합니다.cp -a /tmp/backup/. .

  7. git add ★★★★★★★★★★★★★★★★★」git commit " " 에서 사용/tmp/log다른 서브셋의 파일로 반복할 수도 있습니다.

은 1개의 이 여러 번입니다.master 해치웠다.master.

HEAD가 분리되어 있다는 것은 현재 어느 지점에도 존재하지 않는다는 것을 의미합니다.현재 변경 사항을 유지하고 새 분기를 만드는 방법은 다음과 같습니다.

git commit -m "your commit message"
git checkout -b new_branch

그런 다음 이 새 분기를 다른 분기와 병합할 수 있습니다.git "a dog" 명령어는 항상 도움이 됩니다.

git log --all --decorate --oneline --graph

머리를 싫어하고 대신 메인 화면으로 돌아가고 싶다면:

git checkout main

헤드를 사랑하지만 메인이 추적하길 바란다면:

git checkout -B main HEAD

은, ( 「 」 「 」 「 」 「 」 「 」 「 」 、 「 」 「 」 、 「 」 not 、 「 」 name ( name namemain포인터뿐만 아니라 포인터에 HEAD

(커밋하지 않은 변경을 커밋할 경우 먼저 커밋합니다).

git pull origin master

날 위해 일했어리모트나 브랜치명을 명시적으로 붙이는 것 뿐이었습니다.

이것은 나에게 유효합니다.이것에 의해, 분리된 헤드에 새로운 브랜치가 할당됩니다.

git checkout new_branch_name detached_head_garbage_name

git rebase를 사용하면 HEAD를 원하는 커밋으로 이동할 수 있습니다.

다음과 같이 브랜치가 분리된 상태에 있다고 가정합니다.

* bfcb8f9 Commit 4
* 540a123 Commit 3
* 4356d64 Commit 2
| * fecb8d2 Commit 2
|/
| * 8012f45 Commit 2x
|/
| * 6676d15 (HEAD -> master) Commit 2 --amend
|/
* 1818f91 Commit 1

분리 헤드는 git commit --amend 명령에 의해 이전에 작성된 분리 커밋을 가리키는 실수로 다시 베이스로 작성되었습니다.

HEAD 참조를 최신 커밋으로 이동하려면 원하는 해시 커밋을 사용하여 기본 재설정을 적용합니다.이 예에서 해시는 최신 커밋입니다.

git rebase bfcb8f9

이것에 의해, 브런치의 HEAD가 목적의 커밋(이 경우는 최신)으로 이행합니다.

* bfcb8f9 (HEAD -> master) Commit 4
* 540a123 Commit 3
* 4356d64 Commit 2 --amend
| * fecb8d2 Commit 2
|/
| * 8012f45 Commit 2x
|/
| * 6676d15 Commit 2
|/
* 1818f91 Commit 1

언급URL : https://stackoverflow.com/questions/10228760/how-do-i-fix-a-git-detached-head

반응형