github : 기존 pull 요청에 커밋 추가


89

Fork & Edit this file file 버튼 을 사용하여 github의 rails repo에 대한 pull 요청을 열었습니다 .

이제 PR에 대한 피드백을받은 후 커밋을 더 추가하고 싶었습니다. 그래서 여기에 내가 한 일이 있습니다.

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

이것은 잘 작동했지만 꽤 복잡한 워크 플로우로 보입니다. 어쩌면 내가 틀렸을까요?

내 질문은 :이 작업을 올바른 방법으로하고 있습니까? 그렇지 않다면 올바른 방법은 무엇입니까?


4
어떤이 더 나은 자신의 시나리오에 맞는 찾을 수 있습니다 여기에 오는 : stackoverflow.com/questions/9790448/...
AaronLS

4
또한이 버전의 질문 / 답변을 더 명확하게 찾았습니다. stackoverflow.com/questions/7947322/…
Ben Wheeler

답변:


63

GitHub의 도구를 사용하고 파일 하나만 변경 했으므로 GitHub 에서 파일찾아 "tree :"드롭 다운 ( patch-3귀하의 경우) 아래 왼쪽 상단 모서리에서 적절한 분기를 선택한 다음 이제 "Edit 이 파일". 이제 변경 사항이이 브랜치에 커밋되고 풀 요청에 표시됩니다.


10

최근 에이 주제에 대해 블로그 를 작성했습니다.

이 기능 분기를 최신 상태로 유지하려면 어떻게해야합니까? 최신 업스트림 커밋을 병합하는 것은 쉽지만 업스트림으로 푸시 될 때 인식 할 수 없기 때문에 병합 커밋을 생성하지 않으려 고합니다. 그들은 새로운 부모를 얻습니다). 이는 병합 된 커밋이 개인 GitHub 기능 브랜치에 해당 업데이트를 푸시 할 때 GitHub 풀 요청에 반영되기 때문에 특히 중요합니다 (풀 요청을 발행 한 후에 수행하더라도).

이것이 병합 대신 리베이스가 필요한 이유입니다.

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

rebase 옵션과 git에 대한 rebase 명령은 트리를 깨끗하게 유지하고 병합 커밋을 방지합니다. 그러나 그것들은 리베이스되고 있고 현재 원격 github repo 브랜치에있는 원래 해시와는 다른 새로운 커밋 해시가있는 첫 번째 커밋 (첫 번째 풀 요청을 발행 한)입니다. .

이제 이러한 업데이트를 개인 GitHub 기능 브랜치로 푸시하는 것은 여기서 실패합니다. 두 브랜치가 다르기 때문입니다. 로컬 브랜치 트리와 원격 브랜치 트리는 서로 다른 커밋 해시로 인해 "동기화되지 않았습니다". Git은 먼저 git pull --rebase, 그런 다음 다시 푸시 하라고 알려 주지만 히스토리가 다시 작성되었으므로 이것은 간단한 빨리 감기가 아닙니다. 하지마!

여기서 문제는 처음으로 변경된 커밋을 원래 그대로 가져 와서 로컬 브랜치 위에 병합된다는 것입니다. 동기화되지 않은 상태로 인해이 끌어 오기가 제대로 적용되지 않습니다. 커밋이 두 번 나타나는 깨진 기록을 얻을 수 있습니다. 이 모든 것을 GitHub 기능 브랜치로 푸시하면 이러한 변경 사항이 원래 풀 요청에 반영되어 매우보기 흉해집니다.

AFAIK, 실제로 이것에 대한 완전히 깨끗한 해결책은 없습니다. 내가 찾은 가장 좋은 해결책은 로컬 브랜치를 GitHub 브랜치로 강제 푸시하는 것입니다 (실제로는 비 빨리 감기 업데이트를 강제 실행).

git-push (1)에 따라 :

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

따라서 당기지 말고 다음과 같이 강제로 누르십시오.

git push svg +user-non-unique

또는:

git push svg user-non-unique --force

이것은 실제로 로컬 브랜치의 모든 것을 원격 브랜치로 덮어 씁니다. 원격 스트림에있는 (그리고 실패를 일으킨) 커밋은 그대로 남아 있지만 매달린 커밋이되어 결국 git-gc (1)에 의해 삭제됩니다. 별거 아니야.

내가 말했듯이 이것은 AFAICS가 가장 깨끗한 솔루션입니다. 이것의 단점은 PR이 최신 커밋으로 업데이트되고 나중에 날짜가 표시되고 PR의 댓글 기록에서 동기화되지 않을 수 있다는 것입니다. 큰 문제는 아니지만 혼란 스러울 수 있습니다.


5

master특정 abc1234개정 대신 바인딩 된 새로운 풀 요청을 생성 할 수도 있습니다 .

이렇게하면 리포지토리에 대한 새로운 커밋 / 푸시가 풀 요청에 추가됩니다.


3

예-필요 이상으로 많은 일을하고 있습니다. 추가 커밋을 한 다음 강제로 푸시하면됩니다. 브라우저에서 github를 새로 고치면 원본 커밋과 새로 푸시 된 커밋이 표시됩니다.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

이 확실하지, 가장 쉽고 가장 똑 바른 앞으로 방법입니다 이유는 없습니다 최고 대답
반조 Obayomi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.