05. GitHub로 협업하기

2020. 2. 15. 05:29GIT

여러 컴퓨터에서 원격 저장소 함께 사용하기

 이제부터 git_home과 git_office라는 2개의 디렉터리를 만들어 깃허브 협업을 연습하겠습니다. 1인 프로젝트를 한다면 각 디렉터리를 개인 컴퓨터, 회사 컴퓨터의 저장소라고 상상해도 되고, 하나는 PC, 하나는 노트북의 저장소라고 상상해도 됩니다.

 

1. 원격 저장소 복제하기

 원격 저장소를 기존에 연결된 지역 저장소 외에 다른 지역 저장소에서 사용하려면 원격 저장소에 담긴 내용 전체를 지역 저장소로 가져와야 합니다. 원격 저장소를 지역 저장소로 똑같이 가져오는 것을 '복제한다'고 하거나 '클론(clone)' 또는 '클로닝(cloning)'이라고 합니다.

 

01. 04장에서 만든 test라는 원격 저장소를 계속 사용하겠습니다. 깃허브에 있는 test 저장소를 git_home이라는 저장소로 복제하겠습니다. [Clone or download]를 누른 후 'Clone with HTTPS' 항목에 있는 복사 버튼을 눌러서 원격 저장소의 주소를 복사합니다. 

 

02. 터미널 창에서 git_home 디렉터리와 git_office 디렉터리를 만들 위치로 이동합니다. git clone 다음에 복사한 소스를 붙여 넣고 복제할 디렉터리 이름을 입력하면 됩니다. 이때 git_home이라는 디렉터리가 없다면 자동으로 디렉터리가 만들어집니다.

git clone 복사한 주소 붙여넣기 git_home

 

03. 원격 저장소의 내용을 git_office 디렉터리에도 복제하겠습니다.

git clone 복사한 주소 붙여넣기 git_office

 

04. 터미널 창에서 ls -al 명령을 사용해 방금 만든 디렉터리를 확인합니다.

ls -al

 

05. git_home 디렉터리와 git_office 디렉터리에 같은 내용이 저장되어 있는지 확인해 보겠습니다. 먼저 git_home 디렉터리로 이동한 후 git log 명령을 입력해 보세요. 필자의 경우에는 3개의 커밋이 저장되어 있습니다. 커밋 개수는 다를 수 있습니다.

cd git_home
git log

 

06. 다시 git_office 디렉터리로 이동한 후 git log 명령을 실행하세요. git_home 디렉터리와 똑같은 커밋이 저장되어 있는 것을 확인할 수 있습니다.

cd ..
cd git_office
git log

 

07. 이렇게 원격 저장소를 복제하면 자동으로 지역 저장소와 원격 저장소가 연결됩니다. git_home 디렉터리나 git_office 디렉터리에서 git remote -v 명령을 사용하면 연결이 되어 있는지 확인할 수 있습니다.

git remote -v

 

2. 개인 컴퓨터에서 작업하고 올리기

 같은 원격 저장소를 복제한 2대의 컴퓨터 중 한 곳에서 커밋을 만들고 푸시해 보겠습니다. 여기에서는 git_home 디렉터리(개인 컴퓨터)에서 작업합니다.

 

01. git_home 디렉터리에서 텍스트 문서를 열고 간단한 내용을 추가해 보세요. 추가하는 내용이 중요한 것이 아니라 커밋하는 것이 중요합니다. 여기에서는 f1.txt 문서에 c 라는 문자를 추가해 보겠습니다.

cd ~
cd git_home
vim f1.txt

 

02. f1.txt 파일을 스테이징하고 커밋하겠습니다. 그리고 git push 명령을 사용해 커밋을 원격 저장소에 올립니다.

git commit -am "add c"
git push

 

03. 이제 깃허브의 원격 저장소로 접속해서 제대로 커밋이 올라왔는지 확인해 볼까요? 깃허브 화면 위에 표시된 [commits]을 누릅니다.

 

04. 마지막으로 커밋한 'add c'라는 커밋이 올라와 있습니다. 이렇게 원격 저장소의 내용을 복제한 지역 저장소에서 내용을 수정하고 커밋한 후 다시 원격 저장소에 올렸습니다.

 

3. 회사 컴퓨터에서 내려받아 작업하기

 개인 컴퓨터에서 커밋을 푸시했기 때문에 회사 컴퓨터에서 원격 저장소를 복제했을 때와 원격 저장소의 커밋 상황이 달라졌습니다. 따라서 회사 컴퓨터에서 작업하려면 먼저 원격 저장소에 새로 올라온 커밋을 가져와야 합니다.

 

01. 앞에서 복제 과정을 거쳤기 때문에 git_office의 master 브랜치는 origin에 이미 연결되어 있습니다. 터미널 창에서 git_office 디렉터리로 이동한 후 git pull 명령을 입력하면 앞에서 원격 저장소에 새로 올라온 커밋을 가져옵니다.

cd ../git_office
git pull

 

02. 저장소에 있는 f1.txt 파일을 수정해 보겠습니다. 개인 컴퓨터(git_home)에서 수정했던 'c'가 포함되어 있을 것입니다. 회사 컴퓨터(git_office)에서는 영문자 d를 추가하고 저장합니다.

vim f1.txt

 

03. 이제 'add d'라는 메시지와 함께 커밋을 만든 후 원격 저장소로 푸시합니다.

git commit -am "add d"
git push

 

04. 웹 브라우저에서 깃허브 저장소를 열고 [commits]을 확인해 보세요. 커밋 수가 1개 더 늘어났을 것이고, 그 부분을 누르면 방금 회사 컴퓨터에서 푸시한 커밋이 올라와 있을 것입니다.

 

05. 다시 개인 컴퓨터(git_home 디렉터리)에서 작업할 때는 git pull 명령으로 원격 저장소에 있는 최신 커밋을 가져와 작업을 시작합니다. git log 명령으로 확인해 보면 회사 컴퓨터(git_office 디렉터리)에서 푸시했던 'add d'라는 커밋이 개인 컴퓨터에도 들어와 있을 것입니다.

cd ../git_home
git pull
git log

 하나의 원격 저장소에 둘 이상의 컴퓨터를 연결해서 사용한다면 풀과 푸시를 습관화하는 것이 좋습니다. 그러면 어떤 컴퓨터에서 접속하든 항상 최신 소스를 유지할 수 있습니다.

 


원격 브랜치 정보 가져오기

 git pull 명령은 원격 저장소의 최신 커밋을 지역 저장소에 합쳐줍니다. 하지만 최신 커밋을 합치기 전에 원격 저장소에 어떤 변화가 있는지 먼저 살펴봐야 합니다. 이럴 때는 원격 브랜치에서 정보만 먼저 가져올 수 있습니다.

 

1. 원격 master 브랜치

 지역 저장소의 master 브랜치처럼 원격 저장소도 만들 때 기본으로 master 브랜치가 생성됩니다. 앞에서 git_home 저장소와 git_office 저장소로 원격 저장소를 복제한 상태로 실습을 계속하면서 확인해 보겠습니다. 이제부터 원격 저장소에 있는 브랜치는 '원격 브랜치'로, 원격 저장소에 있는 master 브랜치는 '원격 master 브랜치'로 구별해서 부르겠습니다.

 

01. 깃허브에서 test 저장소로 접속한 후 [commits]를 눌러 보세요. 이 책의 실습을 따라왔다면 'add d'라는 커밋이 마지막일 것입니다. 여기에서 원격 저장소에 있는 HEAD는 원격 저장소의 master 브랜치를 가리킬 것이고, 원격 master 브랜치는 'add d'라는 최종 커밋을 가리킵니다.

 

02. 터미널 창에서 git_home 디렉터리로 이동한 후 git log 명령으로 커밋 상태를 확인해 보세요. 최종 커밋인 'add d' 앞에 (HEAD -> master, origin/master, origin/HEAD)라고 표시되어 있습니다.

cd git_home
git log --oneline

 여기에서 HEAD -> master는 이 커밋이 지역 저장소의 최종 커밋이라는 뜻이고, origin/master는 원격 저장소의 최종 커밋이라는 뜻입니다. 아직 git_home 디렉터리가 원격 저장소를 복제한 상태 그대로이기 때문에 지역 저장소와 원격 저장소 모두의 최종 커밋이 같습니다.

 

03. git_home 디렉터리에 새로운 커밋을 만들어 보겠습니다. 빔을 사용해 f3.txt 파일을 만든 후 간단히 'a'라고 입력하겠습니다. 파일 내용은 어떤 것을 입력해도 상관없습니다. 여기에서는 새 파일을 만드는 것이 중요합니다.

vim f3.txt

 

04. f3.txt를 스테이지에 올린 후 커밋을 만듭니다.

git add f3.txt
git commit -m "create f3.txt"

 

05. git log --oneline 명령을 사용해 커밋 로그를 한눈에 확인해 보겠습니다. (HEAD -> master)는 방금 커밋한 'create f3.txt'를 가리킵니다. 지역 저장소의 최종 커밋이 'create f3.txt'커밋이라는 뜻입니다. 하지만 (origin/master, origin/HEAD)는 아직 'add d' 커밋을 가리키고 있습니다.

git log --oneline

 

06. 이 상태에서 git status를 입력해 보세요. 현재 master 브랜치가 origin에 있는 원격 master 브랜치의 버전보다 하나 앞서 있는 것을 알 수 있습니다. 그리고 git push 명령으로 지역 저장소의 커밋을 원격 저장소로 올리라고 알려주네요.

git status

 

07. 이제 git push 명령을 사용해서 'create f3.txt'라는 커밋을 원격 저장소로 올립니다. 그러고 나서 커밋 로그를 확인해 보세요. 푸시하기 전까지는 master 브랜치와 origin/master 브랜치가 가리키는 커밋이 달랐지만, 푸시한 후에는 master와 origin/master 브랜치가 같은 커밋을 가리키게 됩니다.

git push
git log --oneline

 

2. 원격 브랜치 정보 가져오기

 페치(fetch)는 '불러오다, 가져오다'라는 뜻입니다. 그래서 git fetch 명령을 원격 저장소의 정보를 가져오는 기능이 있습니다. 풀 명령이 원격 저장소의 커밋을 가져와서 무조건 지역 저장소와 합친다면, 페치 명령은 원격 브랜치에 어떤 변화가 있는지 그 정보만 가져옵니다. 팀 작업을 할 때 다른 사람이 수정한 소스를 한번 더 훑어보고 지역 저장소와 합치고 싶다면 풀 대신 페치를 사용해서 커밋을 가져온 다음 지역 저장소와 합치면 됩니다.

 

01. 회사 컴퓨터 저장소로 이동해서 진행하겠습니다. 터미널 창에서 git_office 디렉터리로 이동한 후 git fetch 명령을 입력하세요. 원격 저장소에서 무언가 가져올 것입니다.

cd ../git_office
git fetch

 

02. ls -al 명령을 사용해서 어떤 파일이 있는지 살펴보세요. 분명이 원격 저장소에 있던 커밋을 가져왔는데 git_home에서 원격 저장소로 푸시했던 f3.txt 파일이 보이지 않는군요.

ls -al

 

03. git log 명령을 사용해서 살펴보겠습니다. 커밋 해시 오른쪽을 보면 (HEAD -> master)만 보이고 원격 저장소의 origin/master는 보이지 않습니다. 원격 저장소의 최신 커밋 정보를 가져왔지만 아직 지역 저장소에 합치지 않아 원래 git_office에 있던 최신 커밋만 나타나기 때문입니다.

git log --oneline

 

04. git status 명령으로 확인해 보면 현재 브랜치가 origine/master에 비해 1개의 커밋이 뒤처져 있다고 나옵니다. 즉 원격 저장소의 최신 커밋 하나가 아직 지역 저장소에 반영되지 않았다는 뜻입니다. git pull 명령을 사용하면 지역 저장소를 업데이트할 수 있다고 알려주는군요.

git status

 

 그렇다면 페치로 가져온 최신 커밋 정보는 어디에 있을까요? 페치로 가져온 원격 저장소 정보는 origin/master 브랜치가 아닌 FETCH_HEAD라는 브랜치로 가져옵니다. 이 브랜치로 가져온 정보는 지역 저장소에 바로 반영되지 않습니다.

 

05. 페치해서 가져온 최신 커밋을 살펴보고 싶다면 FETCH_HEAD 브랜치로 체크아웃해서 확인합니다.

git checkout FETCH_HEAD

 

06. FETCH_HEAD 브랜치에서 git log 명령을 사용해 보세요. 최신 커밋에 origin/master와 origin/HEAD가 표시되어 있습니다. 즉 이 커밋이 페치로 가져온 원격 브랜치의 최신 커밋입니다. 이 내용을 살펴보고 원격 브랜치의 최신 커밋을 지역 저장소에 합칠지 말지를 결정하면 됩니다.

git log

 

07. 페치한 후에 최신 커밋을 현재 브랜치에 합치려면 git pull 명령을 사용해서 원격 저장소의 소스를 내려받을 수도 있고, git merge 명령으로 FETCH_HEAD에 있던 커밋을 병합할 수도 있습니다. 여기에서는 git merge 명령으로 병합해 보겠습니다. master 브랜치로 이동한 뒤 병합하세요.

git checkout master
git merge FETCH_HEAD

 

07. git log 명령을 사용해서 커밋 로그를 확인해 보세요. 'create f3.txt'라는 최신 커밋이 지역 저장소에 반영된 것을 볼 수 있습니다. 

git log --oneline

 

페치로 가져온 브랜치 한 번에 병합하기

 페치한 뒤 병합할 때 원격 master 브랜치에 있는 커밋이라면 다음과 같이 병합합니다.
  git merge origin/master

 다른 브랜치에 있는 커밋이라면 다음과 같이 병합합니다.
  git merge origin/브랜치 이름

 하지만 매번 브랜치 이름을 써야 한다면 번거롭겠지요? 다음과 같이 명령하면 페치한 뒤 지역 저장소에 반영하지 않은 최신 커밋을 병합할 수 있습니다.
  git merge FETCH_HEAD

'GIT' 카테고리의 다른 글

04. GitHub로 백업하기  (1) 2020.02.05
03. GIT과 Branch  (0) 2020.01.28
02. GIT으로 버전 관리하기  (0) 2020.01.23
01. GIT 시작하기  (0) 2020.01.15