깨끗한 pull 요청을 할 수 있도록 Github 포크를 어떻게 정리합니까?


83

Github에서 저장소를 포크했습니다. 사소한 변경을하고 업스트림에 풀 요청을 제출했지만 포크가 너무 엉망이되어 깨끗한 풀 요청을 생성 할 수 없습니다. 6 개의 변경 사항이있는 브랜치에서 풀 요청을 시작하면 Github는 13 개를 제출하려고합니다. 그중 7 개는 이미 업스트림 (내치)이 존재합니다.

내 문제 는 최신 커밋을 가져 오는 것과 관련된 것 같지만 새 분기를 만들고 체리 선택 커밋을 만들 때 여전히 추가 항목이 있습니다. 나는 rebasing 도 만났지만 이제는 내 마스터 조차도 너무 엉망이되어 upstream 의 깨끗한 사본을 생성 할 수 없습니다 . 병합하는 대신 리베이스가 필요하다는 것을 이해하지 못했기 때문에 분명히 실수를 저질렀습니다. 내가하려는 것은 매듭을 풀고 내가 유용하게 앞으로 나아갈 수있는 깨끗한 상태로 돌아가는 방법을 알아내는 것입니다.

나는 포크를 날려 버리고 상류의 새로운 포크를 만들고 싶지만 그것도 모으는 것이 어렵습니다.

Git 죄를 고백 한 후 어떻게 github absolution을 얻나요?


1
:-) 용서되고에 대한 고백과 요청 사랑
존 컨

뭐, 자식이 종교가 아닌 사람들이 있습니까? ;-)
pjmorse 2015-04-17

답변:


102

1 단계 : 업스트림 변경 사항 가져 오기
저장소 분기 페이지 에 설명 된대로 업스트림 저장소를 "업스트림"으로 추가하는 것이 좋습니다 .

git pull --rebase upstream master

--rebase옵션은 병합없이 최신 커밋 위에 변경 사항을 배치합니다.

2 단계 : (선택 사항) 커밋을 하나의 커밋으로 병합

git reset --soft upstream/master

이 명령은 모든 커밋을 "실행 취소"하지만 파일을 변경하지는 않습니다. 따라서 단일 커밋으로 모든 변경 사항을 커밋 할 수 있습니다.

git commit -a

3 단계 : 변경 사항 확인 및 테스트

변경 사항을 표시하려면 내장 gitk, Sourcetree , TortoiseGit 또는 Tower (유료) 등과 같은 GUI를 사용하십시오 .

4 단계 : 푸시

git push푸시가 대상 저장소의 기록을 변경하기 때문에 오류가 발생합니다.
3 단계에 표시된 변경 사항이 정확하다고 확신하는 경우 "-f"를 눌러 누릅니다.

git push -f origin master


추가 정보
원격을 추가하는 명령은 다음과 같습니다.

git remote add upstream git://github.com/[username]/[project].git

직접 URL에서 가져올 수도 있습니다.

git pull --rebase  git://github.com/[username]/[project].git

그러나 다른 단계에서 "업스트림 / 마스터"대신 최신 업스트림 커밋의 해시가 필요합니다.


3
대단히 감사합니다. GitHub는 Fork A Repo를 업데이트해야합니다 .
buschtoens

감사! 이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 아무런 효과가 없었습니다. 이 답변을 찾기 전에 내 포크를 날려 버릴 준비가되었고 작동했습니다. 감사!
유다 가브리엘 희망 고

안녕하세요, @JudahHimango. "2 단계"도 따랐습니까? 당신과 같은 상황에 있기 때문입니다. 도와주세요.
arunit21

이것은 훌륭한 자원입니다. 감사!
Dr. Jan-Philip Gehrcke 2015

내 분기 된 리포지토리가 업스트림과 동기화되지 않았다고 계속해서 말 했으므로 풀다운하고 병합하여 필요하지 않은 포크에 대한 커밋으로 이어졌습니다. 이 접근 방식을 사용하고 푸시를 강요하여 분류했습니다. 또한 리베이스를 사용하여 이전 커밋 중 일부를 결합했습니다. git rebase -i HEAD ~ n [여기서 n은 커밋 수]
The Coder

4

내가 이해하는 바와 같이, Git과 Mercurial (나는 후자 만 사용 했으므로 내가 틀렸을 수 있음)을 사용하면 포크를 날려 버리고 다시 포크하는 것은 큰 문제가 아닙니다. 저는 프로젝트에서 항상 그렇게합니다. 그렇게해도 괜찮다면 (변경 사항을 백업 할 수 있거나 포크에 큰 변경 사항이없는 경우) 아마 그 방법이 될 것입니다.

저장소를 분기하면 해당의 전체 복제 수, DVCS와 기억 전체의 repo . 현재 포크를 삭제 한 다음 원래 리포지토리를 다시 포크하면 작업 할 완전히 깨끗한 슬레이트를 갖게됩니다.


이 경우 Fork는 핵심 git 기능을 사용하지만 핵심 git이 아닌 github의 특수 기능입니다. github-forks로 할 수있는 특별한 github 관리 능력이 있습니다.
Seth Robertson

1
아, 알겠습니다. 저는 주로 BitBucket을 사용하며 개인 작업 복사본으로 작업 할 때 "Fork"는 "clone"과 동의어입니다. 어쨌든 여기에 내 대답을 남겨 둘 것입니다.
Sean Edwards

예, 로컬 클론을 삭제하고 이미 여러 번 다시 복제했습니다. 다른 리포지토리로 실험을했는데 포크를 삭제하고 동일한 소스에서 새 리포지를 만드는 데 문제가없는 것 같습니다.
pjmorse

NB git format-patch먼저 저장하려는 커밋을 보존하기 위해 사용 하고 있습니다.
pjmorse

1
분기 된 저장소를 삭제하고 다시 분기하는 것은 불필요하며 git format-patch작업을 저장하는 데 사용하는 것은 git이 분기를 관리하는 데 사용할 수있는 모든 유용한 도구를 회피 하는 것입니다. 미래 git rebase -i에는 새로운 업스트림 master브랜치 의 맨 위에 커밋을 선택적으로 다시 작성 하는 것이 옳은 일입니다.
Mark Longair

0

개인 저장소에서 forkee의 저장소를 원격으로 추가하십시오. 리모트 브랜치에서 브랜치를 리베이스 / 리셋합니다. github 저장소에 강제 푸시를 수행하십시오.

정확한 명령이 필요하면 알려주세요. 또한 로컬 커밋을 시도하고 보존 할 것인지 아니면 "블로잉 아웃"이 괜찮은지 알려주십시오.

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