최신 커밋에 대해서만 GitHub에 풀 요청을 보냅니다.


280

나는 github에서 프로젝트를 분기했고 로컬 마스터를 성공적으로 변경하고 github에서 원점으로 밀어 넣었습니다. 풀 요청을 보내고 싶지만 마지막 커밋 만 포함하고 싶습니다. github.com의 풀 요청 UI는 마지막 9 개의 커밋을 보여 주며 필터링하는 방법을 모르겠습니다.

새 로컬 브랜치를 만들어야하는지 이해하고 있었는지 확인한 다음 어떻게 든 업스트림으로 재설정하거나 리베이스합니까? 그런 다음 ID로 마스터에서 마지막 로컬 커밋을 새 로컬 브랜치에 적용하고 풀 요청에 사용합니까?

나는 개념을 올바르게하고 필요한 것을 수행하기 위해 올바른 명령 줄을 알아 내려고 노력하고 있습니다.


다른 커밋과 함께 풀 요청을하면 어떻게됩니까? git이 이미 가져온 커밋을 무시하거나 넘길 정도로 영리하다고 생각 했습니까?
jayarjo 2016 년

3
아마도 업스트림은 아직 개입 커밋을 수락하지 않았거나 원하지 않습니다.
Michael Scott Cuthbert

@jayarjo 예를 들어 업스트림으로 보내고 싶지 않은 다른 변경 사항이 있습니다. git의 변경 사항은 메인 리포지토리를 무시할 필요가 없습니다. 자식과 쉬운 일은 없습니다.
Martin

Git (소프트웨어)와 GitHub (웹 서비스)에서 풀 요청이 어떻게 다른지대한 몇 가지 좋은 세부 사항
RBT

답변:


302

당신은 기본적으로 새로운 지점 및 작성해야 체리 - 선택 당신이 그것에 추가 할 커밋.

참고 : checkout / cherry-pick 명령 이전에 필요할 수 있습니다.

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

그 후 <new-branch-name>github에 브랜치를 보고 스위치로 전환 한 후 원하는 변경 사항으로 pull 요청을 제출할 수 있습니다.


32
또한 git checkout -b upstream upstream / master를 실행하기 전에 git remote add upstream <git repository>그리고 필요합니다 git remote update.
plainjimbo

6
이 방법은 효과가 있지만, 업스트림 브랜치와 업스트림 / 마스터가 다르기 때문에 풀 요청을 병합하는 것이 업스트림의 첫 번째 작업이 아닌 경우 항상 달라지기 때문에 그렇게해야합니다. 따라서 stackoverflow.com/a/5256304/1904815을 선호해야합니다 .
JonnyJD

2
설명하기 : 이것은 기술적 인 문제가 아니라 논리적 인 문제입니다. 병합과 같은 업스트림 작업을 수행하려면 "실시간 업스트림"브랜치를 추가하거나 업스트림을 재설정해야합니다 (추가 변경을위한 풀 요청에 대한 로컬 브랜치는 남기지 않음).
JonnyJD

15
지구상에서 변경된 단일 코드 행에 대한 PR을 작성하기 위해 추가 분기가 필요한 이유는 무엇입니까?! github의 누군가가 이것을 통해 생각 했습니까?
CodeManX

2
@JonHanna 아니요 ... 왜 지점을 병합해야합니까? 커밋을 병합 할 수없는 이유는 무엇입니까?
Kevin Krumwiede

57

오리진 저장소에도있는 최신 커밋에서 시작하여 새 브랜치를 작성하십시오.

git branch new-branch origin/master
git checkout new-branch

그런 다음 git cherry-pick풀 요청을 원하는 단일 커밋을 얻는 데 사용 하십시오. 이 커밋이있는 분기가 호출 feature되고 원하는 커밋이이 분기의 최신 커밋 인 경우

git cherry-pick feature

이 패치가 충돌없이 적용된다고 가정하면 이제 풀 요청을 수행 할 수있는 지점이 생겼습니다.

두 번째 단계에서는 이제 feature브랜치 로 수행 할 작업을 결정해야합니다 . 이 브랜치에 변경 사항을 아직 게시하지 않은 경우 가장 좋은 절차는 새 브랜치에 따라이 브랜치를 리베이스하는 것입니다 (그리고 마지막 커밋을 제거하지 않으면 마지막 커밋을 제거하는 것 git rebase).


체리 픽 후이 메시지가 나타납니다. 커밋에 추가 된 것은 없지만 추적되지 않은 파일이 있습니다 ( "git add"를 사용하여 추적). 모든 것이 마스터에 있지만 업스트림에서 분기를 만들어야합니다.
Kevin Hakanson

5
이 경우 feature이미 최선을 다하고 있습니다 origin/master, 아무것도 동안 발생하지 않습니다 cherry-pick. 새로운 지점은 upstream/master(예 : Kevin Hakanson의 답변)
ohho

26

나는 포크를 포크하고 원래 프로젝트에 풀 요청을 다시 제출하고 싶었던 상황에서 끝났다.

나는했다 :

  • orignal_project
  • forked_project (SHA의 원본 프로젝트에서 생성 : 9685770)
  • my_fork (SHA의 분기 프로젝트에서 작성 : 207e29b)
  • 원래 프로젝트에 다시 제출하고 싶은 포크 (SHA : b67627b)에 대한 커밋

이를 위해 나는 :

  1. 원본 프로젝트가 분기 된 SHA에서 새 분기를 만들었습니다.
  2. 원래 프로젝트에서 모두 가져 왔습니다.
  3. 체리는 풀 요청으로 제출하고 싶은 커밋을 선택했습니다.
  4. 모든 것을 github에 푸시했습니다.

git 명령은 다음과 같습니다.

  1. 자식 분기 내 기능 요청 9685770
  2. 자식 체크 아웃 내 기능 요청
  3. git pull https://github.com/original_project/original_project.git
  4. 자식 체리 픽 B67627B
  5. git push origin 내 기능 요청

그런 다음 원래 기능 요청을 원래 프로젝트에 대한 풀 요청의 분기로 선택했습니다.


6

이것은 거의 나를 위해 일했다 :

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

유일한 차이점은 다음과 같습니다.

git push origin upstream:upstream

git push가 GitHub 리포지토리에서 업스트림 분기를 만들어 PR을 만들 수 있도록 마지막 줄을 변경해야했습니다.


5

나는 이미 현재 분기에 풀 요청으로 분리 할 수있는 커밋을 만들었습니다.

그래서 새로운 지점을 확인했습니다

git checkout -b isolated-pull

그리고이 솔루션을 @Kevin Hakanson 's와 다른 곳에서,이 분기를 내가 역사에서 다른 곳으로 재설정해야하기 때문에

git reset --hard [sha-to-diff-by]

그리고 격리 된 끌어 오기 요청을 작성하려는 커밋을 선택하십시오.

git cherry-pick [my-isolated-commit-sha]

마지막으로 리모컨으로 밀어

git push origin isolated-pull

그리고 요청 데이터를 가져옵니다.


1

새로운 (임시) 브랜치, 체리 픽을 생성하고 해당 브랜치에 대한 풀 요청을 생성하는 솔루션은 나를 만족시키지 못했습니다. 커밋 세트를 사용할 수 있도록 저장소를 변경하고 싶지 않았으므로 다음 대안을 생각해 냈습니다.

먼저 관심있는 모든 커밋에 대한 패치 파일을 만듭니다.

git format-patch -1 <sha>

관심있는 커밋이 마지막 커밋 인 경우 HEAD대신 사용할 수 있습니다 <sha>.

이제 패치를 소스 리포지토리의 관리자에게 보낼 수 있습니다.

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

마지막으로 풀 리퀘스트에 의해 임시 브랜치가 병합되었지만 포크 리포지토리에 추가 브랜치가없는 것처럼 보입니다.


0

@ kevin-hakanson의 답변을 바탕 으로이 작은 bash 스크립트를 작성 하여이 프로세스를 쉽게했습니다. 업스트림 리포지토리가 존재하지 않으면 (URL을 요청하는 경우) 새 브랜치의 이름과 해당 브랜치를 선택하기위한 커밋의 태그 / SHA를 입력하라는 메시지가 표시됩니다. 현재 브랜치 또는 커밋을 확인한 다음 변경 사항을 숨겨서 새 브랜치를 체크 아웃 할 수 있습니다. 병합 전략은 체리 선택 커밋의 변경 사항을 유지합니다. 새 브랜치를 origin(원격 리포지토리의 이름으로 가정)으로 푸시 한 후 , 이전에 온 브랜치 또는 커밋이 다시 체크 아웃되고 이전 변경 사항이 숨김에서 튀어 나옵니다.

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

(이것은 몇 가지 간단한 테스트에서 나에게 도움이되었지만 bash 프로그래머 나 자식 전문가가 아니므로 놓친 사례가 있으면 더 잘 자동화 될 수 있는지 알려주십시오!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.