분리된 헤드에서 수행된 커밋으로 수행할 작업
깃을 이용해서 이런 것을 만들었습니다.
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)
머리가 분리된 상태에서는 여전히 범죄를 저지를 수 있다고 했기 때문에 그렇게 했습니다.그러나 이제 분리된 헤드 브랜치와 로컬 마스터 브랜치를 병합한 다음 변경 사항을 오리진/마스터에 적용하고 싶습니다.
그래서 제 질문은 어떻게 마스터 브랜치를 실제 상태(분리된 헤드)와 병합할 수 있는지입니다.
현재 위치에 분기를 만든 다음 마스터로 전환하고 병합합니다.
git branch my-temporary-work
git checkout master
git merge my-temporary-work
당신은 이런 것을 할 수 있습니다.
# 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}
하지만 실수를 하면 분리된 머리에 대한 커밋을 복구하는 것이 조금 더 어려울 수 있다는 약간의 위험이 있습니다.
제가 한 일은 이렇습니다.
기본적으로, 생각해 보세요.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 the current state of master to my changes
물론 나중에 병합했습니다.master
.
이상입니다.
당신은 그냥 할 수 있습니다.git merge <commit-number>
또는git cherry-pick <commit> <commit> ...
Ryan Stewart가 제안한 대로 현재 HEAD에서 분기를 생성할 수도 있습니다.
git branch brand-name
아니면 그냥 태그:
git tag tag-name
또는 분기에서 커밋 ID를 선택할 수 있습니다.
<commit-id> made in detached head state
git checkout master
git cherry-pick <commit-id>
임시 분기도 없고 병합도 없습니다.
거의 모든 사람들이 임시 지점을 만드는 해결책을 제안한 것 같습니다.이제 이러한 "분리된 상태에서 커밋" 문제가 발생할 때마다 일반적으로 한 번의 커밋 후에 탐지된다는 것을 인정해야 합니다.그리고 그 작은 약속 하나를 위해 하나의 전체 지부를 만드는 것은 너무 과하게 들리죠, 그렇죠?특히 이미 너무 많은 지점들 사이에서 뛰어다니고 있는 프로젝트에서는 더욱 그렇습니다.
그렇다면 쉬운 방법은 무엇입니까?커밋 해시를 사용합니다!
어떻게 알아요?
- 를 .
git log
다음과 같은 것을 볼 수 있습니다.
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD)
Author: Someone <someone@something.com>
Date: So/me/day SO:ME:TI:ME
A commit message that doesn't mean much
commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master)
Author: Someone <someone@something.com>
Date: Some/other/day SOME:OTHER:TIME
Another commit message that doesn't mean much
commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date: Thu Jul 8 08:38:12 2021 +0530
Enough reading the example, focus on the answer!!
일반적인 경우처럼 보이지만, 당신이 할 때는git push
"모든 것이 최신 상태입니다."라고 표시됩니다.
신중한 사람은 그것이 "최신"이 아니라는 것을 알게 될 것입니다. HEAD
마스터가 아닌 다른 곳에 있습니다.
- 그럼, 다음은?해시의 초기 문자만 복사합니다.
10bf8fe4d1
먼저 그고먼저를 .git checkout master
그러면 다음으로 이동할 수 있습니다.master
분점. 했습니다.그리고 이제 당신은 이미 해시를 복사했습니다.를 할 수 .git merge <hash>
를 .git log
지금이다
그리고 VOILLA:
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <someone@something.com>
Date: S/om/eday SO:ME:TI:ME
A commit message that doesn't mean much
commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <someone@something.com>
Date: Some/other/day SOME:OTHER:TIME
Another commit message that doesn't mean much
commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date: Thu Jul 8 08:38:12 2021 +0530
Enough reading the example, focus on the answer!!
이, 제.HEAD
적절한 장소에 있는 것 같습니다.
누군가는 이렇게 물을 수도 있습니다. "만약 제가 해시를 가지고 있지 않다면요? 커밋에 나달거리커대밋아그했모다습니냥르고도는것무는해랑에▁a▁did▁i▁and다했니습▁just▁the그▁didn▁dang냥.git checkout master
걱정하지 마세요, 제가 엄호해 드릴께요.커밋 해시는 다음 두 가지 위치에서 찾을 수 있습니다.
- 당신이 했을 때
git checkout master
,git
에게 이렇게 했습니다.
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
10bf8fe A commit message that doesn't mean much
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> 10bf8fe
Switched to branch 'master'
당신은 당신의 보물을 볼 수 있습니다.hash
?), 그죠렇?
- 설마 못 찾으시겠어요?그것은 바로 거기입니다.하지만 만약 당신이 정말로 할 수 없다면, 당신은 할 수 있습니다.
git reflog
다음과 같은 내용이 표시됩니다.
a3cd1ce (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master
10bf8fe HEAD@{1}: commit: A commit message that doesn't mean much
당신이 찾고 있던 보물이 있다는 것을...해시.
저는 이것이 분리된 상태에서 발생할 수 있는 모든 가능한 시나리오를 포함한다고 생각합니다.다음 번에는 조심하세요!!
HEAD가 분리된 경우 지정된 분기가 업데이트되지 않는 것을 제외하고 커밋은 정상적으로 작동합니다.마스터 분기가 커밋된 변경사항으로 업데이트되도록 하려면 현재 위치에 임시 분기를 만든 다음(이렇게 하면 임시 분기가 분리된 HEAD에서 수행한 모든 커밋된 변경사항을 가지게 됩니다), 마스터 분기로 전환하고 임시 분기를 마스터와 병합합니다.
git branch temp
git checkout master
git merge temp
은 그 지점을 입니다: 게쉽해결할수있는방해커위다을것생체입니는하웃크아고하성.git checkout -b <branch-name> <commit-hash>
.
이렇게 하면 변경한 내용이 해당 분기에 모두 저장됩니다.해야 할 하십시오.git reset --hard master
.
이렇게 하면 분기를 다시 작성할 수 있으므로 변경 사항으로 인해 다른 사용자에게 방해가 되지 않도록 하십시오.분리된 HEAD 상태를 더 잘 설명하려면 이 문서를 참조하십시오.
실검표
git merge {{commit-message}:
아마도 최고의 해결책은 아닐 것입니다, (역사를 다시 쓸 것입니다) 하지만 당신은 또한 할 수 있습니다.git reset --hard <hash of detached head commit>
.
만약 당신이 그 상태(커밋이 분리된 상태)에 있다면 나는 푸시할 때까지 적절한 단계를 줄 것입니다.분리된 평균은 커밋이 분기와 연결되어 있지 않은 경우, "커밋 헤드" 상태와만 연결되어 있다는 것입니다.
먼저 새 분기를 만들어야 합니다. 분리된 커밋이 자동으로 새 분기와 연결됩니다.
git branch temporaryWork
그리고 "임시 작업"을 병합할 수 있도록 마스터하려면 체크아웃으로 이동합니다.오류를 방지하기 위해 지점 이름 목록을 확인하십시오.
git checkout master
git merge temporaryWork
그리고 Git는 당신의 파일이 충돌할 수 있다고 말하고, 당신의 코드 텍스트 편집기를 뒤로 돌아보고, 당신이 필요로 하지 않는 코드를 삭제할 것입니다.
그리고 그 변화를 커밋합니다.
git add .
git commit -am "merging temporaryWork"
그런 다음 "임시 작업"을 삭제합니다.
get branch -d temporaryWork
그리고 그것을 깃허브에 밀어 넣습니다.
git push origin master
제가 체크아웃을 해서 머리가 분리된 상태가 되었을 때, Git는 실제로 이런 경우에 무엇을 해야 하는지 알려줍니다.
git switch -c \<new-branchname>
결과는 분리된 헤드 상태에서 작업하는 동안 수행된 모든 커밋을 포함하는 헤드 및 새 분기를 분리하기 전과 마찬가지로 마스터를 리프합니다.
더 자세히 재현/테스트/이해하기
- 두 개의 커밋으로 테스트 보고서 만들기:
~/gittest$ git log --oneline 17c34c0 (HEAD -> master) 2 5975930 1
- 체크아웃 이전 커밋 1
~/gittest$ git checkout 5975930
이 독일어 메시지가 표시됩니다.
힌웨이스:Wechsle zu '5975930'.
Siebefindenim Zustandeines 'losgelösten HEAD'. Siekönensichumschauen, experimentelle ehnderungen vornehen und diesecommitted, und Siekönen allemögrichen Committs, Siein diesem Zustandem, Ohen, Ohneuswirken 지점, 그리고 Weenchelen 지점.
웬 시이넨뇌이엔 브랜치스텔렌 뫼히텐, 음 아이헤르스텔텐 커밋츠베할텐, 쾨넨 시이다스(제트 토더 스페터) 듀치 누트종 폰 '스위치' 완화 옵션 - ctun.베이스피엘:
git switch -c \<neuer-Branchname>
오데룸 다이제 작전 뤼크갱기그 주 마헨: 깃 스위치 -
Sie Könen diesen Hinweis auschalten, Sie Konfigurations 변수 ' 조언'. 별첨.Head' auf 'false' 설정.
헤드이스트 제트비 59759301
영어로 번역하면 다음과 같습니다.
참고: '5975930'으로 변경합니다.
당신은 '분리된 HEAD' 상태에 있습니다. 당신은 주위를 둘러보고, 실험적인 변경을 하고, 그것들을 커밋할 수 있으며, 다른 분기로 전환함으로써 분기에 영향을 미치지 않고 이 상태에서 할 수 있는 모든 커밋을 폐기할 수 있습니다.
생성된 커밋을 유지하기 위해 새 분기를 생성하려면 -c 옵션과 함께 'switch'를 사용하여(지금 또는 나중에) 그렇게 할 수 있습니다.예:
git switch -c <new-branch-name>.
또는 이 작업을 실행 취소하려면 git switch -.
구성 변수 'advise.detached'를 설정하여 이 힌트를 끌 수 있습니다.Head'에서 'false'.
HEAD는 현재 59759301에 있습니다.
(www.DeepL.com/Translator (무료 버전)으로 번역)
언급URL : https://stackoverflow.com/questions/7124486/what-to-do-with-commit-made-in-a-detached-head
'programing' 카테고리의 다른 글
mongodb에서 문자열을 날짜로 변환하는 중 (0) | 2023.05.12 |
---|---|
이전 커밋을 여러 커밋으로 분할 (0) | 2023.05.12 |
Where 절의 SQL Row_Number() 함수 (0) | 2023.05.12 |
Windows 10 콘솔에서 인피니티가 "8"로 인쇄되는 이유는 무엇입니까? (0) | 2023.05.12 |
Azure 함수 데이터베이스 연결 문자열 (0) | 2023.05.12 |