학습 자료

브랜치 합치기 — 갈라놓은 것을 다시 하나로


Article

여행을 다녀오면 마지막에 할 일이 하나 남습니다. 가방을 풀어서 짐을 원래 자리에 돌려놓는 겁니다. 옷은 옷장에, 세면도구는 화장실에. 다 풀고 나면 가방은 비어 있고, 비어 있는 가방은 접어서 넣어둡니다. 가방을 거실 한가운데 그대로 두고 사는 사람은 없습니다.

21강에서 만든 hello 가지가 지금 그 가방입니다. 안에 작업이 하나 들어 있는데, 아직 master 쪽에는 없습니다. 오늘은 그 짐을 풀어서 master 로 옮기고, 빈 가방을 정리합니다.

명령은 두 개뿐입니다. 합치는 merge 와 지우는 branch -d.

오늘 하는 일
  1. master 로 돌아간다받을 쪽에 먼저 가 있어야 한다
  2. git merge hello가지에 있던 작업이 넘어온다
  3. 결과를 확인한다파일을 열어보고 기록을 본다
  4. hello 를 지운다짐을 다 풀었으면 가방은 접는다
네 단계가 전부다. 합치기는 생각보다 싱겁게 끝난다

합치는 데는 방향이 있습니다

여기가 오늘 제일 많이 헷갈리는 자리입니다. 짐을 푸는 사람은 집에 있는 사람입니다. 가방 안에 들어가서 옷장을 부를 수는 없습니다.

깃도 같습니다. 받을 가지로 먼저 이동한 다음, 거기서 "쟤를 가져와" 라고 말합니다.

누가 누구를 가져오는가

맞는 순서

  • git switch master — 받을 쪽으로 간다
  • git merge hello — 저쪽 것을 가져온다
  • 변하는 것은 지금 서 있는 `master`
  • hello 는 아무 일도 없었던 것처럼 그대로다

흔히 하는 착각

  • hello 에 서서 git merge master 를 친다
  • 이러면 `hello` 가 변합니다
  • 정작 master 에는 내 작업이 안 들어간다
  • 에러가 안 나서 잘못된 줄도 모른다
명령을 치기 전에 '나는 지금 어디에 서 있는가' 를 먼저 본다. 이 습관 하나로 대부분 막힌다

에러가 안 난다는 게 무섭습니다. 반대로 합쳐도 깃은 순순히 해줍니다. 그래서 합치기 전에는 git branch 부터 쳐서 * 위치를 봅니다. 21강에서 배운 그 한 줄이 여기서 값을 합니다.

한 문장으로 외웁니다. "받을 쪽에 가서, 줄 쪽을 부른다." 합치기가 어려운 게 아니라, 방향을 잘못 잡아서 어려워집니다.

합치기 전에 확인합니다

바로 치지 않고 세 가지를 봅니다. 나중에 팀에서 쓸 때도 똑같이 하는 순서입니다.

합치기 전 점검
  1. 01

    지금 어디 서 있는지 봅니다

    *hello 에 있을 겁니다. 21강에서 그리로 옮겨놓고 끝났습니다

    git branch
  2. 02

    덜 담긴 게 없는지 봅니다

    nothing to commit 이 나와야 합니다. 고치다 만 게 있으면 커밋부터 합니다

    git status
  3. 03

    받을 쪽으로 옮깁니다

    여기서 README.md 를 열어보면 hello 에서 더한 줄이 아직 없습니다

    git switch master
3번에서 파일을 한 번 열어보는 게 좋다. 잠시 뒤 합치고 다시 열었을 때 차이가 눈에 보인다

합칩니다

터미널
  • $ git switch master
  • Switched to branch 'master'
  • $ git merge hello
  • Updating 8f3c1a2..b7e94d5
  • Fast-forward
  • README.md | 1 +
  • 1 file changed, 1 insertion(+)

끝입니다. 이게 전부입니다.

README.md 를 다시 열어보면 hello 에서 더했던 줄이 master 에도 있습니다. 21강에서 "사라졌다" 고 놀랐던 그 줄이 이제 이쪽 세계로 넘어온 겁니다.

기록도 같이 봅니다.

터미널
  • $ git log --oneline
  • b7e94d5 (HEAD -> master, hello) 브랜치 연습 문구 추가
  • a1d2c93 (origin/master) 프로필 문구 다듬기
  • 5c8b0f1 README 로 이름 변경
  • 8e4a7d2 첫 커밋

맨 윗줄 괄호 안을 봅니다. masterhello같은 줄에 나란히 있습니다. 두 가지가 지금 같은 지점을 보고 있다는 뜻입니다. 갈라졌던 게 다시 만난 겁니다.

origin/master 는 아직 한 줄 아래에 있습니다. 깃허브 쪽은 아직 이걸 모른다는 뜻입니다.

합친 결과를 깃허브에도 올립니다

지금 상태는 내 컴퓨터에서만 합쳐진 겁니다. 방금 git log 에서 origin/master 가 한 줄 뒤에 있던 게 그 증거입니다.

올리고 확인합니다
  1. 01

    master 에 서 있는지 다시 봅니다

    git branch
  2. 02

    올립니다

    14강에서 하던 그대로입니다. 합쳤다고 특별한 명령이 붙지 않습니다

    git push origin master
  3. 03

    깃허브 저장소 화면을 새로고침합니다

    README.md 아래에 더한 줄이 보입니다

  4. 04

    20강에서 만든 Pages 주소도 열어봅니다

    1분쯤 뒤에 페이지에도 반영됩니다

가지에서 한 작업이 웹페이지까지 도달했다. 갈라졌다가 합쳐져서 세상에 나가는 한 바퀴를 방금 돈 것이다

hello 가지 자체는 아직 깃허브에 없습니다. 21강 끝에서 말한 그대로입니다. 그래도 상관없습니다. 가지의 내용물은 이미 master 를 통해 올라갔으니까요. 가방은 안 부치고 짐만 부친 셈입니다.

다 쓴 가지는 지웁니다

여기서 많이 망설입니다. "지우면 그동안 한 작업이 날아가는 거 아닌가" 싶어서입니다.

안 날아갑니다. 짐은 이미 옷장에 들어가 있습니다. 지우는 것은 빈 가방입니다.

사라지는 것은 hello 라는 이름표 하나뿐입니다. 그 가지에서 한 커밋도, 고쳤던 README.md 내용도, git log 에 남은 기록도 전부 그대로 있습니다. 가지 이름은 커밋을 가리키는 표지판입니다. 표지판을 떼도 길이 없어지지는 않습니다.

터미널
  • $ git branch -d hello
  • Deleted branch hello (was b7e94d5).
  • $ git branch
  • * master

목록이 다시 한 줄이 됐습니다. 21강 맨 처음 화면으로 돌아온 겁니다. 다만 README.md 에는 그때 없던 줄이 하나 더 있습니다. 다녀왔고, 뭔가 가져왔습니다.

가지는 쓰고 버리는 것입니다

입문자와 실무자의 차이가 여기서 갈립니다. 입문자는 가지를 만들어놓고 안 지웁니다. 몇 주 지나면 test, test2, 수정, 진짜수정 이 목록에 쌓여 있습니다. 1강에서 봤던 보고서_최종_최종2 가 가지 이름으로 부활한 겁니다.

가지 하나의 수명은 짧습니다. 할 일 하나를 위해 git switch -c 로 만들고, 그 안에서 고치고 커밋하고, master 로 가서 merge 하고, 같은 날 -d 로 지웁니다. 오래 두고 키우는 게 아니라 쓰고 버리는 소모품입니다.

가지 이름을 hello 같은 게 아니라 할 일 이름으로 지으면 이 감각이 붙습니다. fix-typo, add-profile, update-readme 처럼요. 이름만 봐도 언제 지워야 할지 알 수 있습니다. 10강에서 커밋 메시지를 두고 한 이야기와 똑같습니다.

오늘 더한 명령
명령하는 일
git merge 이름지금 서 있는 가지로 저 가지의 작업을 가져온다
git branch -d 이름다 합친 가지를 지운다. 안 합쳤으면 거절한다
git branch -D 이름무조건 지운다. 지금은 쓸 일 없다
21강의 네 개에 세 개가 붙었다. 브랜치로 하는 일은 사실상 이걸로 끝이다

정리하면

  • 합치는 데는 방향이 있습니다. 받을 가지로 이동한 다음, 거기서 git merge 줄쪽 을 칩니다
  • 반대로 쳐도 에러가 안 납니다. 그래서 치기 전에 git branch* 위치를 봅니다
  • 합치면 README.md 에 저쪽에서 한 작업이 들어옵니다. 21강에서 사라졌던 그 줄입니다
  • Fast-forward따라잡기입니다. 받을 쪽이 그동안 안 움직였으면 이름표만 앞으로 옮기면 끝입니다
  • 합친 것은 아직 내 컴퓨터 안입니다. git push origin master 로 올려야 깃허브와 페이지에 반영됩니다
  • 가지를 지워도 커밋은 안 사라집니다. 없어지는 건 이름표 하나뿐입니다
  • -d 는 안 합친 게 있으면 거절하는 안전한 삭제입니다. -D 는 지금 쓸 일이 없습니다
  • 서 있는 가지는 못 지웁니다. 나온 다음에 지웁니다
  • 가지는 할 일 하나에 하나씩 쓰고 버립니다. 쌓아두면 이름이 test2, 진짜수정 이 됩니다

오늘은 합치기가 너무 쉽게 끝났습니다. Fast-forward 한 줄 뜨고 그만이었습니다. 한쪽만 움직였기 때문입니다.

다음 23강에서는 양쪽이 다 움직인 경우를 봅니다. 두 가지에서 README.md같은 줄을 서로 다르게 고친 다음 합칩니다. 깃이 처음으로 "나는 못 정하겠다" 고 손을 듭니다. 그게 충돌입니다. 겁먹을 필요 없게, 일부러 내보고 손으로 풀어봅니다. 시험지 한 칸에 두 사람이 다른 답을 적어놨을 때 어떻게 하는지 생각하면 됩니다.

브랜치 합치기 — 갈라놓은 것을 다시 하나로 — 디코드랩(DCODELAB)