Codesigner

[Git] Git Teamwork - Remote Repository 본문

Git /git

[Git] Git Teamwork - Remote Repository

eunsukimme 2019. 4. 9. 21:06

지금까지 우리는 한 사용자가 Git을 다루는 방법들에 대해서 배웠다. 사실, Git은 다른 사람들과 함께 작업할 수 있는 유용한 협업 툴을 제공해준다. 이를 활용하는 방법을 배우기에 앞서, 당신이 초등학교 선생님이라고 가정하자. 당신은 동료 선생님인 Alice를 포함하는 여러 선생님들과 함께 과학 시험 문제를 만들어야 한다고 하자. 다른 선생님들과 협업하기 위해선 당신과 Alice는 다음과 같은 요구조건을 필요로 한다: 

 

  • 당신의 컴퓨터에는 과학 시험 문제의 완전한 복사본이 존재해야 한다

  • 당신을 포함한 다른 선생님들의 문제 출제 작업을 추적하고 살펴볼 수 있어야 한다

  • 특정한 버전의 시험 문제에 접근할 수 있어야 한다(문제를 잘못 출제할 우려가 있으므로)

우리는 remotes 라는 공유된 Git 레포지토리를 생성함으로써 위 같은 요구를 충족시킬 수 있다. remote는 여러 협업자들이 같은 Git 레포지토리를 각기 다른 곳에서 작업할 수 있게 해주는 공유 레포지토리이다. 각 선생님들은 각자의 집에서 문제를 출제하고, 이를 remote에 등록하여 협업을 수행할 수 있다. 지금부터 Git으로 협업하는 방법에 대해 자세히 알아보도록 하자

 

 

 

git clone

 

Alice가 science-quizzes라는 remote 레포지토리를 만들었다고 가정하자. 이 remote 는 이제 당신을 포함한 선생님들이 작업할 곳이다. 먼저, 우리가 로컬에서 작업할 독립적인 remote의 복사본을 다음과 같은 명령으로 생성할 수 있다

git clone remote_location clone_name

위 명령에서 주어지는 파라미터는 다음과 같다:

  • remote_location - Git 에게 remote 레포지토리의 위치를 알려준다. 이 파라미터는 URL 주소나 파일 경로 등이 될 수 있다

  • clone_name - Git 이 remote 를 복사하여 생성할 디렉터리의 이름이다

우리는 먼저 다른 선생님들과 함께 작업할 remote 레포지토리인 science-quizzes 를 바탕화면에 만들어 보도록 하자. 그리고 그 안에 자유롭게 퀴즈를 하나 만들어보자

C:\Users\glafu\Desktop>mkdir science-quizzes

C:\Users\glafu\Desktop>vim ./science-quizzes/quiz1.txt

C:\Users\glafu\Desktop>cat ./science-quizzes/quiz1.txt
which one is not animal?
1) ant
2) lilac
3) giraffe
4) elephant

C:\Users\glafu\Desktop>

필자는 다음과 같은 폴더와 퀴즈를 만들었다. 그런다음, 해당 폴더로 이동하여 git init 한 후 add 하여 방금 만든 퀴즈를 커밋하도록 하자

C:\Users\glafu\Desktop>cd science-quizzes

C:\Users\glafu\Desktop\science-quizzes>git init
Initialized empty Git repository in C:/Users/glafu/Desktop/science-quizzes/.git/

C:\Users\glafu\Desktop\science-quizzes>git add .

C:\Users\glafu\Desktop\science-quizzes>git commit -m "Add a new quiz1"
[master (root-commit) 8847909] Add a new quiz1
 1 file changed, 5 insertions(+)
 create mode 100644 quiz1.txt

C:\Users\glafu\Desktop\science-quizzes>

git add의 파라미터로 온점(".")이 주어졌는데, 이는 현재 폴더에 있는 모든 파일을 add 한다는 뜻이다. 여기서는 quizz1.txt 파일만이 올라갔다. 그런 다음, 바탕화면으로 돌아가서 git clone 명령으로 science-quizzes를 클론 하자

C:\Users\glafu\Desktop\science-quizzes>cd ..

C:\Users\glafu\Desktop>git clone ./science-quizzes ./my-quizzes
Cloning into './my-quizzes'...
done.

C:\Users\glafu\Desktop>

Git 이 science-quizzes 레포지토리에 있는 모든 내용을 my-quizzes에 복사하였다고 알려주고 있다. my-quizzes 레포지토리는 우리가 로컬에서 작업할 Git 레포지토리이다. my-quizzes에서 작업하고 커밋하는 모든 일들은 다른 선생님들이 확인하지 못한다. 여기서는 구현의 편의상 remote 레포지토리가 로컬에서 작업하는 폴더와 동일한 경로에 존재하지만, 로컬에서 작업한 내용을 remote 에 등록 하지 않는 이상 remote 에 전혀 영향을 주지 않는다는 것을 기억하자. 즉, Alice 를 포함한 다른 선생님들은 remote 인 science-quizzes 만을 공유하기 때문에, my-quizzes 에서 우리가 작업한 내용들을 확인할 수 없다. 

 

 

 

git remote -v

 

휴! 드디어 우리는 선생님들과 함께 작업할 remote 인 science-quizzes와 로컬에서 작업할 remote의 복사본인 my-quizzes 를 구성하는걸 완료했다. 여기서 Git 이 보이지 않게 일한 것이 있는데, 바로 우리가 git clone 하고 난 뒤 remote 의 주소에 origin 이란 이름을 부여한 것이다. 그리하여 우리가 origin 이란 간단한 키워드로 remote를 참조할 수 있게 되었다! 즉, 정리하자면 remote = science-quizzes = origin 이 된 것이다. 다음과 같은 명령으로 Git 레포지토리의 remote 를 확인할 수 있다.

git remote -v

my-quizzes 폴더에서 위 명령을 실행하면 다음과 같다

C:\Users\glafu\Desktop\my-quizzes>git remote -v
origin  C:/Users/glafu/Desktop/./science-quizzes (fetch)
origin  C:/Users/glafu/Desktop/./science-quizzes (push)

C:\Users\glafu\Desktop\my-quizzes>

출력 결과를 주목해보자:

  • Git 이 remote의 이름(origin)과 함께 위치하는 경로를 나타내고 있다

  • Git 이 자동적으로 origin이라고 이름 지었는데, 이 이름은 나중에 변경할 수 있다

  • 두 줄이 출력되었는데, 위는 (fetch)이고 다른 하나는 (push)를 나타내고 있다

push에 대해선 다음 포스팅에 자세히 알아보도록 하자

 

 

 

git fefch

 

science-quizzes를 클론 한 뒤, 당신은 수업에 늦어서 급히 교실로 향하고 있다고 가정하자. 이때, 한 가지 불안한 생각이 뇌리를 스친다. 만약, Alice 선생님이 수업 도중 science-quizzes 의 내용을 변경하면 어떻게 되는거지? 그렇게 되면, 우리가 방금 클론한 my-quizzes는 더 이상 최신이 아니게 된다. 하지만 걱정하지 않아도 좋다. Git은 remote의 변경사항을 손쉽게 가져올 수 있는 다음과 같은 명령어를 제공하니까!

git fetch

위 명령은 remote의 변경사항을 로컬 레포지토리에 merge 하지 않는다. 단지 변경사항들을 remote라는 브랜치로 가져온다. 실제 작동하는 방식을 확인하기 위해 science-quizzes 폴더에 퀴즈를 하나 추가해보자

C:\Users\glafu\Desktop\my-quizzes>cd ../science-quizzes

C:\Users\glafu\Desktop\science-quizzes>vim quiz2.txt

C:\Users\glafu\Desktop\science-quizzes>cat quiz2.txt
which one is true?
1) 1 + 1 = 2
2) 1 * 1 = 2
3) 1 - 1 = 2
4) 1 / 1 = 2

C:\Users\glafu\Desktop\science-quizzes>git add .

C:\Users\glafu\Desktop\science-quizzes>git commit -m "Add a new quiz2"
[master 20a5807] Add a new quiz2
 1 file changed, 5 insertions(+)
 create mode 100644 quiz2.txt

C:\Users\glafu\Desktop\science-quizzes>

자, 이제 my-quizzes로 돌아가서 remote의 변경사항들을 fetch 해보자

C:\Users\glafu\Desktop\science-quizzes>cd ../my-quizzes

C:\Users\glafu\Desktop\my-quizzes>git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From C:/Users/glafu/Desktop/./science-quizzes
   8847909..20a5807  master     -> origin/master

C:\Users\glafu\Desktop\my-quizzes>

fetch 하여도 변경 사항들이 my-quizzes에서 보이지 않는다. 변경 사항들은 origin/master라는 브랜치에 존재하고 있기 때문이다. 현재 우리가 위치하고 있는 브랜치는 master 이므로 remote의 변경 사항들을 확인할 수 없다. 그러나 우리는 두 브랜치를 병합하는 git merge에 대해서 배웠다. 여기서도 동일하게 적용할 수 있는데, origin/master의 변경 사항들을 master에 적용시켜 보자

C:\Users\glafu\Desktop\my-quizzes>git merge origin/master
Updating 8847909..20a5807
Fast-forward
 quiz2.txt | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 quiz2.txt

C:\Users\glafu\Desktop\my-quizzes>

자 merge가 완료되었으니 quiz2.txt 가 새롭게 생성되었는지 확인해보자

C:\Users\glafu\Desktop\my-quizzes>ls
quiz1.txt  quiz2.txt

C:\Users\glafu\Desktop\my-quizzes>

예상대로 quiz2.txt 가 새롭게 생성되어 있음을 확인할 수 있다.

 

 

 

 

지금까지 협업을 수월하게 도와주는 Git 공유 레포지토리인 remote와 이를 활용하는 방법에 대해서 알아보았다. 이번 포스팅에서는 remote를 생성하고 remote 를 클론 하여 복사본인 로컬 레포지토리를 만들며, remote의 변화를 로컬 레포지토리에 적용시키는 방법을 알아보았다. 다음 포스팅에서는 로컬 레포지토리의 변화를 remote에 적용시키는 방법을 알아보고 Git teamworking 방법을 Generalization 해보도록 하자.

Comments