Git의 브랜치


weather-app 구축 중간에 5일 날씨 예보 기능을 추가해보고 싶습니다. 제대로 작동하기까지 몇 개의 커밋이 필요할 수 있으며, 그때까지는 미완성 코드가 이미 작동하는 앱 옆에 있고 싶지 않습니다. 브랜치는 Git이 이를 해결하는 방법입니다. 실험이 진행되는 별도의 작업 라인이며, main은 시작하기 전과 정확히 같은 방식으로 계속 작동합니다.
브랜치가 실제로 무엇인지
실제 작동 모습은 다음과 같습니다:
$ git branch forecast
$ git switch forecast
Switched to branch 'forecast'두 가지 명령: 첫 번째는 forecast라는 새 브랜치를 생성하고, 두 번째는 그 브랜치로 이동합니다. 여기서부터 forecast에서 만드는 모든 커밋은 forecast에 저장되고 main은 정확히 그 위치에 남아 있습니다.
**브랜치**는 커밋을 가리키는 이동 가능한 레이블입니다. 지금 main과 forecast 모두 같은 커밋을 가리키고 있으며, 이는 git branch forecast를 실행할 때 서있던 커밋입니다. forecast에서 다시 커밋하는 순간 그 레이블은 새 커밋으로 앞으로 이동합니다. main은 직접 전환하고 거기서 커밋할 때까지 정확히 그 위치에 남아 있습니다.
git branch로 두 레이블을 모두 볼 수 있습니다:
$ git branch
forecast
* main별표는 현재 위치한 브랜치를 표시합니다. 브랜치는 단지 커밋을 가리키는 이름일 뿐입니다. 이것이 전체 메커니즘입니다. 이 장의 나머지 모든 내용은 그 레이블을 이동시키는 변형입니다.
git branch forecast는 현재 커밋을 가리키는 새 레이블을 생성하고, git switch forecast는 그 레이블로 이동시킵니다. 실제로 거기서 커밋할 때까지 파일에 대해 아무것도 변경되지 않습니다. 나는 브랜치를 커밋에 붙인 포스트잇으로 생각하기 좋아합니다: 추가하기 쉽고, 이동하기 쉽고, 끝났을 때 벗기기 쉽습니다. 브랜치 생성 및 전환
git branch forecast는 단독으로 레이블을 생성하지만 거기로 이동시키지는 않습니다. 대부분의 경우 둘 다 원하므로 git switch에는 바로가기가 있습니다:
$ git switch -c forecast
Switched to a new branch 'forecast'-c는 "create"를 의미합니다. git switch -c는 브랜치를 생성하고 그 브랜치로 이동합니다. 그 단일 명령이 새 작업을 거의 매번 시작할 때 사용하는 것입니다.
브랜치를 전환하면 파일이 표시하는 스냅샷이 변경됩니다. 시도해보세요. 아래의 echo 줄은 새 파일 src/forecast.js를 한 줄의 내용으로 생성하는 한 단계 방식이며, 나머지는 이미 알고 있는 명령입니다:
$ git switch forecast
$ echo "// five-day forecast logic" > src/forecast.js
$ git add src/forecast.js
$ git commit -m "Start forecast module"
$ ls src
forecast.js index.js
$ git switch main
Switched to branch 'main'
$ ls src
index.js파일이 사라진 것이 아닙니다. forecast 브랜치에 있으며, main 브랜치의 스냅샷에는 절대 포함되지 않았습니다. forecast로 다시 전환하면 정확히 그대로 다시 나타납니다.
git switch -c forecast는 한 단계로 브랜치를 생성하고 이동시키며, 거의 매번 사용할 것입니다. 브랜치를 전환하면 표시되는 파일 버전이 바뀌므로 한 브랜치에 추가된 파일은 다시 전환할 때까지 다른 브랜치에는 없습니다. 아무것도 손실되지 않으며, 다른 브랜치에 주차되어 있습니다. HEAD와 detached HEAD
Git은 **HEAD**라는 마커로 현재 위치를 추적합니다. 일반적으로 HEAD는 현재 브랜치를 가리키고, 그 브랜치는 커밋을 가리키므로 전환하거나 커밋할 때마다 HEAD는 자동으로 이동합니다. 브랜치 이름 대신 특정 커밋을 해시로 또는 태그(종종 릴리스를 표시하는 한 커밋에 고정된 레이블)로 체크아웃하면, HEAD는 그 브랜치 레이블 대신 그 하나의 커밋에 직접 첨부됩니다. 이 상태를 detached HEAD라고 합니다.
거기서 자유롭게 둘러볼 수 있으며, 심지어 커밋할 수도 있지만, 그 새 커밋은 아무것도 이름으로 가리키지 않습니다. 먼저 브랜치를 생성하지 않고 브랜치로 전환하면 다시 찾기 어려워집니다.
$ git switch a1b2c3d
HEAD is now at a1b2c3d Add password strength meter그 메시지 "HEAD is now at"은 Git이 브랜치 영역을 떠나 HEAD를 단일 커밋에 첨부했음을 알려주는 것입니다.
여기서 갈 곳
이제 브랜치를 생성하고, 그 사이를 이동하고, main이 다른 곳에서 실험하는 동안 터치되지 않은 상태로 유지되는 방식을 보았습니다. 다음 질문은 브랜치의 작업이 main으로 어떻게 돌아가는지이며, 이것이 정확히 병합 및 충돌이 다루는 내용입니다. 이동하기 전에 커밋 이력을 읽는 것에 대한 복습을 원하면 이력은 git log, git show, 및 git diff를 통해 설명합니다.

