본문 바로가기

git/github

[github] 원하는 commit만 pull request 보내기

http://stackoverflow.com/questions/5256021/send-a-pull-request-on-github-for-only-latest-commit

http://kurogo.org/guide/github.html


git checkout -b upstream upstream/master


git cherry-pick sha1


git push origin upstream



원본 repository를 브랜치로 따고..
cherry-pick으로원하는 커밋만 merge 후
그걸 push해서 pull request로 보내는 개념인듯하다..

---- 위 내용대로 해보니 잘 안되는 부분도 있고... 설명이 부족한듯 해서...
step by step으로 직접 해보면서 정리.. ----

실제 후배의 repository를 fork하여 이를 가지고 테스트..

* 원본 repository : https://github.com/skywingzz/skywingDev.git (후배의 원본 repository)
* forked repository : https://github.com/need4spd/skywingDev.git (내쪽으로 fork해온 repository)

## 로컬에 Setting ##
1. 로컬에 git directory 생성
 - mkdir test_git_repo
 - cd test_git_repo
 - git init

2. set upstream / origin remote
: origin은 내가 fork해온 repository, upstream은 원본 repository
 - git remote add upstream https://github.com/skywingzz/skywingDev.git
 - git remote add origin https://github.com/need4spd/skywingDev.git

3. fork해온 repository의 내용을 복사
: fork해온 repository의 내용이 로컬로 들어온다.
 - git pull origin master

4. upstream remote에 대한 셋팅
: 원본 repository의 최신 수정된 내용이 upstream/master branch로 들어온다.
: 이후 원본 repository의 최신 commit 내용을 로컬로 반영 할 때도 git fetch upstream만 실행해주면 그 내용이 upstream/master 브랜치로 들어온다.
: 이걸 master로 merge 해주면, master branch (혹은 내가 작업하고 있는 branch)에도 내용을 반영 할 수 있다. 이를 활용 한 것이 http://devyongsik.tistory.com/534
 - git fetch upstream


## 수정 및 commit ##
1. 작업을 할 branch를 생성
 - git checkout -b work1 master

2. work1 branch에서 내용을 수정하고 commit을 한다. 여기서는 테스트를 위해서 3번의 commit을 커멘트 11,12,13으로 진행
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ vi kk.text
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git add .
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git commit -m "11"
[work1 9d53b24] 11
 0 files changed
 create mode 100644 kk.text
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ vi ss.text
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git add .
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git commit -m "12"
[work1 fcdc08b] 12
 0 files changed
 create mode 100644 ss.text
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ vi tt.text
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git add .
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git commit -m "13"
[work1 2ce02b2] 13
 0 files changed
 create mode 100644 tt.text

- 여기서 13 커멘트를 가진 2ce02b2 commit만 pull request하고 싶은 상태

3. 해당 commit의 commit name을 확인
 - git log
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git log -4
  commit 2ce02b27285a623d6cbdd0764e279caac137e10f
  Author: need4spd <need4spd@naver.com>
  Date:   Tue Dec 4 13:59:15 2012 +0900

    13

4. upstream/master를 최신으로 만든다.
 - git fetch upstream

5. 원본 repository의 최신 내용이 반영되어있는 upstream/master branch로부터 upstream2라는 이름의 branch를 생성
 - git checkout -b upstream2 upstream/master

6. upstream2 branch에 있는지 확인
 - git branch
[need4spd@need4spdui-MacBook-Air test_git_repo ]$ git branch
  master
* upstream2
  work1

7. 원하는 commit만 merge
 - git cherry-pick 2ce02b27285a623d6cbdd0764e279caac137e10f
  [upstream2 b73c988] 13
   0 files changed
   create mode 100644 tt.text

8. upstream2 branch의 커밋내용을 origin (fork한 repository)로 push
 - git push origin upstream2

9. github에 접속하여 fork한 repository로 이동하여, upstream2 branch를 선택


10. push한 13번 커멘트의 commit을 pull request




좀 더 간단하게 정리하면..


1. 작업할 branch 생성

2. 작업 후 commit , pull request 할 commit을 선택

 - 여기서 commit을 합치거나, 없앨수도 있겠다.

3. upstream/master를 up to date 상태로 만들고, 이것을 base로 branch를 추가한다. (이게 위 예에서 upstream2)

4. 3번에서 만든 branch에 cherry-pick 명령어로 commit을 선택하여 merge

5. origin (fork해온 repository) 에 push 후 pull request 가 되는듯..


이것 말고도.. 여러가지 방법들이 있는 것 같다. rebase를 사용한다거나...

아 어렵네..~ ㅎㅎ