학습 자료

브랜치란 무엇인가 — 원본은 그대로 두고 딴 데서 해봅니다


Article

살다 보면 "그때 다른 선택을 했으면 어땠을까" 하고 상상할 때가 있습니다. 다른 학교에 갔다면, 그 회사에 안 갔다면. 상상 속에서는 뭘 해도 안전합니다. 지금 살고 있는 삶은 하나도 안 망가지니까요.

브랜치가 정확히 그겁니다. 지금 이 지점에서 세계를 하나 더 만들어 두고, 거기서 실컷 해봅니다. 잘되면 가져오고, 망했으면 그 세계를 통째로 버립니다. 이쪽 세계는 처음부터 아무 일도 없었습니다.

지난 스무 강 동안 우리는 한 줄기로만 달렸습니다. 혼자 하니까 그래도 됐습니다. 그런데 사람이 둘만 되어도 이 방식은 바로 무너집니다. Part 5 는 그 이야기입니다.

한 줄기에서 갈라진다
  • master — 지금까지 온 줄기커밋 여러 개가 쌓여 있다
    • master 가 계속 간다손대지 않으면 그 자리 그대로
    • hello — 오늘 만들 가지여기서 뭘 하든 왼쪽은 모른다
갈라지는 지점은 '가지를 만든 그 순간의 커밋' 이다. 그 전까지의 기록은 양쪽이 똑같이 물려받는다

폴더를 복사하는 것과 뭐가 다른가

원본을 지키고 싶을 때 사람들이 실제로 제일 많이 하는 일이 있습니다. 폴더를 통째로 복사해서 프로젝트_복사본 을 만드는 겁니다. 1강에서 봤던 보고서_최종_최종2 와 같은 습관입니다.

폴더 복사 vs 브랜치

폴더를 복사한다

  • 디스크에 폴더가 하나 더 생긴다
  • 어느 쪽이 최신인지 곧 헷갈린다
  • 합칠 때 파일을 눈으로 비교해야 한다
  • 복사본에서 한 작업은 기록이 없다

브랜치를 만든다

  • 폴더는 하나뿐이다. 깃이 내용을 갈아 끼운다
  • 지금 어느 세계에 있는지 명령 하나로 확인된다
  • 합치는 것은 22강에서 명령 하나로 한다
  • 가지마다 커밋 기록이 따로 남는다
결과는 비슷해 보여도, 되돌리고 합치는 단계에서 차이가 완전히 벌어진다

지금 어느 가지에 있는지 봅니다

작업 폴더에서 명령 하나면 됩니다.

터미널
  • $ git branch
  • * master

가지가 하나뿐이라 한 줄만 나옵니다. 앞의 *지금 여기 있다는 표시입니다.

master 라는 이름은 5강에서 git init 을 쳤을 때 깃이 알아서 지어준 첫 가지입니다. 14강에서 이름 이야기를 잠깐 하고 넘어갔었습니다. 특별한 가지가 아니라 그냥 제일 먼저 생긴 가지입니다. 다만 관습적으로 이 가지를 "정상 상태" 로 취급합니다.

가지가 많아져서 목록이 화면을 넘어가면 아래에 : 만 깜빡이는 상태가 됩니다. 7강에서 git log 를 봤을 때와 같은 화면입니다. q 를 누르면 빠져나옵니다.

가지를 만들고 그리로 옮깁니다

가지 하나 만들어 보기
  1. 01

    작업 폴더로 들어갑니다

    cd ~/Desktop/git-study
  2. 02

    가지를 만들면서 그리로 옮깁니다

    -c 는 만든다(create)는 뜻입니다. 만들기와 이동이 한 번에 됩니다

    git switch -c hello
  3. 03

    정말 옮겨졌는지 확인합니다

    git branch
  4. 04

    git status 로도 확인해 봅니다

    맨 윗줄에 지금 있는 가지 이름이 나옵니다

    git status
가지 이름은 자유다. 다만 띄어쓰기는 쓰지 않는다. 여러 단어면 하이픈으로 잇는다
터미널
  • $ git switch -c hello
  • Switched to a new branch 'hello'
  • $ git branch
  • * hello
  • master

*hello 로 옮겨갔습니다. 평행 세계로 넘어온 겁니다. 그런데 폴더를 열어보면 아무것도 안 변했습니다. 당연합니다. 방금 갈라졌으니 두 세계는 아직 완전히 같은 상태입니다.

여기서 고쳐도 저쪽은 모릅니다

오늘의 핵심입니다. hello 가지에서 README.md 를 고치고 커밋합니다.

한 줄 고치고 커밋합니다
  1. 01

    README.md 를 열어 아무 줄이나 하나 더합니다

    - 브랜치 연습 중 정도면 충분합니다. 저장합니다

  2. 02

    담고 커밋합니다

    git add README.md
    git commit -m "브랜치 연습 문구 추가"
  3. 03

    master 로 돌아갑니다

    -c 를 빼면 이미 있는 가지로 이동입니다

    git switch master
  4. 04

    README.md 를 다시 열어봅니다

    여기가 오늘 제일 중요한 순간입니다

명령을 다 친 뒤가 아니라, 마지막 단계에서 파일을 직접 열어 눈으로 봐야 한다
터미널
  • $ git switch master
  • Switched to branch 'master'
  • Your branch is up to date with 'origin/master'.
  • $ cat README.md
  • # 내 첫 저장소
  • (방금 더한 줄이 없다)

방금 더한 줄이 사라졌습니다. 지운 게 아닙니다. master 세계에는 그런 일이 없었던 겁니다.

git switch hello 로 다시 넘어가면 그 줄이 그대로 있습니다. 폴더는 처음부터 끝까지 하나였는데, 깃이 가지를 옮길 때마다 파일 내용을 그 세계의 상태로 갈아 끼운 겁니다.

왜 이렇게까지 하나

혼자 연습하는 지금은 솔직히 번거롭습니다. 그냥 master 에서 고치면 될 것 같습니다. 그런데 사람이 둘만 되어도 이야기가 달라집니다.

master 에서 바로 고치면 벌어지는 일
  1. 내가 master 를 고친다아직 다 만들다 만 상태
  2. 그대로 push 한다창고에 반쯤 만든 것이 올라간다
  3. 옆 사람이 pull 한다내 미완성이 남의 컴퓨터로 넘어간다
  4. 둘 다 멈춘다내 실수 하나로 팀이 선다
그래서 실무에서는 master 를 함부로 건드리지 않는다. 늘 가지를 하나 쳐서 거기서 작업한다

master언제 봐도 정상으로 도는 상태로 두는 게 약속입니다. 새 작업은 가지를 쳐서 거기서 하고, 다 되고 확인까지 끝난 다음에 합칩니다.

그럼 "다 됐는지 누가 확인하나" 하는 질문이 남습니다. 그게 Pull Request 고, 24강에서 다룹니다. 오늘은 갈라놓는 것까지만 합니다.

오늘 쓴 명령 전부
명령하는 일
git branch가지 목록을 본다. * 가 지금 자리
git switch -c 이름가지를 만들면서 그리로 옮긴다
git switch 이름이미 있는 가지로 옮긴다
git status맨 윗줄에 지금 가지 이름이 나온다
네 개뿐이다. 합치는 명령과 지우는 명령은 22강에서 더한다

만든 가지는 아직 깃허브에 없습니다

hello 가지는 지금 내 컴퓨터에만 있습니다. 깃허브에 가서 저장소를 봐도 안 보입니다. 19강에서 잔디가 push 한 것만 센다고 한 것과 같은 이야기입니다. 깃허브는 올라온 것만 압니다.

가지를 깃허브로 올리는 일은 24강에서 필요해집니다. 그때 push 명령이 조금 달라집니다. 지금 미리 외울 필요는 없습니다.

정리하면

  • 브랜치는 지금 지점에서 갈라진 평행 세계입니다. 거기서 무엇을 해도 원래 가지는 그대로입니다
  • 폴더 복사와 결과는 비슷해 보이지만, 되돌리고 합치는 단계에서 완전히 달라집니다
  • git branch 로 목록을 봅니다. * 가 붙은 것이 지금 있는 자리입니다
  • git switch -c 이름 은 만들면서 이동, git switch 이름 은 이미 있는 가지로 이동입니다
  • 가지를 옮기면 폴더 안 파일 내용이 그 세계의 상태로 바뀝니다. 폴더는 끝까지 하나입니다
  • 그래서 파일이 사라진 것처럼 보이는데, 잃은 게 아닙니다. 다시 옮겨가면 그대로 있습니다
  • 옮기기 전에 커밋부터 합니다. 커밋 안 한 변경분은 따라옵니다
  • master 는 늘 정상으로 도는 상태로 둡니다. 새 작업은 가지를 쳐서 합니다
  • checkoutswitch 의 옛 이름이라고 읽으면 됩니다
  • 만든 가지는 아직 내 컴퓨터에만 있습니다

다음 22강에서는 갈라놓은 것을 합칩니다. hello 에서 한 작업을 master 로 가져오는 merge 를 봅니다. 그리고 다 쓴 가지를 지웁니다. 가지는 쌓아두는 게 아니라 쓰고 버리는 것이라는 감각을 거기서 잡습니다. 합치는 게 늘 순순히 되는 건 아닌데, 순순히 안 되는 경우는 23강에서 일부러 만들어 봅니다.

브랜치란 무엇인가 — 원본은 그대로 두고 딴 데서 해봅니다 — 디코드랩(DCODELAB)