풀
고친 사람 github-actions[bot]
풀은 상대 저장소에 쌓인 새 변경을 받아 와 내 작업에 곧바로 합치는 일입니다. 받는 쪽이 먼저 움직여 가져오고, 보내는 쪽은 요청이 올 때까지 기다립니다. 버전관리 밖에서도 받는 쪽이 먼저 가져오는 전달을 풀이라고 부릅니다.
쉽고 빠른 이해
풀은 팀이 함께 쓰는 저장소에 남이 올려 둔 작업 기록을 내 컴퓨터로 받아 와, 내가 고치던 것과 한 벌로 합치는 일입니다. 동료가 어제 고쳐 올린 코드를 오늘 아침 내 컴퓨터에 얹는 것이 그 일입니다.
받아 오지 않으면 나는 남이 고치기 전의 코드를 붙들고 계속 고치게 됩니다. 두 갈래가 멀어질수록 나중에 합치는 값이 비싸집니다.
어떻게 도나:
- 상대 저장소에 내가 없는 기록이 있는지 물어봅니다
- 없는 기록만 받아 내 저장소에 쌓아 둡니다
- 쌓아 둔 것을 내가 쓰던 줄기에 합칩니다
받자마자 합치기 때문에 무엇이 들어오는지 보기 전에 내 작업이 바뀝니다. 같은 줄을 나와 상대가 다르게 고쳤으면 합치다 멈추고, 어느 쪽을 남길지 내가 골라야 합니다.
상세
이 절은 노트를 옮겨 적는 비유로 풀을 먼저 떠올린 다음, 풀이 무엇을 받아 오는지 봅니다. 그다음 풀이 두 단계로 나뉘는 대목과 합치는 방법이 갈리는 대목을 보고, 멈춰 서는 때를 짚습니다. 마지막으로 버전관리 밖의 쓰임과 이름만 같은 낱말을 가릅니다.
친구 노트를 내 노트에 옮겨 적기
같은 교재를 둘이 나눠 정리하기로 하고 각자 노트에 적는다고 해 봅시다. 내 노트에는 내가 적은 것만 있습니다. 상대가 정리한 대목까지 내 노트에 두려면 상대 노트를 펴서 옮겨 적어야 합니다.
옮겨 적다 보면 둘 다 같은 장을 정리해 둔 대목이 나옵니다. 적힌 내용이 다르면 어느 쪽을 남길지 골라야 합니다. 겹치지 않는 대목은 그냥 이어 붙이면 됩니다.
풀이 받아 오는 것
여럿이 한 프로젝트를 고치면 각자의 컴퓨터에 각자의 기록이 따로 쌓입니다. 남이 무엇을 언제 고쳤는지는 내 컴퓨터 안에 없습니다. 그 기록을 한곳에서 받아 오는 동작이 있어야 남의 작업 위에 내 작업을 이어 갈 수 있습니다.
풀은 버전관리 도구에서 원격 저장소의 새 커밋을 내 저장소로 받아 와 내 줄기에 합치는 동작입니다. 커밋은 그때까지 고친 내용을 하나로 묶어 확정한 기록이고, 원격 저장소는 내 저장소 밖에 따로 있는 같은 프로젝트의 저장소입니다.
그래서 건너오는 것은 파일의 최신 모습만이 아닙니다. 그 파일이 어떤 순서로 어떻게 바뀌어 왔는지도 같이 옵니다.
브랜치는 이력을 갈라 따로 이어 가는 한 줄기입니다. 줄기의 끝이 어느 커밋인지를 이름 하나가 가리킵니다. 풀은 어느 줄기를 받아 올지 골라서 그 줄기에 새로 쌓인 커밋만 가져옵니다.
널리 쓰는 Git 에서는 이 동작을 아래 명령으로 부릅니다.
git pull origin main # 받아 합친다
origin 이 상대 저장소에 붙여 둔 이름이고 main 이 받아 올 브랜치입니다. 이름을 안 대면 지금 줄기가 따라가기로 해 둔 상대 줄기를 씁니다.
두 단계가 한 동작
풀은 한 덩이로 보이지만 안에서 두 단계를 밟습니다. 먼저 상대의 새 커밋을 받아 내 저장소에 쌓아 두고, 그다음 쌓아 둔 것을 내가 쓰던 줄기에 합칩니다.
두 단계에는 각각 이름이 있습니다. 받아 두기만 하고 합치지 않는 동작이 페치이고, 받아 둔 것을 내 줄기에 합치는 동작이 병합입니다. 풀은 이 둘을 잇달아 하는 동작입니다.
flowchart TD
A["풀을 부른다"] --> B["페치 · 새 커밋을 받아 쌓아 둔다"]
B --> C["병합 · 쌓아 둔 것을 내 줄기에 합친다"]
C --> D{"같은 줄을 서로 다르게 고쳤나"}
D -->|아니다| E["합쳐진 채로 끝난다"]
D -->|그렇다| F["멈추고 사람이 고른다"]
페치까지만 하면 내가 쓰던 파일은 하나도 안 바뀝니다. 받아 둔 커밋을 먼저 읽어 보고 합칠지 정할 수 있습니다. 풀은 그 사이를 건너뛰므로 손이 덜 가는 대신, 무엇이 들어오는지 보기 전에 내 작업이 바뀝니다.
합치는 방법이 갈린다
합치는 단계는 두 방법 중 하나로 합니다. 하나는 내 커밋과 받아 온 커밋을 둘 다 그대로 두고, 둘을 잇는 커밋을 새로 하나 얹는 방법입니다. 이 새 커밋을 병합 커밋이라고 하고, 이력에는 갈라졌다 다시 만난 자국이 남습니다.
다른 하나는 내 커밋을 떼어 받아 온 커밋 뒤에 다시 붙이는 방법입니다. 이 동작을 리베이스라고 합니다. 갈라진 자국이 없어져서 이력이 한 줄로 남습니다.
| 이력에 남는 모양 | 대가 | |
|---|---|---|
| 병합 | 갈라졌다 만난 자국이 남는다 | 줄기가 많으면 읽기 어렵다 |
| 리베이스 | 한 줄로 이어진다 | 내 커밋의 식별자가 바뀐다 |
표의 마지막 칸이 리베이스를 아무 데나 못 쓰는 까닭입니다. 리베이스는 내 커밋을 베껴 새로 만들어 붙이므로 커밋마다 붙는 식별자가 전부 달라집니다. 이미 상대에게 올려 보낸 커밋을 이렇게 옮기면 상대가 들고 있는 것과 어긋나므로, 아직 안 올린 내 커밋에만 씁니다.
git pull --rebase # 얹어서 잇는다
멈춰 서는 때
같은 줄을 나와 상대가 서로 다르게 고쳤으면 합치는 도중에 멈춥니다. 어느 쪽이 맞는지 기계가 고를 수 없기 때문입니다. 이 상태를 충돌이라고 하고, 사람이 남길 쪽을 골라 최종본을 정하는 일이 충돌 해소입니다.
멈춘 동안 작업 폴더에는 두 쪽이 나란히 적힌 파일이 남습니다. 골라서 정리하고 나면 합치기가 이어집니다.
고쳐 놓고 아직 커밋하지 않은 수정이 있으면 합치기가 시작도 못 하고 멈추기도 합니다. 그 수정이 받아 온 것에 덮일 수 있기 때문입니다. 먼저 커밋하거나 잠시 치워 두고 풀을 부릅니다.
받아 온 커밋 뒤에 내 커밋이 하나도 없으면 고를 것이 없습니다. 내 줄기 이름을 받아 온 마지막 커밋으로 옮기기만 하면 끝납니다. 이렇게 이어 붙이기만 하는 경우를 빨리 감기라고 부릅니다.
풀이 하지 않는 것
풀은 받아 오는 쪽 동작입니다. 내가 고친 것을 상대에게 올려 보내지는 않습니다. 보내는 동작은 푸시라는 다른 이름으로 부릅니다.
저장소를 처음 가져오는 것도 풀이 아닙니다. 아무것도 없는 상태에서 저장소 전부를 받아 오는 동작은 클론입니다. 풀은 이미 받아 둔 저장소를 최신으로 맞출 때 씁니다.
풀은 저절로 돌지도 않습니다. 상대에 새 커밋이 생겨도 내가 부르기 전까지 내 쪽은 그대로입니다. 최신인지 알려면 내가 물어보러 가야 합니다.
버전관리 밖의 풀
다른 분야에서도 풀이라는 말을 씁니다. 뿌리는 같습니다. 받는 쪽이 먼저 움직여 가져온다는 것입니다.
컨테이너 이미지는 프로그램과 그것이 도는 데 필요한 것을 한 덩이로 묶어 둔 파일입니다. 그런 이미지를 모아 두고 내주는 서버를 레지스트리라고 합니다. 레지스트리에 있는 이미지를 내 기계로 받아 오는 동작도 풀이라고 부릅니다.
감시 도구가 서버마다 찾아가 지금 수치가 얼마인지 물어 모으는 방식도 풀이라고 부릅니다. 반대로 서버가 먼저 보내오는 방식은 푸시입니다. 받는 쪽이 새것이 있는지 되풀이해 물어보러 가는 것은 폴링이라고 합니다.
이름에 풀이 들어가는데 방향이 뒤집힌 말도 하나 있습니다. 풀 리퀘스트는 내가 고친 줄기를 상대에게 당겨 가 달라고 내는 요청입니다. 당기는 쪽은 요청을 받은 상대이고, 요청을 낸 나는 당기지 않습니다.
이름만 같은 다른 낱말
한글로 적으면 똑같이 풀이 되는 영어 낱말이 셋입니다. 지금까지 본 것은 그중 pull 입니다.
pool 은 미리 만들어 두고 여럿이 돌려 쓰는 물건의 모음입니다. 데이터베이스 연결을 미리 열어 두고 빌려 쓰는 커넥션 풀, 실행 흐름을 미리 만들어 두는 스레드 풀이 그렇게 부르는 것입니다. 받아 온다는 뜻은 없습니다.
full 은 빠짐없이 전부라는 뜻입니다. 표의 모든 행을 처음부터 끝까지 읽는 풀 테이블 스캔이 그 뜻으로 쓴 이름입니다.
어느 쪽인지는 앞뒤에 붙은 말이 가릅니다. 저장소나 이미지나 수치를 받아 오는 대목이면 pull 이고, 미리 만들어 둔 모음이면 pool 입니다.
관련 항목
풀이 상대하는 저장소와 그 별칭
원격 저장소 · 저장소 · origin · 업스트림 · 원격 추적 브랜치
풀이 받아 오는 기록의 단위
풀 안에서 밟는 단계와 합치는 방식
페치 · 병합 · 리베이스 · 빨리 감기 · 병합 커밋
풀과 짝을 이루는 주고받기 동작
푸시 · 클론 · 미러 · 강제 푸시 · 동기화
풀이 멈춰 섰을 때 쓰는 수단
풀 뒤에 이어지는 협업 절차
풀 리퀘스트 · 코드 리뷰 · 브랜치 전략 · 트렁크 기반 개발 · 커밋에서 배포까지
받는 쪽이 먼저 움직이는 다른 방식
폴링 · 풀 모델 · 레지스트리 · 컨테이너 이미지 · 패키지 관리자
같은 소리로 적히는 다른 영어 낱말
커넥션 풀 · 스레드 풀 · 상수 풀 · 풀 테이블 스캔 · 객체 풀
풀을 지원하는 버전관리 도구와 서비스
다른 이름: pull · git pull