Git에서 헤드 다시 연결
Git 리포지토리는 개체 및 참조 그룹으로 정의할 수 있습니다. 분기는 작업을 표시하는 데 사용하는 개체입니다. Git은 또한 특정 분기의 커밋을 참조하는 태그도 처리합니다.
커밋
은 특정 시점에 사용된 소스 코드의 상태일 가능성이 높습니다. commit
은 부모와 Git, 그리고 커밋을 만든 사람과 만든 시기에 대한 전체 데이터로 구성됩니다. Commits
는 분기의 개체로 저장소에 배치됩니다.
HEAD
참조는 현재 분기의 최신 마지막 커밋을 가리킵니다. HEAD
포인터는 현재 체크아웃된 분기에 대한 참조이며 분기의 상단을 가리킵니다.
그러나 지점을 확인하지 않고 시간을 되돌릴 수 있습니다. HEAD
포인터를 사용하여 분기의 커밋을 가져온 다음 인덱스를 사용하여 파일의 모든 버전을 쉽게 가져올 수 있습니다.
HEAD
포인터와 인덱스 포인터를 사용하여 Git에서 분리된 HEAD
상태라고 하는 특정 커밋에 대한 체크아웃
을 수행할 수 있습니다. 또한 특정 커밋을 체크아웃하고 브랜치의 특정 커밋을 기반으로 새 브랜치를 생성할 수 있습니다.
블루문에서 한 번만 하면 문제가 되지 않습니다. 그러나 우리가 그것을 많이 반복한다면, 우리는 곧 우리가 작업하고 있던 그 브랜치로 돌아가는 방법을 궁금해하기 시작할 것입니다.
솔루션은 매우 간단합니다. 브랜치를 체크아웃하기 전에 git checkout master
명령을 사용해야 합니다. 이 명령은 커밋이 완료되기 전에 작업 중이던 분기로 돌아가지만 체크아웃 중인 커밋에는 영향을 미치지 않습니다.
깨끗한 솔루션은 패치 시리즈를 보관하는 데 전념하는 새로운 Git 리포지토리를 설정하고 다른 사람들이 언제든지 최신 분기를 가져올 수 있도록 하는 것입니다.
이러한 상황은 분리된 HEAD를 구현하는 데 따른 유용성과 성능 비용이 이점을 능가할 정도로 드물기 때문에 현재 Git에는 이 기능이 없습니다. Git은 커밋을 수정할 수 있습니다. 그러나 분리된 HEAD의 마지막 커밋을 수정하는 것은 불가능합니다.
Git은 비밀 브랜치를 생성하고 해당 브랜치에 커밋 데이터를 기록한 다음 HEAD
에서 영구적으로 커밋을 삭제하여 커밋을 영구적으로 삭제하는 방법이 있습니다. 그러나 이 기능은 HEAD
에서 단일 커밋이 분리된 동안에만 사용할 수 있습니다. 커밋에 부모가 여러 개인 경우 해당 분기에서 삭제할 수 없습니다.
Git에서 분리된 헤드
그러나 다른 지점으로 전환하면 상황이 달라집니다. 작업 디렉토리를 체크아웃하면 HEAD
로 업데이트되고 더 이상 그 안에 있는 파일을 수정할 수 없으며, 전환한 분기와 충돌하지 않는 경우 새 변경 사항을 생성할 수 있습니다.
이 경우 HEAD
는 현재 분기에서 분리됩니다. 동시에 git checkout
명령을 사용하여 작업 디렉토리를 HEAD
로 업데이트하지 않고 분기를 변경할 수 있으므로 HEAD
가 첨부됨과 동시에 분리될 수 있습니다.
상당히 혼란스럽긴 하지만 작업 디렉토리를 빠르게 건드리지 않고 브랜치 사이를 전환하거나 다른 브랜치로 전환하면서 동시에 새 작업 디렉토리를 체크아웃하려는 경우 유용할 수 있습니다. 이를 위해 git checkout -b <newbranchname> <commit>
을 사용할 수 있습니다.
우리는 이렇게 할 수 있습니다. 우리가 원하는 지점을 확인하십시오.
$ git checkout <branch>
예를 들어:
$ git checkout master
작업 중인 변경 사항을 유지하려면 새 분기를 만들거나 변경 사항을 분기에 숨겨야 합니다. 우리 브랜치 중 하나의 이름이 될 수 없는 최근 커밋의 모든 체크아웃
은 분리된 HEAD를 제공합니다.
HEAD
가 분리되면 명명된 분기가 업데이트되지 않는 것을 제외하고 커밋이 정상적으로 보입니다. 알 수 없는 가지와 같습니다. 예를 들어 원격 브랜치를 먼저 추적하기 전에 체크아웃하면 다음과 같이 말할 수 있습니다. 결국 우리는 분리된 HEAD
로 끝날 것입니다.
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn