Git 교과서

코드 이력, 하나도 놓치지 마라!

버전 관리 시스템의 이해와 설치부터 커밋, 브랜치, 임시 처리, 병합, 복귀, 서브모듈, 태그까지
깃, 소스트리, 깃허브로 실습하며 기본기를 탄탄하게 다진다!

Yes24 교보문고 알라딘 인터파크 길벗

브랜치 이동


브랜치를 생성했다고 해서 자동으로 생성된 브랜치로 이동하지는 않습니다. 이번에는 생성된 브랜치 간 작업 영역을 이동하는 방법을 알아봅시다.


체크아웃


호텔에서 퇴실할 때 체크아웃이라는 말을 합니다. 체크아웃은 객실을 비우고 떠나는 것을 의미합니다. 즉, 현재 브랜치를 떠나 새로운 브랜치로 들어간다는 의미입니다. 깃에서 브랜치 간 이동할 때는 checkout 명령어를 사용합니다.

$ git checkout 브랜치이름

checkout 명령어로 브랜치 간 이동하면서 실습해 보겠습니다. 주의할 점은 깃은 하나의 워킹 디렉터리만 가지고 있다는 것입니다. 워킹 디렉터리는 선택한 브랜치 하나만 연결되어 있습니다. 즉, 한 브랜치에서만 작업과 커밋을 할 수 있습니다. 따라서 다른 브랜치에서 작업하려면 반드시 브랜치를 변경하여 워킹 디렉터리를 재설정해야 합니다.

Note: 워킹 디렉터리에 커밋하지 않은 내용이 있다면 브랜치를 변경할 수 없습니다. 이와 관련된 내용은 7장에서 설명합니다.

checkout 명령어를 사용하여 footer 브랜치로 변경해 봅시다.

infoh@DESKTOP-MINGW64 /e/gitstudy06 (feature)
$ git checkout footer
Switched to branch 'footer'
infoh@DESKTOP MINGW64 /e/gitstudy06 (footer)

현재 브랜치는 feature입니다. 체크아웃하면 “Switched to branch ‘footer’ ” 메시지가 출력됩니다. footer 브랜치로 변경했다는 의미입니다. 그리고 깃 배시에서도 변경된 브랜치 이름(footer)을 출력합니다.

깃의 체크아웃은 거의 순간적으로 실행됩니다. 깃은 빠르게 포인터를 이용하여 빠르게 브랜치를 이동할 수 있는 것이 장점입니다.

다시 브랜치 목록을 확인합니다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (footer)
$ git branch -v
  feature d84766c first
* footer  d84766c first
  master  d84766c first

별표(*)가 footer 브랜치 이름 앞으로 변경된 것을 확인할 수 있습니다.
체크아웃은 브랜치 외에 특정 커밋이나 파일로도 할 수 있습니다.

$ git checkout 브랜치 ☜ 브랜치로 체크아웃
$ git checkout -- 파일명 ☜ 파일로 체크아웃

Note: 이중 대시(--)를 사용하면 파일 이름을 정확히 지정하여 브랜치를 변경할 수 있습니다. 이렇게 하면 깃의 다른 옵션 명령어와 혼동하지 않습니다.


브랜치 동작 원리


checkout 명령어로 브랜치가 변경되면 깃은 내부적으로 몇 가지 동작을 수행합니다.

  • HEAD 정보는 항상 변경된 브랜치의 마지막 커밋을 가리킵니다. 이처럼 HEAD가 브랜치의 마지막 커밋을 의미하기 때문에 브랜치가 이동하면 HEAD 포인터도 함께 이동합니다.

  • 변경된 브랜치로 새로운 작업을 할 수 있도록 워킹 디렉터리를 변경합니다. 브랜치를 변경하려면 기존 브랜치의 워킹 디렉터리를 정리해야 합니다. 기존 브랜치의 워킹 디렉터리를 정리하지 않고서는 브랜치를 변경할 수 없습니다.


소스트리


소스트리에서 브랜치를 변경해 볼까요? 소스트리의 왼쪽에서 변경하고 싶은 브랜치를 선택합니다. 필자는 master 브랜치를 선택하겠습니다. 브랜치를 선택한 상태에서 마우스 오른쪽 버튼을 누릅니다. 다음 화면이 나오면 체크아웃 master… 메뉴를 선택하여 master 브랜치로 변경합니다.

그림 6-8] master 브랜치로 체크아웃
master 브랜치로 체크아웃

master 브랜치로 변경되면 master 브랜치 앞에 ○ 마크가 이동합니다.

그림 6-9] master 브랜치 선택
master 브랜치 선택


이전 브랜치


브랜치를 이동하려면 브랜치 이름을 적어 주어야 합니다. 하지만 새로운 브랜치가 아닌 이전 브랜치로 좀 더 편하게 이동할 수 있는 방법이 있습니다. 대시(-)를 사용하는 방법입니다. 리눅스에서 대시(-) 기호는 이전 디렉터리를 의미합니다. 이 대시를 사용하여 쉽게 이전 브랜치로 이동할 수 있습니다.

$ git checkout -

깃 배시에서 git branch -v 명령어를 다시 실행하면 master 브랜치로 변경된 것을 확인할 수 있습니다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git branch -v
  feature d84766c first
  footer d84766c first
* master d84766c first

master 브랜치에서 이전 footer 브랜치로 돌아갑시다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git checkout -
Switched to branch 'footer'
infoh@DESKTOP MINGW64 /e/gitstudy06 (footer)

이전 브랜치인 footer 브랜치로 되돌아간 것을 확인할 수 있습니다.


워킹 디렉터리 정리


체크아웃을 사용하여 브랜치를 이동할 때는 주의 사항이 있습니다. 현재 작업하고 있는 워킹 디렉터리를 정리하고 넘어가야 합니다.

브랜치 동작 원리에서 브랜치가 변경되면 워킹 디렉터리도 같이 변환된다고 했습니다. 따라서 워킹 디렉터리 안에서 작성하던 내용이 있고, 커밋을 하지 않았다면 체크아웃할 때 경고가 발생합니다.

그럼 master 브랜치에서 코드를 수정해 봅시다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (footer)
$ git checkout master
Switched to branch 'master'

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ code branch.htm

branch.htm

<h1>브랜치 실습을 합니다.</h1>
<h2>마스터 워킹 디렉터리 작업 중</h2>

저장은 하지만 커밋은 하지 않습니다. status 명령어로 확인해 볼까요?

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   branch.htm ☜ 워킹 디렉터리 수정 상태
no changes added to commit (use "git add" and/or "git commit -a")

현재의 상태에서 브랜치를 변경해 봅시다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git checkout footer
Switched to branch 'footer'
M       branch.htm ☜ 워킹 디렉터리 수정 상태

브랜치를 체크아웃하여 새로운 메시지가 하나 더 추가되었습니다. branch.htm 파일이 수정된 상태라는 의미입니다. 워킹 디렉터리에서 작업하다 커밋하지 않고 남겨 둔 상태에서 다른 브랜치로 체크아웃하면 이처럼 브랜치 이동이 제한됩니다. 깃은 향후 충돌을 방지하려고 워킹 디렉터리에 작업이 남아 있다면 경고 메시지를 보여 주고 브랜치를 변경할 수 없게 제한합니다.

footer 브랜치는 master 브랜치를 기준으로 생성한 후 별도로 추가 작업을 하지 않았기 때문에 브랜치 생성 당시 master의 dcdb1c1 커밋을 가리킵니다. 아직 브랜치 2개가 가리키는 커밋 위치는 같습니다.

브랜치 간에 정상적으로 이동하려면 남아 있는 작업들을 정리해 주어야 합니다. 이전으로 돌아가 수정된 내용을 커밋합니다.

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git checkout - ☜ master로 이동
Switched to branch 'master'
M       branch.htm

infoh@DESKTOP MINGW64 /e/gitstudy06 (master)
$ git commit -am "master working..." ☜ 커밋, 워킹 디렉터리 정리
[master 9ca05fb] master working...
 1 file changed, 2 insertions(+), 1 deletion(-)

infoh@DESKTOP MINGW64 /e/gitstudy06 (footer)
$ git checkout footer
Switched to branch 'footer'

작업된 워킹 디렉터리를 커밋하지 않고 브랜치를 변경할 때는 스태시 기능을 이용하면 좋습니다.