programing

분리된 HEAD와 마스터/오리지널을 조정하는 방법은 무엇입니까?

telecom 2023. 4. 10. 20:57
반응형

분리된 HEAD와 마스터/오리지널을 조정하는 방법은 무엇입니까?

Git의 분기 복잡성은 처음입니다.저는 항상 단일 브랜치에서 작업하고 변경을 커밋한 후 정기적으로 리모트 오리진에 푸시합니다.

어딘가에서 몇 에 리셋을 .rebase -i 없는 입니다.을 사용하다

직장에서는 가가 in in in in in in in in in in in ingit log내가 기대했던 걸 정확히 보여주고 있어 내가 원하지도 않았던 약속들, 거기에 새로운 약속들...

하지만 리모트 저장소로 이동했을 뿐인데, 무엇이 다른가요? 베이스 변경에서 죽였던 몇 개의 커밋이 푸시되었고, 새로운 커밋이 로컬에서 커밋된 것은 거기에 없습니다.

마스터/origin은 HEAD에서 분리되어 있다고 생각합니다만, 그 의미, 명령줄 툴로 시각화하는 방법, 수정 방법에 대해서는 100% 알 수 없습니다.

먼저 HEAD무엇인지, HEAD가 분리되었을 때의 의미를 명확히 합니다.

HEAD는 현재 체크아웃된 커밋의 심볼 이름입니다.HEAD가 분리되지 않은 경우('일반'1 상황: 브런치가 체크아웃되어 있는 경우) HEAD는 실제로 브런치의 'ref'를 가리키고 브런치는 커밋을 가리킵니다.따라서 HEAD는 브랜치에 "접속"됩니다.새로운 커밋을 하면 HEAD가 가리키는 브랜치가 새로운 커밋을 가리키도록 갱신됩니다.HEAD는 브랜치만 가리키기 때문에 자동으로 따라갑니다.

  • git symbolic-ref HEAD 율율refs/heads/master
    'mastermaster'라는 이름으로 .
  • git rev-parse refs/heads/master17a02998078923f2d62811326d130de991d1a95a
    이 커밋은 마스터 브랜치의 현재 힌트 또는 "헤드"입니다.
  • git rev-parse HEAD, 「」를 산출합니다.17a02998078923f2d62811326d130de991d1a95a
    이것이 "상징적 레퍼런스"가 되는 것의 의미이다.하다
    (심볼릭 참조는 원래 심볼릭링크로 실장되어 있었지만 나중에 심볼링크가 없는 플랫폼에서 사용할 수 있도록 해석 기능이 추가된 플레인파일로 변경되었습니다).

우리는 가지고 있다.HEADrefs/heads/master17a02998078923f2d62811326d130de991d1a95a

HEAD를 분리하면 커밋을 브런치를 통해 간접적으로 가리키는 것이 아니라 직접 커밋을 가리킵니다.분리된 HEAD는 이름 없는 브랜치에 있다고 생각할 수 있습니다.

  • git symbolic-ref HEADfatal: ref HEAD is not a symbolic ref
  • git rev-parse HEAD 율율17a02998078923f2d62811326d130de991d1a95a
    이것은 심볼릭 레퍼런스가 아니기 때문에 커밋 자체를 직접 가리켜야 합니다.

우리는 가지고 있다.HEAD17a02998078923f2d62811326d130de991d1a95a

분리된 HEAD에서 기억해야 할 중요한 점은 그것이 가리키는 커밋이 다른 방법으로 참조되지 않은 경우(다른 참조가 도달할 수 없음), 다른 커밋을 체크 아웃할 때 "당글링" 상태가 된다는 것입니다.최종적으로 이러한 당글링 커밋은 가비지 수집 프로세스를 통해 플루닝됩니다(디폴트로는 최소 2주간 유지되며 HEAD의 reflog에 의해 참조됨으로써 더 오래 유지될 수 있습니다).

1 분리된 헤드를 사용하여 "일반" 작업을 수행하는 것은 완벽하게 문제 없습니다. 삭제한 이력을 다시 로그에서 꺼내는 것을 피하기 위해 자신이 하고 있는 작업을 추적하기만 하면 됩니다.


인터랙티브 리베이스의 중간 단계는 분리된 HEAD를 사용하여 이루어집니다(일부 활성 브랜치의 리프로그가 오염되지 않도록 하기 위해).전체 기본 재배치 작업을 완료하면 기본 재배치 작업의 누적 결과로 원래 분기가 업데이트되고 HEAD를 원래 분기에 다시 부착합니다.기본 재배치 프로세스를 완전히 완료하지 못한 것 같습니다.이렇게 하면 기본 재배치 조작에 의해 최근에 처리된 커밋을 나타내는 분리된 HEAD가 나타납니다.

상황을 회복하려면 분리된 HEAD가 현재 지적하고 있는 커밋을 나타내는 브런치를 작성해야 합니다.

git branch temp
git checkout temp

의 명령어는 (2개의 명령어)로 할 수 ).git checkout -b temp)

HEAD에 부착됩니다.temp★★★★★★ 。

다음으로 현재의 커밋(및 그 이력)을 작업 예정의 통상 브랜치와 비교합니다.

git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp

옵션을 ( " " " " " " " " " " " " " . add " )-p , 단 off니다 , , 。--pretty=…" " " " " " )

★★★★★★★★★★★★의 경우,temp 업데이트 수 ).을 사용하다master★★★★★★★★★★★★★★★★★★:

git branch -f master temp
git checkout master

의 명령어는 (2개의 명령어)로 할 수 ).git checkout -B master temp)

그런 다음 임시 분기를 삭제할 수 있습니다.

git branch -d temp

마지막으로 재정립된 이력을 푸시할 수 있습니다.

git push origin master

때 '어울리지 않다'를 넣어야 할 요.--force리모트 브런치를 새로운 커밋에 「고속 커밋」할 수 없는 경우(즉, 드롭, 기존의 커밋의 재작성, 또는 이력의 일부의 재작성)를, 이 커맨드의 마지막에 푸시 합니다.

기본 재배치 작업 중이라면 청소해야 합니다. 중이었는지 여부를 "Directory "를 ..git/rebase-merge/진행중인 기본 재배치 작업은 해당 디렉토리를 삭제하는 것만으로 수동으로 정리할 수 있습니다(예를 들어 활성 기본 재배치 작업의 목적과 컨텍스트를 더 이상 기억하지 못하는 경우).은 ★★★★★★★를 사용합니다.git rebase --abort단, 이 경우 리셋을 회피하는 것이 바람직할 수 있습니다(HEAD를 원래 브랜치로 되돌리고 원래 커밋으로 되돌립니다).이렇게 하면 위의 작업 중 일부가 취소됩니다.

다음 작업을 수행합니다.

git checkout master

또는 변경할 사항이 있는 경우 다음을 수행합니다.

git checkout -b temp
git checkout -B master temp

저는 이 문제에 부딪혔고, 상위 투표 결과를 읽었을 때 다음과 같이 대답했습니다.

HEAD는 현재 체크아웃된 커밋의 심볼 이름입니다.

★★★★★★★★★★★★★★★★.HEAD으로, 체크 아웃 커밋과 할 수 .★★★★★★★★★★★★★★★★★,master을 에 master:

git rebase HEAD master

다음 명령어:

  1. 아웃 「」master
  2. .HEAD으로 HEAD에 diver에서 있다master
  3. 는 이러한 합니다.master

, 「」, 「」에 은, 「」, 「」에 있습니다.HEAD 아니다master, 「」에도 .mastermaster체크 아웃된 채로 있습니다.


리모트에 대해서:

내가 기본 재배치 과정에서 죽인 몇 개의 커밋이 밀려났고, 새로운 커밋은 그곳에 없어.

리모트 이력은, 로컬 이력을 사용해 패스트 포워딩 할 수 없게 됩니다. 합니다.git push -f원격 이력을 덮어씁니다.공동작업자가 있는 경우 일반적으로 공동작업자와 함께 조정하여 모든 사람이 같은 페이지에 있도록 하는 것이 좋습니다.

★★를 후masterorigin origin/master는, 같은 됩니다.master.

분리 헤드에 대한 기본 설명은 여기를 참조하십시오.

http://git-scm.com/docs/git-checkout

시각화하는 명령줄:

git branch

또는

git branch -a

다음과 같은 출력이 표시됩니다.

* (no branch)
master
branch1

* (no branch), head.dispected head.dispected head.dispected head.dispected head.dispected head.d

가 될 .git checkout somecommit하다

'detached HEAD' 상태입니다.주위를 둘러보고 실험적인 변경을 하고 커밋할 수 있습니다.또, 다른 체크 아웃을 실행하는 것으로, 브랜치에 영향을 주지 않고, 이 스테이트로 한 커밋을 폐기할 수 있습니다.

작성한 커밋을 유지하기 위해 새로운 브런치를 작성하려면 (지금 또는 나중에) checkout 명령어와 함께 -b를 다시 사용하여 작성할 수 있습니다.예:

git checkout -b new_module_name

이제 마스터로 이동하려면:

해요.git reflog ★★★★★★★★★★★★★★★★★.git log밋을을적적적적적, 이제git checkout master ★★★★★★★★★★★★★★★★★」git merge★★★★★★ 。

git merge HEAD@{1}

편집:

, 을 사용합니다.git rebase -i불필요한 커밋 삭제/삭제뿐만 아니라 편집에도 사용할 수 있습니다.에 「이라고 기재하는해, 「」, 「편집」을 할 수 .git rebase --continue아아아아아아아아아아아아아아아아아아아아.이렇게 하면 분리된 헤드에 접근하지 않을 수 있습니다.

독자적인 커밋을 브런치에 도입하다

「 「 」를 만 하면 .git checkout -b mynewbranch.

다음 " " " " 를 실행합니다.git log이 「」가 있는 것을 알 수 HEAD이 새로운 지점에.

가 검색하다 보니까 요.You are in 'detached HEAD' state.

지금까지의 일과 비교해서, 여기 오기 위해서 무엇을 했는지 분석한 결과, 나는 실수를 하고 있는 것을 알 수 있었습니다.

통상적인 흐름은 다음과 같습니다.

git checkout master
git fetch
git checkout my-cool-branch
git pull

이번에는, 다음과 같이 했습니다.

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

문제는 제가 실수로 이렇게 했다는 것입니다.

git checkout origin/my-cool-branch

대신:

git checkout my-cool-branch

(내 상황에서는) 위의 명령어를 실행한 후 플로우를 계속하는 것이 수정되었습니다.

git checkout my-cool-branch
git pull

마스터 브랜치만 가지고 있고 "개발" 또는 기능으로 돌아가려면 다음 절차를 수행합니다.

git checkout origin/develop

주의: 오리진/개발을 확인합니다.

분리된 HEAD 상태입니다.주위를 둘러보고, 실험적인 변경을 하고, 그것들을 커밋할 수 있습니다.또한 다른 체크아웃을 실행함으로써 브랜치에 영향을 주지 않고 이 상태에서 한 커밋을 폐기할 수 있습니다.

그리고나서

git checkout -b develop

동작:)

HEAD를 (체크박스를 켜십시오)git logbefore해 주세요

git push origin HEAD:master

분리된 헤드를 원래 마스터 브랜치로 보냅니다., 「 」를 시험해 .git pull origin master이치노는, 해, 로 오리진으로 변경할 수 ( 「 」 「 」 「 」 「 」 「 」 「 」 、 「 」-f) 커밋에 된 경우 든지 ""를 실행할 수 git reflog모든 지점에서 역사를 확인할 수 있습니다.


변경 내용을 유지하면서 마스터브런치로 돌아가려면 다음 명령을 사용합니다.

git rebase HEAD master
git checkout master

참조: Git: "현재 어떤 지점에도 없습니다." 변경 사항을 유지한 채 지점으로 돌아갈 수 있는 쉬운 방법이 있습니까?

브랜치 마스터만 사용했을 경우, 다음의 조작이 가능했습니다.

git push origin HEAD:master
git checkout master        
git pull

첫 번째는 분리된 HEAD를 원격 원점으로 푸시합니다.

두 번째는 지점 마스터로 이동합니다.

세 번째는 브런치마스터에 접속된HEAD를 회복합니다.

푸시가 거부되면 첫 번째 명령에서 문제가 발생할 수 있습니다.그러나 이는 더 이상 분리 헤드의 문제가 아니라 분리 헤드가 일부 원격 변경 사항을 인식하지 못한다는 사실에 관한 것입니다.

오늘 이 문제에 부딪혔는데, 다음과 같은 방법으로 해결했다고 확신합니다.

git branch temp
git checkout master
git merge temp

업무용 컴퓨터를 사용하던 중 이 작업을 수행하는 방법을 알아냈는데, 지금은 PC에서도 같은 문제가 발생하고 있습니다.그래서 내가 정확히 어떻게 했는지 확인하기 위해 내가 다시 업무용 컴퓨터로 돌아가는 월요일까지 기다려야 할 것이다.

HEAD가 양호한 상태라고 확신하는 경우:

git branch -f master HEAD
git checkout master

마스터가 원점에서 이탈했기 때문에 원점으로 푸시할 수 없을 것입니다.다른 사용자가 repo를 사용하지 않는 것이 확실할 경우 다음과 같이 강제 푸시할 수 있습니다.

git push -f

다른 사용자가 사용하지 않는 기능 브랜치에 있는 경우에 가장 유용합니다.

git checkout [ branch - name ]([ branch - name ])만 하면 됩니다.여기서 [branch-name]은 분리 헤드 상태가 된 원래 브랜치의 이름입니다.(asdfasdf에서 분리)가 사라집니다.

예를 들어 브랜치 'dev'에서 commit asdfasd14314 ->를 체크 아웃합니다.

'git checkout asdfasd14314'

당신은 지금 분리된 머리 상태에 있다.

'branch branch'에는 ->와 같은 항목이 표시됩니다.

* (detached from asdfasdf)
  dev
  prod
  stage

단, 분리 헤드 상태에서 벗어나 개발로 돌아가려면 ->

'git checkout dev'

그 후, 「브랜치」가 표시됩니다.->

* dev
  prod
  stage

하지만 그것은 물론 당신이 분리된 헤드 상태로부터 어떠한 변화도 유지할 생각이 없다면, 나는 이것을 많은 것을 하고 있다는 것을 알게 된다. 어떠한 변화도 의도하지 않고 단지 이전의 약속을 보기 위해서.

크리스가 지적한 것처럼, 나는 다음과 같은 상황이 있었다.

git symbolic-ref HEADfatal: ref HEAD is not a symbolic ref

, <고객명>님git rev-parse refs/heads/master할 수 있는 , 그 은 「」를 해 확인할 수 ).git show [SHA]

그 후 엉망진창으로 많은 일을 저질렀지만 고쳐진 건

git symbolic-ref HEAD refs/heads/master

머리도 다시 붙이고!

★★★★★★★★★★★★★★★★★★★★가 아닌git checkout origin/master

하다git checkout master

git branch브랜치를 확인합니다.

분리된 헤드에 대한 변경 내용을 저장하려면 다음과 같이 하십시오. 임시 분기를 만들고 변경을 수행한 후 YOUR-BRANCH로 이동하여 온도와 병합합니다.마지막으로 임시 분기를 삭제합니다.

git checkout -b temp
git add . && git commit -m 'save changes'
git checkout YOUR-BRANCH
git merge temp
git branch -d temp

저도 같은 문제가 있어서 다음 단계를 거쳐 해결했습니다.

변경을 유지할 필요가 있는 경우

  1. 뛰어야 .git checkout master명령어를 사용하여 마스터 브랜치로 돌아갑니다.
  2. 가 있는 는, 「」를 해 주세요.git checkout -b changes ★★★★★★★★★★★★★★★★★」git checkout -B master changes

변경이 필요 없는 경우

  1. 에서 추적되지 모든 하려면 를 합니다.git clean -df.

  2. 그런 다음 저장소 내에서 스테이징되지 않은 변경 사항을 모두 지워야 합니다. 위해서는 뛰어야 .git checkout --

  3. 마지막으로 '마스터브런치'를 사용해서 '로 합니다.git checkout master명령어를 입력합니다.

푸시하고 싶은 로컬 커밋이 없었기 때문에 로컬 브랜치를 다시 삭제하는 것만큼이나 쉬웠습니다.

그래서 나는 했다:

git branch -d branchname

그리고 브랜치를 다시 체크합니다.

git checkout branchname

마스터 에서 몇 가지 커밋을 수행하고 "백워드 머지"만 원하는 경우master 것)masterHEAD 줄이면 됩니다

git checkout -B master HEAD
  1. 합니다.master이동'과 같은 )master을 참조해 주십시오.)
  2. 는 을 됩니다.HEAD그게 네가 있는 곳이지
  3. 되었으므로, 로운운 on the the로 、 하 the the the the the 。master★★★★★★★★★★★★★★★★★★.

나는 이것이 종종 분리된 상태에 있는 하위 저장소의 경우에 특히 유용하다는 것을 알았다.

오늘 서브모듈을 업데이트했는데 어느 지점에도 없는 문제가 발생했습니다.이미 약속했으니까, 스택, 체크 아웃, 언스태킹은 통하지 않습니다.나는 결국 별채의 책임을 떠맡게 되었다.(푸시가 실패했을 때) 커밋 직후에, 다음과 같이 했습니다.

git checkout master
git cherry-pick 99fe23ab

제 생각은 이렇습니다.나는 냉정하지만 마스터가 되고 싶다.나의 독립 상태가 마스터와 크게 다르지 않다고 가정한다면, 마스터에 대한 나의 헌신을 적용할 수 있다면, 나는 준비가 되어 있을 것이다.이게 바로 체리픽이 하는 일이야.

가 몇을 가했다는 때master (예:)HEAD의 바로 위에 떨어져 있다.master 그 을 하지 것이 도움이 .스태킹이 될 수 있습니다.을 사용하다

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place

간단히 말해, 분리된 HEAD 상태는 어떤 지점의 HEAD(또는)로도 체크아웃되지 않음을 의미합니다.

예를 들어 이해하다

대부분의 경우 브랜치는 다음과 같은 여러 커밋의 시퀀스입니다.

커밋 1: master--> branch_HEAD(123be6a76168aca712aea16076e971c23835f8ca)

커밋 2: 마스터-->123be6a76168aca712aea16076e971c23835f8ca--> branch_HEAD(100644a76168aca712aea16076e971c238f8ca)

위에서 보듯이 커밋 시퀀스의 경우 브랜치는 최신 커밋을 가리킵니다.따라서 이 경우 123be6a76168aca712aea16076e971c23835f8ca를 커밋하기 위해 체크아웃을 하면 브랜치 헤드가 100644a76168aca712aea16076e971c23835f8ca를 가리키기 때문에 분리 헤드 상태가 됩니다.따라서 분리된 HEAD 상태에 있습니다.

이론적 설명

이 블로그에서는 Git 저장소는 Tree of Commits(커밋 트리)라고 명시하고 있습니다.각 커밋 포인터는 갱신되어 각 브랜치에 대한 포인터는 .git/refs 서브 디렉토리에 저장됩니다.태그는 .git/refs/tag에 저장되며 브랜치는 .git/refs/heads에 저장됩니다.파일 중 하나를 보면 각 태그가 40자의 커밋 해시를 가진 단일 파일에 대응하고 있다는 것을 알 수 있습니다.위의 @Chris Johnsen과 @Yaroslav Nikitenco에서 설명한 바와 같이 이러한 참조를 확인할 수 있습니다.

가장 간단한 해결책은 새로운 지점을 만드는 것입니다.

git checkout -b new-branch-name

명령어로 커밋 로그를 확인합니다.

git log

모든 것이 일치하는 경우 :q까지 종료합니다.

이제 명령으로 모든 변경 내용을 새 브랜치에 푸시합니다.

git push --set-upstream origin new-branch-name

이제 문제가 해결되고 로컬 GIT HEAD가 새로운 브랜치에 연결되면 포털에서 풀 요청을 제기할 수 있습니다.

내가 정말 바보 같은 상태에 빠졌어. 다른 사람이 이걸 유용하게 여길지 의심스럽지만…. 하지만 만약을 위해.

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

내가 결국 고친 건

git push origin :HEAD

이것은 나에게 완벽하게 작용했다.

1.git stash 내용을 하기 위해 합니다.


git clean -df
git checkout -- .
되지 않은 모든 파일을 .언급된 않지만 할 수 ). 비스테이지 변경을 .clean.clean clean은 "Clean"을 참조하십시오. git checkout (체크 아웃)

2.git checkout master하다(주인을함)
3.git pull
4.git status 보이는지

On branch master
Your branch is up-to-date with 'origin/master'.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.git status작업 디렉토리에 추적되지 않은 파일이 몇 개 있었습니다.

리베이스 작업을 하려면 (필요없어서) 청소만 하면 됩니다.

Eclipse에서 EGit을 사용하는 경우: 마스터가 주요 개발 지점이라고 가정합니다.

  • 브랜치(통상은 새로운 브랜치)로의 변경을 커밋합니다.
  • 리모콘에서 꺼냅니다.
  • 다음으로 프로젝트 노드를 오른쪽 클릭하여 [팀]를 선택하고 [이력 표시]를 선택합니다.
  • 그런 다음 마스터를 마우스 오른쪽 버튼으로 클릭하고 체크아웃을 선택합니다.
  • Eclipse가 알려준 경우 마스터가 두 개 있습니다. 하나는 로컬이고 하나는 리모트입니다.

그 후 origin-master에 재접속할 수 있습니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★변경 내용을 저장하다git stash한 후, 「」(이것이 원인이라고 생각됩니다), 「」, 「」, 「」, 「」, 「」를 실행했습니다.git pull잊지 마세요git stash apply변경을 다시 받을 수 있습니다.

git checkout checksum  # You could use this to peek previous checkpoints
git status # You will see HEAD detached at checksum
git checkout master # This moves HEAD to master branch

언급URL : https://stackoverflow.com/questions/5772192/how-can-i-reconcile-detached-head-with-master-origin

반응형