2012-03-02 2 views
16

저는 누군가의 프로젝트를 포크하고 커밋했습니다. 필자는 끌어 오기 요청을 작성했으나 받아 들여지지 않았습니다 (변경이 바람직하지 않거나 작성자가 기능을 "자신의 스타일"과 일치하도록 다시 작성). 이제는 업스트림에 갈 수없는 몇 가지 추가 커밋이있는 로컬 포크에 붙어 있습니다. 변경 세트를 취소 할 수는 있지만 추가 커밋 수가 두 배가되고 영원히 계속해서 커밋해야합니다. 그것은 단지 추한 것입니다!거절당한 Git이 거절당한 요청에 대해 Github에서 커밋합니다.

누구도 원하지 않는 이러한 커밋을 포기하고 내 포크를 업스트림 추적으로 되 돌리는 가장 좋은 방법은 무엇입니까? 저는 포크를 완전히 삭제하고 다시 포크 할 수 있다는 것을 압니다. 그러나 이것은 정말로 무거워서 제가하고있는 다른 일을 잃을 것입니다.

+0

_proposed_ 수정을 별도의 (분기 된) 분기로 만들었습니까? –

답변

19

리포 상태를 이전 커밋으로 재설정 할 수 있습니다. 당신이 갈래의 원격 환매 특약이있는 경우

git reset --hard <commit_hash> 

, 당신은 이러한 변화를 다시 밀어 수 있습니다 : 그 상태로 REPO를 재설정하려면

git log 

: 당신이 당신의 repo를 재설정 할 커밋 첫 번째 그림 밖으로 그것 :

나중에 워크 플로우를 변경하여 나중에 쉽게 만들 수 있습니다.

리포를 포크하고 자체 수정을 수행 할 때 먼저 두 개의 리모컨을 설정합니다. 리모컨 하나가 내 분기 된 Repo (예 : origin)를 가리키고 원래 리포 (예 : original_repo)에 다른 원격 포인트를 추가합니다. feature :

$ git remote 
    origin 
    original_repo 

내가 전, 내 모든 일을 할 수있는 지점을 만들 : 그래서 내가 좋아하는 뭔가가있을 수 있습니다. 풀 요청을 할 때 feature 브랜치에서 original_repomaster 브랜치로 이동합니다. 예와 같이 끌어 오기 요청이 거부되면이 분기를 포기할 수 있습니다. 더 많은 수정 작업을 원할 경우 master에서 다른 분기를 만들고이를 사용하여 작업하십시오.

또한 master 분기에 대한 로컬 변경 사항을 커밋하거나 병합하지 않습니다. master 브랜치를 사용하여 original_repomaster 브랜치와 동기화 할 수 있습니다. 예는 :

git checkout master 
    git fetch original_repo 
    git merge original_repo/master 

이는 master 분기가 항상 원래의 repo의 master 지사와 서로 연관되어 보장합니다. 예를 들어 끌어 오기 요청이 수락되어 병합 된 경우 가져 오기 및 병합이 발생하면 master 로컬은 원래의 repo에서 사용 된 '승인 된'코드를 모두 갖게됩니다.

기본적으로 master을 사용하여 원본 repo의 master과 동기화하고 수정하려는 경우 항상 master에서 분기하십시오. 원래의 repo에 대한 요청을 풀려면 해당 분기를 사용하십시오.

2

마스터 브랜치를 몇 단계 (백엔드 커밋을 3 번 건너 뛰고 싶은 경우)로 되돌리고 -f를 사용하여 github repo를 다시 작성하십시오.

git reset --hard HEAD~3 
git push -f origin master 
관련 문제