브랜치란 무엇인가 — 원본은 그대로 두고 딴 데서 해봅니다
Article
살다 보면 "그때 다른 선택을 했으면 어땠을까" 하고 상상할 때가 있습니다. 다른 학교에 갔다면, 그 회사에 안 갔다면. 상상 속에서는 뭘 해도 안전합니다. 지금 살고 있는 삶은 하나도 안 망가지니까요.
브랜치가 정확히 그겁니다. 지금 이 지점에서 세계를 하나 더 만들어 두고, 거기서 실컷 해봅니다. 잘되면 가져오고, 망했으면 그 세계를 통째로 버립니다. 이쪽 세계는 처음부터 아무 일도 없었습니다.
지난 스무 강 동안 우리는 한 줄기로만 달렸습니다. 혼자 하니까 그래도 됐습니다. 그런데 사람이 둘만 되어도 이 방식은 바로 무너집니다. Part 5 는 그 이야기입니다.
master— 지금까지 온 줄기master가 계속 간다hello— 오늘 만들 가지
폴더를 복사하는 것과 뭐가 다른가
원본을 지키고 싶을 때 사람들이 실제로 제일 많이 하는 일이 있습니다. 폴더를 통째로 복사해서 프로젝트_복사본 을 만드는 겁니다. 1강에서 봤던 보고서_최종_최종2 와 같은 습관입니다.
폴더를 복사한다
- 디스크에 폴더가 하나 더 생긴다
- 어느 쪽이 최신인지 곧 헷갈린다
- 합칠 때 파일을 눈으로 비교해야 한다
- 복사본에서 한 작업은 기록이 없다
브랜치를 만든다
- 폴더는 하나뿐이다. 깃이 내용을 갈아 끼운다
- 지금 어느 세계에 있는지 명령 하나로 확인된다
- 합치는 것은 22강에서 명령 하나로 한다
- 가지마다 커밋 기록이 따로 남는다
지금 어느 가지에 있는지 봅니다
작업 폴더에서 명령 하나면 됩니다.
- $ git branch
- * master
가지가 하나뿐이라 한 줄만 나옵니다. 앞의 * 가 지금 여기 있다는 표시입니다.
master 라는 이름은 5강에서 git init 을 쳤을 때 깃이 알아서 지어준 첫 가지입니다. 14강에서 이름 이야기를 잠깐 하고 넘어갔었습니다. 특별한 가지가 아니라 그냥 제일 먼저 생긴 가지입니다. 다만 관습적으로 이 가지를 "정상 상태" 로 취급합니다.
가지가 많아져서 목록이 화면을 넘어가면 아래에 : 만 깜빡이는 상태가 됩니다. 7강에서 git log 를 봤을 때와 같은 화면입니다. q 를 누르면 빠져나옵니다.
가지를 만들고 그리로 옮깁니다
- 01
작업 폴더로 들어갑니다
cd ~/Desktop/git-study - 02
가지를 만들면서 그리로 옮깁니다
-c는 만든다(create)는 뜻입니다. 만들기와 이동이 한 번에 됩니다git switch -c hello - 03
정말 옮겨졌는지 확인합니다
git branch - 04
git status로도 확인해 봅니다맨 윗줄에 지금 있는 가지 이름이 나옵니다
git status
- $ git switch -c hello
- Switched to a new branch 'hello'
- $ git branch
- * hello
- master
* 가 hello 로 옮겨갔습니다. 평행 세계로 넘어온 겁니다. 그런데 폴더를 열어보면 아무것도 안 변했습니다. 당연합니다. 방금 갈라졌으니 두 세계는 아직 완전히 같은 상태입니다.
여기서 고쳐도 저쪽은 모릅니다
오늘의 핵심입니다. hello 가지에서 README.md 를 고치고 커밋합니다.
- 01
README.md를 열어 아무 줄이나 하나 더합니다- 브랜치 연습 중정도면 충분합니다. 저장합니다 - 02
담고 커밋합니다
git add README.md git commit -m "브랜치 연습 문구 추가" - 03
master로 돌아갑니다-c를 빼면 이미 있는 가지로 이동입니다git switch master - 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 에서 바로 고치면 벌어지는 일- 내가
master를 고친다아직 다 만들다 만 상태 - 그대로 push 한다창고에 반쯤 만든 것이 올라간다
- 옆 사람이
pull한다내 미완성이 남의 컴퓨터로 넘어간다 - 둘 다 멈춘다내 실수 하나로 팀이 선다
master 는 언제 봐도 정상으로 도는 상태로 두는 게 약속입니다. 새 작업은 가지를 쳐서 거기서 하고, 다 되고 확인까지 끝난 다음에 합칩니다.
그럼 "다 됐는지 누가 확인하나" 하는 질문이 남습니다. 그게 Pull Request 고, 24강에서 다룹니다. 오늘은 갈라놓는 것까지만 합니다.
| 명령 | 하는 일 |
|---|---|
git branch | 가지 목록을 본다. * 가 지금 자리 |
git switch -c 이름 | 가지를 만들면서 그리로 옮긴다 |
git switch 이름 | 이미 있는 가지로 옮긴다 |
git status | 맨 윗줄에 지금 가지 이름이 나온다 |
만든 가지는 아직 깃허브에 없습니다
hello 가지는 지금 내 컴퓨터에만 있습니다. 깃허브에 가서 저장소를 봐도 안 보입니다. 19강에서 잔디가 push 한 것만 센다고 한 것과 같은 이야기입니다. 깃허브는 올라온 것만 압니다.
가지를 깃허브로 올리는 일은 24강에서 필요해집니다. 그때 push 명령이 조금 달라집니다. 지금 미리 외울 필요는 없습니다.
정리하면
- 브랜치는 지금 지점에서 갈라진 평행 세계입니다. 거기서 무엇을 해도 원래 가지는 그대로입니다
- 폴더 복사와 결과는 비슷해 보이지만, 되돌리고 합치는 단계에서 완전히 달라집니다
git branch로 목록을 봅니다.*가 붙은 것이 지금 있는 자리입니다git switch -c 이름은 만들면서 이동,git switch 이름은 이미 있는 가지로 이동입니다- 가지를 옮기면 폴더 안 파일 내용이 그 세계의 상태로 바뀝니다. 폴더는 끝까지 하나입니다
- 그래서 파일이 사라진 것처럼 보이는데, 잃은 게 아닙니다. 다시 옮겨가면 그대로 있습니다
- 옮기기 전에 커밋부터 합니다. 커밋 안 한 변경분은 따라옵니다
master는 늘 정상으로 도는 상태로 둡니다. 새 작업은 가지를 쳐서 합니다checkout은switch의 옛 이름이라고 읽으면 됩니다- 만든 가지는 아직 내 컴퓨터에만 있습니다
다음 22강에서는 갈라놓은 것을 합칩니다. hello 에서 한 작업을 master 로 가져오는 merge 를 봅니다. 그리고 다 쓴 가지를 지웁니다. 가지는 쌓아두는 게 아니라 쓰고 버리는 것이라는 감각을 거기서 잡습니다. 합치는 게 늘 순순히 되는 건 아닌데, 순순히 안 되는 경우는 23강에서 일부러 만들어 봅니다.