Github 기초 사용법 - 2



  이번 포스트에서는 로컬 저장소에서 작업한 내용을 Github의 원격저장소로 push하는 등의 원격저장소 활용방법에 대해 다룬다. github의 기본 명령어 (git init & status & add & commit) 및 Branch 와 충돌관리에 대해 잘 모른다면 이전 포스트 [Project Management/Github] - Github 기초 사용법 - 1를 참고하세요.





목 차


   1. Github 레퍼지토리 생성
   2. 원격저장소 연결(git remote)
   3. git push (로컬 -> 원격)
   4. 원격저장소와 로컬저장소 충돌 문제 (git pull & fetch)
   5. fork/clone 와 pull request






1. Github 레퍼지토리 생성

 
 Github의 계정을 생성한 후, Repositories 메뉴의 New 버튼을 통해 레퍼지토리를 생성한다. 지금은 README 파일은 생성은 하지말자.



 생성하면 다음과 같이 레퍼지토리가 생성된다. 레퍼지토리의 URL을 복사하자. Git Bash에서 이 원격 저장소와 연동을 위해 이 원격 저장소의 주소가 필요하다.










2. 원격저장소 연결 (git remote)

 
 Git Bash 터미널로 돌아가 이전 포스트[Project Management/Github] - Github 기초 사용법 - 1에서 작업했던 환경에서  방금 생성한 원격 저장소를 연결해보자. 그리고 git remote -v 로 목록을 확인해보자. 통상적으로 origin이란 별명을 사용한다.

 git remote add [원격저장소 별명] [원격저장소 주소] : 원격저장소 추가
 git remote -v : 원격저장소 목록 확인

e.g. remote add origin https://github.com/lis123kr/github.tutorial.git



 아무 변경사항이 없어보인다. 하지만 추가한 원격 저장소를 통해 이제 로컬 환경의 작업내역을 원격으로 전송할 수 있다.






3. git push (로컬 -> 원격)


 git push [원격저장소 별명] [브랜치 명] : 원격저장소에 [브랜치 명]의 작업내용을 전달

 git push 명령어를 통해 원격저장소에 변경 내용을 발행해보자. git push origin --all 을 통해 모든 브랜치를 전송하였다. 그리고 github의 원격 저장소에도 업로드된 것을 확인할 수 있다.



 







4. 원격저장소와 로컬저장소 충돌 문제 (git pull & fetch)

 
 이번에는 원격 저장소와 로컬 저장소의 간격을 메우는 과정을 살펴보자. 새로운 기능을 로컬 저장소에서 구현했을 때는, commit하고 push하여 로컬 저장소에 업로드하면 되지만, 다른 팀원이 개발한 내역이 있어 원격 저장소의 작업 내역이 나의 로컬의 작업내역과 다를 때는 내 변경사항을 원격저장소에 업로드(Push)하면 충돌이 발생한다.

 이럴 때는 원격저장소의 변경사항과 나의 로컬저장소의 간격을 없애야한다. 즉, 원격저장소의 최신 변경사항으로 맞추어야 내 로컬 변경사항을 업로드할 수 있다. 이를 위한 명령어가 fetch와 pull이다. 

 git fetch : 원격 저장소의 변경 사항(commit) 들을 로컬저장소로 가져온다. (commit 내역을 가져온다)
 git pull   : 원격 저장소의 변경사항을 가져와 로컬에 병합한다.

 즉, git pull은 git fetch하고 git merge까지 해준다고 볼 수 있다. 그럼 이제 직접 해보자.

원격 저장소와 로컬 저장소의 간격을 만들기 위해 원격 저장소에서 내용을 수정해보자. github 저장소에서 C코드를 선택해 '펜' 버튼을 누르면 바로 수정가능하다. 주석 한줄을 추가한 후 밑에 commit 버튼을 통해 변경을 완료한다.

  




  이로써, 원격저장소에는 commit이 하나 더 생겼다. 내 로컬 환경과 간격이 생겼고, 로컬 환경에서 마찬가지로 주석을 작성해 push해보면 충돌이 발생한다.

 


 당연히 원격저장소와 로컬 저장소가 변경내역이 다르기 때문이다(원격과 로컬 각각 커밋이 하나씩 더 있다) . hint에는 git pull을 사용하라고 알려주지만 git fetch를 사용해보자. git fetch를 하면 아무 변화가 없어보인다. 파일도 로컬에서 변경한 내용 그대로이다. 하지만 git branch -a를 해보면 원격저장소의 임의의 브랜치(origin/master)가 생성되었다.

  


 git merge origin/master를 통해 원격저장소의 변경내역과 병합해보자. 변경내역에 충돌이 없다면 바로 병합이 되지만, 여기서 변경한 내역에는 충돌되는 부분이 있어 충돌이 발생했다. 충돌이 난 부분을 git diff를 통해 확인하고 해결하자.

 



 충돌을 해결한 후 원격저장소에 push하면 이제는 원격저장소와 로컬저장소가 같은 최신의 작업내역을 갖고있기 때문에 push 시 에러가 발생하지 않는다.




 지금까지의 변경내역을 그래프로 그려보면 다음과 같다. 각 점은 commit 내역을 의미하고 branch를 생성하고 병합한 내역과, 원격 저장소에서의 변경과 병합한 내역을 확인할 수 있다. 이 그래프는 Github 레퍼지토리에서 [Insights - Network]를 통해 확인할 수 있다.

   










5. fork/clone 와 pull request


 마지막으로 오픈소스의 발전 속도를 가속화하는 기능인 fork와 pull request에 대해 알아보자.

fork               : 다른 사용자의 원격저장소를 내 원격 저장소 복제
clone            : 원격 저장소를 로컬 저장소에 복제
pull request  :  저장소 간의 병합요청

  fork는 말 그대로 다른 사용자의 저장소를 내 저장소에 똑같이 복사하는 기능이다. pull request는 복사한 다른 사용자의 저장소에서 여러 기능 수정 및 추가를 한 후, 나의 변경 내역을 저장소 소유자(오리지널 저장소)에 병합요청을 하는 기능이다. 즉, 다른 사람의 소스를 내가 수정하고 변경요청을 통해 '기여'할 수 있는 기능이다.


 


 이를 직접 실습하기 위해선 또 하나의 계정이 필요하다. (저자는 두 개 있다)  다른 계정으로 지금까지 작업해온 저장소를 fork해보자. 레퍼지토리오른쪽 상단의 fork 버튼을 누르면 된다. fork 된 저장소의 원격 저장소 주소를 복사하여 git Bash에서 새로운 환경에 clone해보자. 




 
 clone한 저장소에서 git remote -v를 해보면 자동으로 복사했던 원격저장소(fork한)의 주소와 연결되어있다. 약간의 코드 수정을 하고 push까지 해보자. 
 


 
 Push까지 완료하면 fork 했던 원격 저장소를 보면 다음과 같이 커밋이 업데이트 되어있고, 기존 저장소와는 다르게 pull request가 있음을 확인할 수 있다. pull request를 해보자.




본 저장소와 fork 저장소의 변경사항을 보여주고 Create pull request 버튼을 통해 pull request를 생성할 수 있다. pull reqeust를 생성할 때, 보통 오픈소스 프로젝트에서는 template이 있어, 템플릿에 맞게 내용을 작성하여 병합요청을 해야한다.  





 다시 소유자의 계정으로 돌아가보자. pull reqeust 메뉴에 다른 사용자가 요청한 pull request가 생성되어있고, 내용을 확인할 수 있다.

 pull request를 받은 본 저장소의 소유자는 변경 내용을 확인하고 적합하다면 merge 버튼을 통해 병합할 수 있고, 또는 변경을 요청하며 병합을 거절할 수 있다.

 





 Merge를 하면 다른 유저가 변경한 코드 변경 내역을 원래의 저장소에 병합하게 된다. 다음 시간에는 위 이미지에서 오른쪽에 보이는 Reviewers 및 Labels, Project, Milestone에 대해 포스트할 계획이다.


+ Recent posts