Github, Bitbucket 등 대부분의 Git 기반 서비스들은 forkpull request라는 기능을 가지고 있습니다. fork특정 원격 저장소의 히스토리를 그대로 다른 저장소에 복사하는 것을 말합니다. 대부분 다른 사람이 owner인, write 권한이 없는 오픈 소스 프로젝트에 기여하기 위해 사용합니다.

Pull request는 브랜치 간 변경 사항의 merge를 요청하는 것을 말합니다. Fork된 저장소라면, 원본 저장소에 변경 사항을 요청하기 위해서도 사용합니다.

  1. 팀 프로젝트를 진행한다면, 공용 저장소에 자신을 위한 브랜치를 만들고, 해당 브랜치에 변경 사항을 만들고, pull request로 원본 브랜치에 merge를 요청합니다.(브랜치 간 merge 요청)
  2. 오픈 소스 프로젝트를 진행한다면, 저장소를 fork해서 내 저장소로 만들고, 자신의 저장소의 특정 브랜치에 변경 사항을 만들고, pull request로 원본 저장소에 merge를 요청합니다.(fork된 저장소와 원본 저장소의 브랜치 간 merge 요청)

Github를 기준으로 설명하도록 하겠습니다.

Fork하기

위에서 말했던 것처럼 대부분의 Git 기반 서비스들은 fork를 지원합니다. 제가 현재 진행하고 있는 DMS라는 프로젝트의 DMS-Backend 저장소를 fork해서 제 저장소로 만들도록 하겠습니다.(Organization name까지 합치면, DSM-DMS/DMS-Backend입니다.) 저장소 화면의 우측 상단에 Fork라는 버튼이 있으며, 이 버튼을 눌러 저장소를 어디로 fork할지 선택할 수 있습니다.

자신 혹은 자신이 속한 Organization에 fork할 수 있으며, 여기서는 제 개인 저장소로 fork하도록 하겠습니다.

위와 같은 로딩 화면을 거치고 나면, 선택한 곳에 저장소가 만들어 집니다.

JoMingyu/DMS-Backend 저장소가 만들어졌습니다. 또한, 원래는 github.com/DSM-DMS/DMS-Backend.git이었던 Clone URL이 github.com/JoMingyu/DMS-Backend.git으로 바뀌었습니다.

Fork된 저장소(여기서는 JoMingyu/DMS-Backend)는 이전에 했던 것처럼 origin이라 부르고, Fork의 대상인 원본 저장소(여기서는 DSM-DMS/DMS-Backend)는 upstream이라고 부릅니다.

Pull request하기

Pull request는 브랜치 간 변경 사항 merge를 위해 사용합니다. origin에서 upstream으로 변경 사항을 merge하기 위해서도 사용합니다. 여기서는 후자를 위해 사용해 보도록 하겠습니다. 저장소의 source tree 위쪽에 New pull request라는 버튼이 존재합니다.

이 버튼을 눌러 pull request를 날릴 수 있게 됩니다.

head fork와 base fork를 비교하는 화면이 나옵니다. 여기서는 origin인 JoMingyu/DMS-Backend의 master 브랜치(head fork)에서 upstream인 DSM-DMS/DMS-Backend의 master 브랜치(base fork)로 merge를 요청합니다. Create pull request 버튼을 눌러 실제로 pull request를 여는 화면으로 이동합니다.

Pull request의 제목과 내용을 입력하고, 다시 Create pull request를 누릅니다.

위와 같이 pull request가 생성되었고, upstream에 권한이 있는 사용자가 Merge pull request를 누르면 실제로 변경 사항이 upstream에 적용됩니다.

'Git 레거시 글' 카테고리의 다른 글

[Git] Pull request에서 발생하는 충돌 해결하기  (1) 2018.08.13
[Git] Cherry-pick  (0) 2018.05.30
[Git] 커밋 히스토리 수정하기  (0) 2018.05.29
[Git] 커밋 되돌리기  (0) 2018.05.28
[Git] 다시 커밋하기  (0) 2018.05.27

Python의 빌트인 함수인 zip()둘 이상의 iterable 객체를 한 번에 순회하기 위해 사용합니다.

zip(*iterables)

인자로 전달된 각 iterable을 집계한 tuple iterator를 반환합니다. i번째 tuple에는 iterable 각각의 i번째 요소가 들어 있습니다.

zip()은 인자로 전달된 가장 짧은 iterable 객체가 모두 소모되면 멈춥니다.

가장 긴 iterable 객체를 기준으로 zip을 수행하려면, Python 표준 라이브러리인 itertools를 사용해야 합니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

Context Manager  (0) 2018.11.01
Argument Unpacking  (0) 2018.10.30
[Python] Coroutines  (0) 2018.07.27
[Python] memoize  (0) 2018.07.26
[Python] Assert  (0) 2018.07.25

프로그래밍 분야에서의 코루틴은 동시성 작업을 위한 기술입니다. Python에서도 코루틴을 구현할 수 있는데, 여기서의 코루틴은 generator와 꽤 유사합니다. Generator는 데이터의 생산자인데 반해, Coroutines은 데이터의 소비자입니다.

Python의 generator는 iterator를 생성하는 특별한 함수 객체로, yield 구문을 통해 필요할 때만 값을 반환합니다. Python 2.5에서 generator에 특별한 기능이 생겼는데, 바로 generator 속으로 값을 전달하는 기능입니다.(PEP 342 -- Coroutines via Enhanced Generators) 이는 두 generator가 번갈아 가면서 제어권을 넘기는 형태를 구성할 수 있게 됩니다.

Python 2.5에서 yield는 표현식이 되었습니다. 이전까지는 generator에서 값을 내놓는 지점을 설정하는 용도로 쓰였으나, 표현식이 되었다는 것은 '값으로 평가된다'는 말이 됩니다. 이를 통해 외부에서 generator로 값을 주입할 수 있고, yield는 재실행되는 시점에 입력값으로 평가됩니다. 이는 generator가 외부로부터 입력을 받는 함수(서브루틴)와 같이 동작할 수 있다는 것을 의미합니다.

generator 함수를 통해 코루틴을 생성했습니다. 생성 직후 코루틴의 실행 위치는 while True 이전에 멈춰 있습니다. next()를 한 번 호출하고 나면, s = (yield) 구문을 만나 멈추게 됩니다. 해당 표현식은 단순한 바인딩 구문이며, 따라서 우변이 평가되기 이전까지 코루틴이 멈춰 있습니다. Generator로 생성된 객체는 매직 메소드인 __next__()send() 메소드를 가집니다. 전자(__next__())는 next() 함수에 대응하여 다음번 yield 구문까지 실행하기 위한 메소드이며, 후자(send())는 코루틴 내부의 yield로 값을 밀어넣는 역할을 합니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

Argument Unpacking  (0) 2018.10.30
[Python] zip  (0) 2018.07.28
[Python] memoize  (0) 2018.07.26
[Python] Assert  (0) 2018.07.25
[Python] Generator  (0) 2018.07.23

+ Recent posts