오도원입니다.

건강과 행복을 위하여

Development/Git

5장. 깃허브로 협업하기 - 원격 저장소 사용하기

오도원공육사 2020. 2. 7. 17:01
반응형

깃허브를 통해서 협업을 진행하면 시간과 장소에 구애받지 않고 프로젝트 파일에 접근 할 수 있다. 하나의 원격 저장소를 중심으로 둘 이상의 지역 저장소와 연결하는 방법을 알아보고, 연결된 원격 저장소와 지역 저장소와 동기화하는 방법을 알아보자.

 

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

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

3. 협업의 기본 알아보기

4. 협업에서 브랜치 알아보기

 

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

하나의 깃허브 계정으로 둘 이상의 컴퓨터에서 원격 저장소를 공유해 버전을 관리하는 방법을 알아보자. git_home을 개인 컴퓨터의 저장소, git_office를 회사 컴퓨터의 저장소라고 가정하고 진행하겠다.

 

1) 원격 저장소 복제하기 - git clone

원격 저장소(remote repository)를 기존에 연결된 지역 저장소(local repository) 외에 다른 지역 저장소에서 사용하려면 원격 저장소에 담긴 내용 전체를 지역 저장소로 가져와야 한다.

해당 원격 저장소 주소를 복사한다.

$ git clone [원격 저장소 주소] git_home

git_home, git_office 디렉토리가 없다면 클론하면서 자동으로 디렉토리가 만들어진다. 이제 개인 컴퓨터와 회사 컴퓨터 양쪽에 원격 저장소 전체가 복제가 됐다.

 

$ ls -al

$ cd git_home
$ git log

$ cd ../git_office
$ git log

 

이렇게 원격 저장소를 복제하면 자동으로 지역 저장소와 원격 저장소가 연결된다. git remote -v 명령을 사용하면 연결여부를 확인할 수 있다.

$ git remote -v

 

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

git_home에서 파일을 수정하고 커밋한 후 푸시해보겠다.

파일 수정
파일 커밋 후 푸시

클론을 통해서 git_home 디렉토리와 원격 저장소가 연결이 되었으니, git push를 통해서 원격 저장소에 푸시하여 커밋 내용을 백업할 수 있다.

 

깃허브 원격 저장소에 푸시한 커밋이 올라온 것을 확인할 수 있다.

 

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

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

 

git pull 명령을 사용하면 원격 저장소에 새로 올라온 커밋을 가져온다.

$ cd ~/git_office
$ git pull

git_home에서 파일을 수정한 뒤 커밋 후 푸시한 내용을 git_office에서 git pull을 통해서 가져왔다.

 

이제 다시 git_office에서 파일을 수정한 뒤 커밋한 후 푸시해보겠다.

푸시
원격 저장소에 반영되었다.

다시 개인 컴퓨터(git_home)에서 작업할 때는 git pull 명령으로 원격 저장소의 최신 커밋을 가져와 작업을 다시한다.

하나의 원격 저장소에 둘 이상의 컴퓨터를 연결해서 사용한다면 풀과 푸시를 습관화해야한다. 어떤 컴퓨터에서 접속하든 항상 최신 소스를 유지해야하기 때문이다.

 

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

git pull 명령은 원격 저장소의 최신 커밋을 지역 저장소에 합쳐준다. 그러나 원격 브랜치에서 정보만 가져오는 방법도 있다. 원격 브랜치 정보만 가져온 후 가져온 정보를 지역 저장소에 병합하는 과정까지 알아보자.

 

1) 원격 master 브랜치

지역 저장소의 master 브랜치처럼 원격 저장소도 만들 때 기본으로 master 브랜치가 생성된다.

 

현재 원격 저장소의 최신 커밋은 'add d'이다. 여기에서 원격 저장소에 있는 HEAD는 원격 저장소의 master 브랜치를 가리킬 것이고, 원격 master 브랜치는 'add d' 최종 커밋을 가리킨다.

git_home의 커밋상태는 (HEAD -> master, origin/master, origin/HEAD) add d라고 나온다. 여기에서 HEAD -> master는 이 커밋이 지역 저장소의 최종 커밋이라는 뜻이고, origin/master는 원격 저장소의 최종 커밋이라는 뜻이다. 

 

 

파일 생성 후 커밋

새로운 커밋을 한 후 커밋 상태를 확인해보면 (HEAD -> master)는 방금 커밋한 'create f3.txt'를 가리킨다. 지역 저장소의 최종 커밋은 'create f3.txt'라는 뜻이다. 하지만 (origin/master, origin/HEAD)는 아직 'add d' 커밋을 가리킨다.

 

이 상태에서 git status를 확인해보자.

현재 master 브랜치가 origin에 있는 원격 master 브랜치의 버전보다 하나 앞서는 것을 알 수 있다. 그리고 git push로 원격 저장소에 올리라고 알려준다.

 

$ git push
$ git log --oneline

푸시한 후 master와 origin/master 브랜치가 같은 커밋을 가리키게 된다.

 

2) 원격 브랜치 정보 가져오기 - git fetch

git fetch 명령은 원격 저장소의 정보를 가져오는 명령이다. git pull이 원격 저장소의 커밋을 가져와서 지역 저장소에 합친다면, fetch 명령은 원격 브랜치에 어떤 변화가 있는지 그 정보만 가져온다.

 

현재 상태는 git_home에서 수정한 내용을 원격 저장소에 푸시하고 아직 git_office에 pull하지 않은 상태이다. git_office에서 git fetch 명령을 통해 정보를 가져온다.

$ git fetch

커밋을 가져왔지만 git_home에서 원격 저장소로 푸시했던 f3.txt 파일이 보이지 않는다.

 

git log를 살펴보면 (HEAD -> master)만 보이고 원격 저장소의 origin/master는 보이지 않는다. 원격 저장소의 최신 커밋 정보를 가져왔지만 아직 지역 저장소에 합치지 않아 원래 git_office에 있던 최신 커밋만 나타나는 것이다.

 

git status를 보면 현재 브랜치가 origin/master에 비해 1개의 커밋이 뒤쳐진다고 나온다. 즉, 원격 저장소의 최신 커밋 하나가 아직 지역 저장소에 반영되지 않았다는 뜻이다.

 

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

$ git checkout FETCH_HEAD

 

참고)

지역 저장소의 최신 커밋과 fetch 커밋의 차이를 비교하려면 master 브랜치에서 git diff를 사용한다.

$ git diff HEAD origin/master

 

FETCH_HEAD 브랜치에서 git log를 살펴보자.

최신 커밋에 origin/master와 origin/HEAD가 표시된다. 이 커밋이 fetch로 가져온 원격 브랜치의 최신 커밋이다. 이 내용을 살펴보고 원격 브랜치의 최신 커밋을 지역 저장소에 합칠지 말지를 결정한다.

 

이제 fetch한 후에 최신 커밋을 현재 브랜치에 합치려면 git pull 또는 git merge 명령을 사용한다.

$ git switch master
$ git merge FETCH_HEAD

git pull은 git fetch와 git merge FETCH_HEAD를 합친 것과 같다.

 

참고) fetch로 가져온 브랜치 한번에 병합하기

1. fetch한 뒤 병합할 때 원격 master 브랜치에 잇는 커밋일 경우

$ git merge oring/master

 

2. 다른 브랜치에 있는 커밋일 경우

$ git merge origin/브랜치이름

 

반응형

'Development > Git' 카테고리의 다른 글

pre-commit. ruff initialize 실패 시  (0) 2024.03.19
git add; 수정된 파일만 add하기  (0) 2020.08.03
4장. 깃허브로 백업하기  (0) 2020.02.06
깃허브 origin 삭제하는 방법  (0) 2020.02.05
3장. 깃과 브랜치  (0) 2020.02.02