github repository에 push 및 pull request하기

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@nadongguri·
0.000 HBD
github repository에 push 및 pull request하기
이 포스트에선 제가 upstream repository에 pull request를 하는 방법을 알려드리고자 합니다. 
정리해 보니 다음과 같이 크게 7단계로 나뉠 수 있겠네요.

1. repository(repo로 하겠습니다.)를 fork 하기
1. fork된 repo를 local로 clone하기
1. upstream remote추가하기
1. Issue 만들기 (혹은 있다면 assign)
1. patch 만들 branch 생성하고 작업하기
1. patch를 fork repo에  push 하기
1. upstream repo에 pull request 하기

실습 환경은 ubuntu 16.04 LTS 입니다.
git에 대한 추가 설명은 ([여기](https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EC%A0%80%EC%9E%A5%EC%86%8C))를 참고하세요.

 

## repository를 fork 하기
제가 pull request를 올릴 repository는 [https://github.com/lunchclass/absolute](https://github.com/lunchclass/absolute) 입니다. 
해당 project에 contribution을 하는 방법은 여러 가지가 있겠지만 일반적인 경우 (해당 project에 owener가 아닌 이상) 자신의 계정으로 project를 fork 하여 fork한 repository에서 작업을 해야 합니다.

fork 대상이 되는 repository를 보통 upstream repository라고 부르며 repository로 줄여서 repo라고 말합니다. 
여기에선 lunchclass의 absolute project가 upstream이 되겠네요. 
clone이 되면 fork하는 방법은 간단합니다.  브라우저로 위 페이지를 띄운 후 fork 버튼을 누르기만 하면 됩니다.
![](https://steemitimages.com/DQmYNFzFXNxSJvJqxZSwUTAr66i8437axV7Gzn8ZnK89wha/image.png)
우측 상단의 fork 버튼을 클릭합니다.
CD를 굽는 듯한 loading animation이 나온다음 제 github id인 nadongguri에 absolute repository가 생성되었습니다!

![](https://steemitimages.com/DQmQpWLFAY6Kb56g3a8ZyWqqxBjYNNvWw449DAXDYKGz7Mu/image.png)
좌측 상단을 보면 nadongguri/absolute 로 repo가 새로 생겼습니다.

## fork된 repo를 local로 clone하기
그럼 이제 개발을 하기 위해 absolute porject를 local로 받아보겠습니다. fork된 해당 페이지에서 녹색 버튼인 **clone or download** 를 선택하면 git 경로와 project source를 zip으로 묶어 다운받을 버튼이 추가로 나타납니다.
![](https://steemitimages.com/DQmZZjKPguyQAPMWPEmrPV9VMfcA3NaL3RpeWeT5EmcPjux/image.png)


저는 terminal에서 다음 명령어를 실행해 project을 받겠습니다.

**git clone https://github.com/nadongguri/absolute.git**

아래는 제 terminal에서 위 명령어를 실행했을 때의 결과 입니다.

root@nadongguri:~/github/lunchclass/blog# git clone https://github.com/nadongguri/absolute.git
Cloning into ‘absolute’…
remote: Counting objects: 5772, done.
remote: Total 5772 (delta 0), reused 0 (delta 0), pack-reused 5771
Receiving objects: 100% (5772/5772), 25.90 MiB | 6.88 MiB/s, done.
Resolving deltas: 100% (1389/1389), done.
Checking connectivity… done.

 

## upstream remote추가하기
open source에서 project는 여러 사람들이 동시 다발적으로 코드를 수정하기 때문에 코드의 변화량이 많고 마치 project가 살아 있는 것 처럼 보이기도 합니다.  몇몇 예외 사항을 제하곤 일반적으로 project의 최신 코드 베이스(latest)를 맞춰 개발을 하는데요. lunchclass의 absolute project을 upstream remote로 추가하겠습니다. 추가하는 이유는 진행하면서 설명하겠습니다.

다음 명령어를 실행해 upstream remote를 추가합니다.

git **remote add upstream** https://github.com/lunchclass/absolute.git

git에는 수 많은 명령어가 존재합니다. 하나 하나씩 알아가는 재미가 있는데 차차 배우기로 하고 위 remote 명령어에 add 옵션을 주고 따라오는 remote name과 path를 주면 name과 path를 local repo에 추가하라는 내용 입니다.

git remote -v를 입력해 보면

root@nadongguri:~/github/lunchclass/blog/absolute# git remote -v
origin https://github.com/nadongguri/absolute.git (fetch)
origin https://github.com/nadongguri/absolute.git (push)
**upstream https://github.com/lunchclass/absolute.git (fetch)
upstream https://github.com/lunchclass/absolute.git (push)**

upstream remote가 추가되어 있습니다. 여기서 origin이 보이는데요, 
맨 처음 clone할 때의 repository 경로가 origin이 됩니다. 
그러면 이제 origin, upstream remote를 가지고 어떻게 개발을 시작하냐면 저는 다음과 같은 순서를 따릅니다.

origin의 master branch를 upstream의 master branch 최신 코드 base로 맞춘다.
origin의 master branch에서 새로운 branch를 생성한다. (예: readme_patch)
새로 생성된 branch에서 개발을 하고 push, pull requset를 날린다.
작업이 끝나면 새로운 작업을 위해 1 ~ 3을 반복한다.
local에 있는 origin remote의 master branch를 upstream remote의 최신 코드 base에 맞춰 놓고 새로 branch를 따서 작업을 하면 늘 최신 상태에서 개발을 하기 때문에 merge를 비롯한 기타 이슈가 발생할 가능성이 적습니다.

 

local의 origin remote(origin이라 표현 하겠습니다.)의 master branch에 upstream의 master branch 최신 코드를 받아 보겠습니다.

먼저 local의 branch를 확인합니다.

**git branch**

root@nadongguri:~/github/lunchclass/blog/absolute# git branch
* master

master branch로 되어 있네요. 그럼 다음 명령어를 실행합니다.

**git pull upstream master**

root@nadongguri:~/github/lunchclass/blog/absolute# git pull upstream master
From https://github.com/lunchclass/absolute
* branch master -> FETCH_HEAD
Already up-to-date.

저의 경우는 좀 전에 코드를 받은 상태라 Already up-to-date라고 뜹니다. 위의 pull 명령어에 remote, branch를 입력하면 해당 remote의 branch 코드를 현재 branch로 받아오게 됩니다. 그래서 origin의 master branch로 upstream의 master branch의 코드를 받아오게 되겠지요.  이제 최신 코드도 받았으니 개발을 시작해 보겠습니다. 우선 무슨 작업을 할지 할 일이 있다면 하면 되고 없다면 Issue 게시판에서 Issue를 선택하거나 Issue를 제기해 일을 시작할 수 있습니다.

## Issue 만들기 (혹은 있다면 assign)
Absolute project 웹 페이지에 가보시면 현재 기준으로 readme가 썰렁합니다. 저의 게으름 탓이겠지만 본 포스트에선 License를 먼저 채워 넣는 아주 쉬운 patch를 올려보려 합니다.
![](https://steemitimages.com/DQmTBf8X4BxPw7YY7U8qYkvkFkFefak1SecAAsepRCjqxN8/image.png)
썰렁한 readme

급한 patch나 사소한 patch의 경우 작업을 하여 pull request를 바로 올리기도 하는데 본 포스트는 Github에서 제공하는 Issue 게시판을 활용하여 위의 patch 내용에 대한 Issue를 등록하고 작업을 진행해 보겠습니다. (만약 작업하고자 하는 Issue가 이미 누군가에 의해 제기가 되었고 작업하는 사람이 없다면 Assign을 해달라고 이야기 하여 일을 맡아서 할 수도 있습니다!)

![](https://steemitimages.com/DQmaT1FAfTP8WFLRH6KfdsKvoZGwE7whKXArjB64YRZWVNV/image.png)
우측 상단의 New Issue 버튼을 클릭해 Issue를 게시할 수 있습니다.
Issue 내용은 영어로 힘겹게 작성합니다. 쉬운 내용일 지라도 상세한 정보를 포함하는 습관을 들이는 것이 좋습니다. Label에 관련 있어 보이는 항목을 선택하고 저를 Assignee로 선택합니다.

![](https://steemitimages.com/DQmdTVDMWu1grZ1iZ5K3KwSW2GqSKkrit2rX5jrsFE5EtJJ/image.png)
아래와 같이 이슈가 생성되었습니다.

![](https://steemitimages.com/DQmbYsAf2DYPhKqFZtxh8Koinev4RkQd1Fxj74a5GBwTuVS/image.png)
396번 이슈가 생성되었습니다.

## patch 만들 branch 생성하고 작업하기
readme_patch라는 branch를 만들어 readme 파일을 수정하겠습니다.

root@nadongguri:~/github/lunchclass/blog/absolute
**git checkout -b readme_patch**
Switched to a new branch ‘readme_patch’
root@nadongguri:~/github/lunchclass/blog/absolute
git branch
master
__* readme_patch__

checkout 명령어는 branch를 갈아탈 때 사용하는데 해당 branch가 없다면 branch를 만들면서 이동할 수 있습니다. git branch로 현재 readme_patch에 있는 것을 알 수 있습니다. 그러면 이제 README.md를 수정해 봅니다.

![](https://steemitimages.com/DQmPTvi326LmhDm4MQ9A6UdkKVaHqFbc5J5D1KzswVHV7or/image.png)
License 항목 아래에 text를 추가합니다.

git status 명령어를 실행해 봅니다.
![](https://steemitimages.com/DQmXS6bk7dpAxPiU8QD2nF5qzp2As1adgACcHKGCCbqUWH7/image.png)


좀전에 수정한 README.md가 modefied 되어 있으며 이를 commit하기 위해선 git add를 하라는 친절한 설명까지 덧붙여 줍니다.

![](https://steemitimages.com/DQmUNsKX8wZm1nL7CcYK4SMJkivw8QeLwpRpPxC7tz8YDkT/image.png)

작업한 내용은 commit을 해서 작업 내용을 기록해야 합니다.

![](https://steemitimages.com/DQmPx2Tktks1eVYGQEseEtCmFTDaWuRkZEzUV63p6f1seaK/image.png)

git commit 명령어에 -m 옵션을 더하고 commit에 대한 내용을 작성하면 commit이 이뤄집니다. git log로 commit이 잘 되었는지 확인할 수 있습니다.

![](https://steemitimages.com/DQmZ4dozu9xrKdHpaR4XxKuVoM3uXXGT9F7V1sUrX6vNeef/image.png)

제가 수정한 commit이 올라가 있군요. 현재 까지는 local의 origin의 readme_patch branch에 수정사항이 반영되었을 뿐입니다. 이제 해당 commit을 fork repo에 반영해 보겠습니다.

## patch를 fork repo에 올리기

git push 명령어를 이용해 nadongguri의 absolute repo에 commit을 반영할 수 있습니다.

git push origin readme_patch

![](https://steemitimages.com/DQmTQkLKJbUhHotfeDMzjF49ZTe7cMEiTmFhLNgKKm6bh2S/image.png)


git push 명령어에 remote와 branch를 입력하면 해당 remote로 입력한 branch를 push하게 됩니다.

fork repo로 가보면 push한 branch가 올라갔다는 noti가 보입니다. 그리고 바로 Compare & pull request 버튼이 보이는 군요.

![](https://steemitimages.com/DQmbuzy9ahNnhFwLUHv7yzy9XYU4r2s3WL1w3viHtUQPmGL/image.png)

## upstream repo에 pull request 하기
Compare & pull request 버튼을 눌러 방금 전에 올린 commit 내용을 upstream에 반영되도록 pull request해 보겠습니다.
![](https://steemitimages.com/DQmdEqEv7HcnxVHo6GhERFBMAjamjPQ1yheMc7qHHpsCJFf/image.png)


내용을 작성할 때 한 줄이 80bytes 를 넘지 않도록 주의하세요! (엄밀히 말하면 74byte) (Open Source 매너) 상단에 친 빨간 테두리를 보면 readme_patch branch의 commit이 upstream의 master branch로 pull request 처리 후 merge될 것을 보여줍니다. 내용을 작성하고 Create pull request 버튼을 눌러 줍니다.

자, 그럼 lunchclass의 absolute proejct로 가볼까요? Pull reqeusts 게시물이 하나가 늘었네요. 좀 전에 올린 pull request가 추가되었습니다. 현재 absolute project는 multi platform을 지원하기 위해 Travis와 Appveyor CI와 연동이 되어 있습니다. TC가 통과되고 리뷰어가 approve를 해주면 수정 사항이 upstream의 master에 반영이 될 것입니다. 😀
![](https://steemitimages.com/DQmcoHzNqEAQNvMgUiuL3QkTt9rzVYJDktmTDggJBydNY4G/image.png)
👍 , , ,