프로그래밍/깃&깃허브

[깃&깃허브] 05. 깃허브로 협업하기 (p.166~201)

aSpring 2021. 3. 20. 20:18
728x90
728x90

2021/01/16 - [분류 전체보기] - Do it! 공부단

2021/02/19 - [프로그래밍/깃&깃허브] - [깃&깃허브] 01. 깃 시작하기 (~p.37)

2021/02/20 - [프로그래밍/깃&깃허브] - [깃&깃허브] 02. 깃으로 버전 관리하기 (p.38~83)

2021/02/22 - [프로그래밍/깃&깃허브] - [깃&깃허브] 04. 깃허브로 백업하기 (p.131~165)

 


 

05 깃허브로 협업하기

깃허브에 원격 저장소 만들기 > 팀 프로젝트 파일 전부 올려두기 > 팀원들은 각자 원하는 시간, 장소에서 편하게 프로젝트 파일에 접근 가능

커밋을 푸시할 때 일일이 시간, 장소를 정해 모이지 않아도 소통 가능하도록 의견을 나눌 수 있는 간단한 기능도 제공

<팀 프로젝트를 할 때 깃허브를 어떻게 사용하는지 알아보자>
- 하나의 원격 저장소를 중심으로 둘 이상의 지역 저장소와 연결하는 방법
- 연결된 원격 저장소와 지역 저장소와 동기화하는 방법

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

<깃허브 협업 연습>
- 1인 프로젝트 : git_home, git_office를 개인 컴퓨터의 저장소와 회사 컴퓨터의 저장소라고 상상해도 되고, 하나는 PC, 하나는 노트북의 저장소라고 상상
- 모두 하나의 깃허브 계정으로 둘 이상의 컴퓨터에서 원격 저장소를 공유해 버전을 관리하는 방법

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

원격 저장소를 기존 연결된 지역 저장소 외에 다른 지역 저장소에서 사용하려면 -> 원격 저장소에 담긴 내용 전체를 지역저장소로 가져와야 함 -> '복제한다', '클론(clone)', '클로닝(cloning)'

 

1. 04장에서 만든 test-1 원격 저장소 계속 사용 : test-1 저장소를 git_home이라는 저장소로 복제

clone or download > clone with https > 원격 저장소의 주소 복사

2. 터미널 창에서 git_home, git_office 디렉터리를 만들 위치로 이동(홈 디렉터리) 

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

 

이때, git_home, git_office라는 이름의 디렉터리가 없다면 자동으로 디렉터리가 만들어짐

-> 개인 컴퓨터와 회사 컴퓨터 양쪽에 복제됐다고 생각하기

※ 원격 저장소를 현재 디렉터리에 복제하려면 git_home 대신 마침표(.) 입력

3. 터미널 창에서 방금 만든 디렉터리 확인 : ls -al

4. 새로 만든 두 디렉터리에 각각 같은 내용이 저장죄어 있는지 확인

- 각 디렉터리에서 git log 해보고 똑같은 커밋이 저장되어있는지 확인

5. 원격 저장소를 복제하면 자동으로 지역 저장소 - 원격 저장소가 연결됨

- git_home, git_office 디렉터리에서 git remote -v 명령 사용 시 연결되어있는지 확인 가능

 

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

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

1. git_home 디렉터리에서 텍스트 문서를 열고 간단한 내용 추가

(추가하는 내용이 아니라 커밋하는 것이 중요)

- f1.txt 문서에 c 추가 > 스테이징, 커밋(메시지 : add c)

2. git push 명령 사용해 커밋을 원격 저장소에 올리기

3. 깃허브 원격 저장소로 접속 > 제대로 커밋이 올라왔는지 확인 : [commits]

4. 마지막으로 커밋한 'add c'라는 커밋이 올라와 있음

- 이렇게 원격 저장소의 내용을 복제한 지역 저장소에서 내용 수정, 커밋 후 다시 원격 저장소에 올릴 수 있음

 

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

개인 컴퓨터에서 커밋 푸시 > 회사 컴퓨터에서 원격 저장소를 복제했을 때와 원격 저장소의 커밋 상태가 달라짐
따라서 회사 컴에서 작업하려면 먼저 원격 저장소에 새로 올라온 거밋을 가져와야 함

1. 앞에서 복제 과정 거침 > git_office의 master 브랜치는 origin에 이미 연결되어 있음

터미널 창에서 git_office 디렉터리로 이동 > git pull 명령 사용 : 앞에서 원격 저장소에 새로 올라온 커밋을 가져옴

※ cd ~/get_office 명령 = cd ~ 명령 + cd git_office 명령을 한꺼번에 처리한 것

 

2. 저장소에 있는 f1.txt 파일 수정

: 개인 컴퓨터(git_home)에서 수정했던 'c'가 포함되어 있을 것 > 회사 컴퓨터(git_office)에서는 영문 대문자 d를 추가, 저장, add d 라는 메시지와 함께 커밋 후 원격 저장소로 푸시

 

3. 웹 브라우저에서 깃허브 저장소 열고 [commit] 확인 > 커밋 수가 1개 늘어났을 것이고, 해당 부분 클릭 시 방금 회사 컴퓨터에서 푸시한 커밋이 올라와 있을 것

 

4. 다시 개인 컴퓨터(get_home 디렉터리)에서 작업할 때는 git pull 명령 > 원격 저장소에 있는 최신 커밋을 가져와 작업 시작 > git log 확인 시 회사 컴퓨터(git_office 디렉터리에서) 푸시했던 add d라는 커밋이 개인 컴에도 들어와 있을 것

05-02 원격 브랜치 정보 가져오기

git pull 명령 : 원격 저장소의 최신 커밋을 지역 저장소에 합쳐줌
하지만 최신 커밋을 합치기 전에 원격 저장소에 어떤 변화가 있었는지 먼저 살펴봐야 함
이럴 때는 원격 브랜치에서 정보만 가져오는 방법, 가져온 정보를 지역 저장소에 병합하는 과정

원격 master 브랜치

원격 저장소도 만들 때 기본적으로 master 브랜치가 생성됨

1. 깃허브에서 test-1 저장소로 접속 > [commit] > add d 커밋이 마지막 일 것

원격 저장소에 있는 HEAD : 원격 저장소의 master 브랜치를 가리키고, 원격 master 브랜치는 add d 라는 최종 커밋을 가리킴

2. 터미널 창에서 git_home 디렉터리로 이동 > git log 명령으로 커밋 상태 확인

- 최종 커밋인 add d 앞에 (HEAD -> master, origin/mster, origin/HEAD) 표시

- HEAD -> master는 이 커밋이 지역 저장소의 최종 커밋이라는 뜻, origin/master는 원격 저장소의 최종 커밋

- 아직 git_home 디렉터리가 원격 저장소를 복제한 상태 그대로 -> 지역 저장소, 원격 저장소 모두 최종 처밋이 같음

3. git_home 디렉터리에 새로운 커밋 만들어 보기

- 빔 사용 f3.txt 만들고 a 입력 > 스테이징, 커밋(create f3)

4. git log --oneline : 커밋 로그 한눈에 확인

- (HEAD -> master) : 방금 커밋한 create f3.txt를 가리킴 -> 지역 저장소의 최종 커밋이 create f3.txt라는 뜻

하지만 (origin/master, origin/HEAD)는 아직 add d 커밋을 가리키고 있음

5. 이 상태에서 git status

- 현재 master 브랜치가 origin에 있는 원격 master 브랜치의 버전보다 하나 앞서 있는 것을 확인 가능

- git push 명령으로 지역 저장소의 커밋을 원격 저장소로 올리라고 알려줌

6. git push 명령 사용 > create f3.txt 커밋을 원격 저장소로 올림

- 로그 확인 : 푸시하기 전까지는 master 브랜치와 origin/master 브랜치가 가리키는 커밋이 달랐지만, 푸시 후에는 master와 origin/master 브랜치가 같은 커밋을 가리키게 됨

 

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

- fetch : 불러오다, 가져오다 > 원격 저장소의 정보를 가져오는 기능

- pull : 원격 저장소의 커밋을 가져와 무조건 지역 저장소와 합친다면, fetch는 원격 브랜치에 어떤 변화가 있는지 그 정보만 가져옴

- 팀 작업 시 다른 사람이 수정한 소스를 한번 더 훑어보고 지역 저장소와 합치고 싶다면 풀 대신 페치를 사용해 커밋을 가져온 다음 지역 저장소와 합치면 됨

 

1. 회사 컴퓨터 저장소로 이동 > 터미널 창에서 git_office 디렉터리로 이동 > git fetch 입력

- 원격 저장소에서 무언가 가져올 것

2. ls -al 명령 사용 > 어떤 파일이 있는지 살펴보기

- 분명 원격 저장소에 있던 커밋을 가져왔는데 git_home에서 원격 저장소로 푸시했던 f3.txt 파일이 보이지 않음

3. git log 명령 사용

- (HEAD -> master)만 보이고 원격 저장소의 origin/master는 보이지 않음 : 원격 저장소의 최신 커밋 정보를 가져왔지만 아직 지역 저장소에 합쳐지지 않아 원래 git_office에 있던 최신 커밋만 나타나기 때문

4. git status 명령 : 현재 브랜치가 origin/master에 비해 1개의 커밋이 뒤처져 있다고 나옴. 즉, 원격 저장소의 최신 커밋 하나가 아직 지역 저장소에 반영되지 않았다는 뜻

- git pull 명령을 사용하면 지역 저장소를 업데이트 할 수 있다고 알려줌

5. 페치로 가져온 최신 커밋 정보는 FETCH_HEAD라는 브랜치로 가져옴 > 이 정보는 지역 저장소에 바로 반영되지 않음

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

※ 지역 저장소의 최신 커밋과 페치한 커밋의 차이를 비교하려면 git diff HEAD origin/master 입력

7. FETCH_HEAD 브랜치에서 git log 명령 사용 > 최신 커밋에 origin/master와 origin/HEAD가 표시되어 있음.

- 즉 이 커밋이 페치로 가져온 원격 브랜치의 최신 커밋 : 이 내용을 살펴보고 원격 브랜치의 최신 커밋을 지역 저장소에 합칠지 말지 결정하면 됨

8. 페치한 후 최신 커밋을 현재 브랜치에 합치려면 git pull 명령 사용 > 원격 저장소의 소스를 내려받을 수도 있고, git merge 명령으로 FETCH_HEAD에 있던 커밋을 병합할 수도 있음

- master 브랜치로 이동한 뒤 git merge 명령으로 병합하기

9. git log로 커밋 로그 확인 > create f3.txt라는 최신 커밋이 지역 저장소에 반영된 것을 볼 수 있음

 

- git pull : git fetch + fit merge FETCH_HEAD 명령 두 개를 합친 것과 같은기능

즉, git fetch를 사용해 원격 브랜치를 가져온 다음 git merge 명령을 사용해 원격 브랜치와 현재 브랜치를 합쳐주는 것을 git pull 명령으로 한꺼번에 할 수 있음

 

[한 걸음 더!] 페치로 가져온 브랜치 한 번에 병합하기

- 패치한 뒤 병합할 때 원격 master 브랜치에 있는 커밋이라면 다음과 같이 병합

git merge origin/master

 

- 다른 브랜치에 있는 커밋이라면 다음과 같이 병합

git merge origin/브랜치 이름

 

- 하지만 매번 브랜치 이름을 써야 한다면 번거로움 -> 다음과 같이 명령시 페치한 뒤 지역 저장소에 반영하지 않은 최신 커밋 병합 가능

git merge FETCH_HEAD

 

05-3 협업의 기본 알아보기

하나의 작업을 여러 사용자가 협업하기 위해서는 각자 지역 저장소에서 작업한 내용을 자유롭게 원격 저장소에서 공유할 수 있어야 함

공동 작업자 추가하기

예제 : 사용자 총 세명(팀장, 팀원1, 팀원2)

깃허브 공개 저장소 : 주소만 알면 누구든 접속해서 올라와 있는 소스 볼 수 있고, 깃허브 회원 누구나 오픈 소스 프로젝트의 소스를 내려받을 수 있다. 하지만 승인된 공동 작업자에게만 커밋을 올릴 수 있는 권한이 있다.

팀장 : manuals라는 저장소를 만들고 > Settings > Collaborators > 팀원 1, 팀원 2의 깃허브 아이디나 메일 주소 입력 > Add Collaborator
팀원 1, 2 : 협업자로 초대됐다는 메일, 깃허브 메시지 > [Accept Invitation]
===> 공동 작업자들이 모두 초대 수락 시 Collaborator 화면에 사용자 이름만 나타나게 됨

작업 환경 구성하기

이제 팀장, 팀원 1, 팀원 2가 번갈아 커밋을 올리거나 내려받으며 작업 가능(둘 이상의 컴퓨터에서 하나의 깃허브에 접속하는 것)
--> 실습 불가 : 나중에 팀 프로젝트 할 일이 있으면 참고해서 하자!

<각 작업자의 컴퓨터에 지역 저장소 만들기>

2. 각자 공동 작업에서 사용할 이름, 이메일 주소 저장
- 저장소마다 다른 이름이나 메일 주소를 사용하기 위해 git config 명령 사용 시 --global 옵션을 빼고 이름, 메일 주소 지정
git init manuals
cd manuals
git config user.name "사용자 이름"
git config user.email "메일 주소"

 

원격 저장소에 첫 커밋 푸시하기

팀장이 overview.txt 문서를 만들고 커밋 후 원격 저장소의 master 브랜치로 푸시하는 과정 살펴보기

1. 빔으로 overview.txt 문서 작성 + 스테이징 + 커밋
vim overview.txt
git add overview.txt
git commit -m "overview"

2. 지역 저장소의 커밋을 원격 저장소에 푸시하기
- 먼저 원격 저장소 주소 복사
- 터미널 창에서 깃의 origin에 복사한 주소 지정 : git remote add origin 복사한 저장소 주소
- origin의 master 브랜치에 커밋 올리기 : git push -u origin master
(-u : 다음부터 git push 명령만으로 원격 저장소의 master 브랜치에 커밋 올릴 수 있음)

3. 깃허브 원격 저장소를 확인하면 팀장이 올린 overview.txt 문서의 최종 커밋이 올라와 있을 것

공동 작업자 컴퓨터에 원격 저장소 복제하기

원격 저장소에서 협업 시 공동 작업자는 자신의 작업을 진행하기 전, 원격 저장소를 복제(clone)함
git clone 원격 저장소 주소

첫 번째 커밋이 아니라면 풀 먼저하기

여러 사람이 함께 문서를 수정, 푸시하기 때문에 반드시 작업하기 전 원격 저장소의 최신 커밋을 먼저 풀한 다음 자신의 커밋을 푸시해야 함

1. 팀원 모두 원격 저장소 복제 -> 팀장이 overview.txt를 수정 -> update overview 메시지와 함께 커밋+푸시
vim overview.txt
git commit -am "update overview"
--> 팀원 1, 팀원 2가 저장소를 복제한 뒤 원격 저장소에 새로운 커밋이 올라온 것

2. 팀장이 새 커밋을 만들어 원격 저장소에 푸시하는 동안 팀원 1이 다른 컴퓨터에서 다른 커밋을 푸시한다고 가정
- 팀원 1의 컴퓨터에서 apple.txt 문서 작성 후 커밋
vim apple.txt
git add apple.txt
git commit -m "apple"

3. 팀원 1이 작성한 커밋을 원격 저장소에 푸시
git push -u origin master

==> 예상치 못한 오류  : rejected
저장소에 있는 최신 커밋 정보가 팀원 1의 컴퓨터에 저장되어 있지 않기 때문에 나타는 것으로, 이런 오류가 생기지 않게 하려면 자신의 커밋을 푸시하기 전에 원격 저장소의 최신 커밋을 가져와야 함 : git pull
※ 원격 저장소의 최신 커밋과 지역 저장소의 커밋이 서로 관련 없다면 git fetch 명령을 사용해서 가져오기만 해도 됨

4. 자동으로 빔이 실행되면서 커밋 메시지 표시됨(기본 메시지 그대로 사용 혹은 원하는 내용 추가)

5. 원격 저장소에서 최신 커밋 정보를 가져왔으므로 이제 팀원 1이 만들었던 커밋을 푸시할 수 있음
git push -u origin master

 

05-4 협업에서 브랜치 사용하기

협업 -> 팀원들이 각자 다른 기능을 맡아서 작업하는 경우가 많음
팀원 1 : 기능 A 만들기
팀원 2 : 기능 B 만들기
..
-> 각자의 작업이 master 브랜치에 있는 문서들과 섞이지 않도록 새 브랜치를 만들어 버전 관리
-> 각 팀원이 만든 새 브랜치 역시 원격 저장소에 그대로 푸시 가능

새로 만든 브랜치 푸시하기

팀장이 새로운 기능을 만들기 위해 자신의 지역 저장소에 f라는 브랜치를 만들고 커밋한 다음 원격 저장소에 푸시하는 과정 살펴보기

1. 원격 저장소에 다른 팀원들의 커밋이 추가되어 있는지 확인하기 위해 먼저 최신 커밋 정보 가져오기

git pull

 

2. 새로운 기능을 구현하기 위해 지역 저장소에 브랜치 f를 만들고 f로 체크아웃

git checkout -b f

※ git checkout 명령에 '-b' 옵션 : 브랜치를 만들고 체크아웃하는 것이 한꺼번에 가능

(이미 f 브랜치가 있다면 f 브랜치로 체크아웃)

 

3. 빔을 사용해 f1.txt를 만든 후 커밋(커밋 메시지 : features1)

vim f1.txt
git add f1.txt
git commit -m "features1"

 

4. 원격 저장소에 f 브랜치까지 함께 푸시해야 함

git push origin f

- git push 뒤에 origin f 를 추가하면 원격 저장소(origin)에 f 브랜치를 푸시한다는 의미

 

5. 푸시가 끝나면 웹 브라우저에서 원격 저장소로 접속 -> 저장소 파일 목록 위에 '2 branches'라고 되어 있고, 클릭 시 방금 푸시한 브랜치가 나타남

 

풀 리퀘스트로 푸시한 브랜치 병합하기

아직 원격 저장소의 파일 목록에는 f 브랜치에서 만들었던 f1.txt 파일이 없는데, 푸시한 브랜치는 풀 리퀘스트(pull request)를 통해 병합해야 원격 저장소에 반영되기 때문

1. 브랜치 설명 옆에 있는 [New pull request] 클릭

2. 풀 리퀘스트 메시지 작성 > [Create pull request] > 협업 중인 저장소에 풀 리퀘스트가 전송됨

3. 협업 중인 원격 저장소에 등록된 풀 리퀘스트는 공동 작업자 누구나 살펴보고 병합 가능

- 저장소 파일 목록 위 [Pull request] 클릭 : 등록된 풀 리퀘스트 목록이 나타남 > 등록된 풀 리퀘스트 클릭

4. 풀 리퀘스트 메시지를 살펴보고 내용에 문제가 없으면 [Merge pull request] 클릭하여 병합

- 필요시 이 공간을 통해 풀 리퀘스트를 남긴 사람과 메시지를 주고받을 수 있음

5. 커밋 메시지를 직업 입력하거나 기본 메시지 사용 가능하며, [Confirm merge] 클릭 > 브랜치 병합 끝

6. 해당 브랜치에 있던 파일이 master 화면에 나타남

- 브랜치 상태를 알고 싶으면 2 branches 클릭 : 브랜치가 병합된 상태라면 'merged'라고 표시되어 있고, 공동 작업자 중 누가 병합했는지도 알 수 있음

 

깃허브에서 협업 시 보통 작업자마다 브랜치를 만들어 진행

작업 중간중간 풀 리퀘스트를 보내 master 브랜치에 병합

-> 다른 작업자의 변경 내용을 바로 반영하기 위해 항상 풀(pull)부터 한 후 자기 작업 진행하기

05장에서 꼭 기억해야 할 명령

git clone 원격 저장소 주소 myhome 원격 저장소를 myhome이라는 지역 저장소로 복제
git fetch 원격 저장소의 커밋을 가져오기만 하고 병합X
git checkout FETCH_HEAD 페치로 가져온 정보가 있는 브랜치(FETCH_HEAD)로 이동
git merge FETCH_HEAD 페치로 가져온 정보가 있는 브랜치(FETCH_HEAD)를 master 브랜치에 병합
git config user.name 현재 깃 환경에서 사용할 이름 지정
git config user.email 현재 깃 환경에서 사용할 메일 주소 지정
git checkout -b fixed fixed 브랜치를 만들고 동시에 체크아웃
git push origin f 원격 저장소에 f 브랜치의 커밋 올리기

 

728x90
728x90