학습 자료

내려받기 — 창고에서 물건을 찾아옵니다


Article

이사할 때 짐을 창고에 맡겨 본 적이 있다면 이해가 빠릅니다. 짐을 맡기는 것과 찾아오는 것은 다른 일입니다. 맡기기만 하면 창고에 쌓이기만 하고 내 방은 계속 비어 있습니다.

찾아올 때도 두 가지가 있습니다. 이사 첫날에는 짐을 통째로 받아옵니다. 그다음부터는 통째로 다시 받지 않습니다. 그사이에 창고로 새로 들어온 것만 받아옵니다. 이미 방에 있는 침대를 매번 다시 받아올 이유가 없습니다.

깃도 똑같이 둘로 나뉩니다. 오늘 배울 게 그 둘입니다.

왜 필요한지부터 봅니다

지금까지 한 일을 그려보면 화살표가 한 방향뿐입니다.

14강까지 한 일
  1. 학원 컴퓨터의 git-study 폴더여기서 파일을 고치고 커밋했다
  2. git push보냈다
  3. 깃허브의 my-first-repo쌓였다
반대 방향 화살표가 아직 없다. 그게 오늘 만들 것이다

학원에서 수업을 듣고 집에 왔습니다. 집 컴퓨터를 켭니다. 그런데 git-study 폴더가 없습니다. 당연합니다. 그 폴더는 학원 컴퓨터 바탕화면에 있으니까요. 깃허브에는 올려뒀는데 집 컴퓨터는 그 사실을 모릅니다.

여기서 깃허브 웹사이트에 들어가 파일을 하나씩 다운로드하는 사람이 있습니다. 그러면 파일은 오지만 기록이 안 옵니다. 지금까지 쌓은 커밋도, 창고 주소도 안 따라옵니다. 그 폴더는 저장소가 아니라 그냥 폴더입니다.

clone — 통째로 받아옵니다

명령은 한 줄입니다. 주소는 14강에서 저장소를 만들 때 본 그 주소입니다.

집 컴퓨터에서 처음 받아오기
  1. 01

    받아둘 자리로 이동합니다

    바탕화면이면 충분합니다. 4강에서 배운 cd 를 씁니다

    cd ~/Desktop
  2. 02

    깃허브에서 주소를 복사합니다

    저장소 화면의 초록색 Code 버튼을 누르면 HTTPS 주소가 나옵니다. 옆의 복사 버튼을 씁니다

  3. 03

    git clone 뒤에 주소를 붙여 칩니다

    git clone https://github.com/내계정/my-first-repo.git
  4. 04

    폴더가 새로 생깁니다

    저장소 이름과 같은 이름으로 만들어집니다. 미리 폴더를 만들어 둘 필요가 없습니다

  5. 05

    그 안으로 들어갑니다

    cd my-first-repo
clone 은 복제라는 뜻이다. 창고에 있는 것을 그대로 하나 더 만든다
Git Bash
  • $ git clone https://github.com/내계정/my-first-repo.git
  • Cloning into 'my-first-repo'...
  • remote: Enumerating objects: 21, done.
  • remote: Counting objects: 100% (21/21), done.
  • Receiving objects: 100% (21/21), 2.14 KiB | 730.00 KiB/s, done.
  • Resolving deltas: 100% (3/3), done.

여기서도 remote: 로 시작하는 줄이 보입니다. 16강에서 배운 대로 저쪽 서버가 하는 말입니다. 이번에는 에러가 아니라 "몇 개 보낸다"는 보고입니다.

받아온 폴더에 들어가 git log --oneline 을 쳐봅니다. 7강에서 보던 커밋 목록이 그대로 다 있습니다. 파일만 온 게 아니라 기록이 통째로 온 것입니다.

init 으로 시작한 폴더 vs clone 으로 받은 폴더

5강 — git init

빈 땅에서 시작

  • 폴더를 내가 만든다
  • 커밋 기록이 0개에서 시작한다
  • 창고 주소를 git remote add 로 따로 등록했다 (14강)
  • 첫 push 에 -u origin master 가 필요했다

17강 — git clone

이미 있는 것을 복제

  • 폴더가 자동으로 만들어진다
  • 커밋 기록이 전부 따라온다
  • 창고 주소가 이미 등록돼 있다git remote -v 로 확인된다
  • 그냥 git push 만 치면 된다
clone 은 init 과 remote add 를 한 번에 해준다. 그래서 실무에서는 clone 으로 시작하는 일이 훨씬 많다

pull — 새로 생긴 것만 받아옵니다

집에서 README.md 를 한 줄 고치고 커밋한 뒤 push 했습니다. 다음 날 학원에 갑니다. 학원 컴퓨터의 폴더는 어제 저녁 상태 그대로입니다. 어젯밤에 집에서 고친 내용을 모릅니다.

여기서 다시 clone 하지 않습니다. 이미 폴더가 있으니까요. git pull 을 칩니다.

이어서 작업하기
  1. 01

    작업 폴더로 들어갑니다

    cd ~/Desktop/git-study
  2. 02

    git pull 을 칩니다

    git pull
  3. 03

    달라진 파일 목록이 나옵니다

    무엇이 몇 줄 바뀌었는지 보여줍니다

  4. 04

    파일을 열어 확인합니다

    어젯밤에 집에서 고친 그 줄이 들어와 있습니다

주소를 다시 적을 필요가 없다. 이 폴더는 자기가 어느 창고 소속인지 이미 안다
Git Bash
  • $ git pull
  • From https://github.com/내계정/my-first-repo
  • 9f3c1ab..7b2d4e0 master -> origin/master
  • Updating 9f3c1ab..7b2d4e0
  • Fast-forward
  • README.md | 2 +-
  • 1 file changed, 1 insertion(+), 1 deletion(-)

1 file changed, 1 insertion(+), 1 deletion(-) 는 7강 git diff 에서 본 것과 같은 표기입니다. 한 줄이 지워지고 한 줄이 들어왔다는 뜻입니다. 한 줄을 고치면 깃은 늘 이렇게 셉니다.

받아올 게 없을 때는 이렇게 나옵니다.

Git Bash
  • $ git pull
  • Already up to date.

"이미 최신"이라는 뜻입니다. 아무 일도 안 일어난 게 정상입니다. 이 한 줄이 나온다고 실패한 게 아닙니다.

받아오는 두 명령
git clonegit pull
언제그 컴퓨터에서 처음 한 번그 뒤로 계속
폴더새로 만들어진다이미 있는 폴더 안에서 친다
가져오는 것전부 — 파일 + 커밋 기록 + 주소그사이에 새로 생긴 것만
주소명령에 직접 적는다안 적는다. 폴더가 기억하고 있다
컴퓨터 한 대당 clone 은 한 번뿐이다. 나머지는 전부 pull 이다

하루가 이렇게 돕니다

컴퓨터가 두 대가 되는 순간부터 순서가 생깁니다. 이 순서를 몸에 붙이는 게 오늘의 진짜 목표입니다.

작업 시작과 끝
  1. 앉자마자 git pull다른 데서 한 게 있으면 받아온다
  2. 파일을 고친다addcommit — 6강에서 한 그대로
  3. 일어나기 전에 git push창고에 올려둔다
시작은 pull, 끝은 push. 이 두 줄이 컴퓨터 두 대를 쓰는 사람의 기본기다

pull 을 건너뛰고 바로 고치기 시작하면 어떻게 될까요. 집에서 고친 줄과 학원에서 고친 줄이 같은 줄이면 깃이 둘 중 뭐가 맞는지 판단하지 못합니다. 그때 나오는 게 충돌입니다. 지금은 이름만 알아둡니다. 23강에서 일부러 충돌을 내보면서 손으로 풀어봅니다.

컴퓨터가 두 대가 아니어도 같은 일이 벌어질 수 있습니다. 깃허브 웹사이트에서 파일을 직접 고치면 커밋이 깃허브 쪽에서 만들어지고, 내 컴퓨터는 그 사실을 모릅니다. 웹에서 고쳐놓고 컴퓨터에서 계속 작업하다가 push 할 때 거부당하는 일이 여기서 나옵니다. 규칙은 하나입니다. 어디서 고쳤든, 다른 데서 이어서 하려면 먼저 pull 입니다.

정리하면

  • 지금까지는 보내기만 했습니다. 받아오는 방향이 오늘 생겼습니다
  • 깃허브 웹에서 파일을 다운로드하면 파일만 옵니다. 커밋 기록도 창고 주소도 안 옵니다
  • git clone 주소그 컴퓨터에서 처음 한 번입니다. 폴더가 자동으로 만들어집니다
  • cloneinitremote add 를 한 번에 해줍니다. 그래서 바로 git push 만 치면 됩니다
  • 저장소 폴더 안에서 clone 을 치면 폴더 안에 폴더가 생깁니다. 바깥에서 칩니다
  • 그다음부터는 git pull 입니다. 새로 생긴 것만 받아옵니다. 주소를 적지 않습니다
  • Already up to date. 는 실패가 아닙니다. 받아올 게 없다는 뜻입니다
  • 순서를 몸에 붙입니다. 앉으면 pull, 일어나기 전에 push
  • 커밋 안 한 수정이 남아 있으면 pull 이 멈춥니다. 깃이 내 작업을 지키는 것입니다. 커밋부터 하고 pull 합니다
  • 깃허브 웹에서 고친 것도 마찬가지입니다. 어디서 고쳤든 이어서 하려면 먼저 pull 입니다

다음 18강은 지금까지 손으로 친 것을 버튼으로 해봅니다. VS Code 에는 소스 제어 패널이 있어서 add · commit · push · pull 이 전부 클릭 몇 번입니다. 순서를 이렇게 뒤에 둔 이유가 있습니다. 손세차를 해본 사람만 자동세차 기계가 무엇을 대신해 주는지 압니다. 버튼을 먼저 배웠으면 눌러도 무슨 일이 벌어지는지 모른 채 눌렀을 겁니다. 이제는 버튼 뒤에서 어떤 명령이 도는지 알고 누를 수 있습니다.

내려받기 — 창고에서 물건을 찾아옵니다 — 디코드랩(DCODELAB)