포크를 청소하고 업스트림에서 다시 시작하십시오.


396

리포지토리를 분기 한 다음 변경 한 내용이 모두 엉망인 것 같습니다.

현재 업스트림 / 마스터를 작업의 기초로 사용하여 처음부터 다시 시작하고 싶습니다.
저장소를 리베이스하거나 전혀 삭제해야합니까?


4
간단한 질문에 대한 매우 복잡한 답변. 모든 것을 삭제하고 저장소를 다시 복제하십시오.
야자

1
@ Yaza, 아니요, 일부 시나리오에서는 더 많은 문제가 발생할 수 있습니다.
Shimmy Weitzhandler

@shimmy, OP가 요청한 것처럼 처음부터 다시 시작하고 싶다면 아닙니다.
Yaza

답변:


796

가장 간단한 해결책은 다음과 같습니다 ( upstream원본 리포지토리를 참조하는 원격 이름으로 ' ' 사용 ).

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(이 GitHub 페이지 와 유사하게 "나쁜 상황에 처하면 어떻게해야합니까?"섹션 )

master지점에서 수행 한 변경 사항 (로컬로 인해 reset --hard및 원격으로 인해 변경)이 손실 될 수 있습니다push --force .

에 대한 커밋을 유지하려는 경우 master현재 커밋 위에서 해당 커밋을 재생 하는 대안이 있습니다 upstream/master.
재설정 부품을로 교체하십시오 git rebase upstream/master. 그런 다음 여전히 강제로 밀어야합니다.
" 나쁜 상황에 처하면 어떻게해야합니까? "를 참조하십시오.


현재 작업을 백업하는보다 완전한 솔루션은 (경우에 따라) " git master 브랜치 정리 및 일부 커밋을 새로운 브랜치로 이동 "에 자세히 설명되어 있습니다.

""의 의미를 설명하려면 " 원래 GitHub 저장소에서 새 업데이트를 포크 된 GitHub 저장소로 가져 오기 "를 참조하십시오 upstream.

상류


참고 : 최근 GitHub 저장소는 지점보호합니다masterpush --force .
따라서 master먼저 보호를 해제하고 (아래 그림 참조) 강제 푸시 후 다시 보호해야합니다 .

여기에 이미지 설명을 입력하십시오


참고 : GitHub에는 구체적 으로 업스트림으로 병합 된 끌어 오기 요청에 대해 분기 된 저장소를 삭제하는 바로 가기 (2019 년 2 월) 가 있습니다.


4
안녕하세요, 잘 작동했습니다! btw 올바른 재설정 구문은 다음과 같습니다git reset --hard upstream/master
tampe125

1
@ tampe125 훌륭합니다. git reset답변에서 구문을 수정했습니다 .
VonC

치명적 : '업스트림'은 자식 저장소가 아닙니다.
Benubird

@Benubird는 원래 저장소 (포크 한 저장소)를 참조하는 원격의 이름입니다 . stackoverflow.com/a/3903835/6309 의 그래프 및 " git remote"명령을 참조하십시오 .
VonC

맞습니다. 그러나 기본적으로 'upstream'은 github을 통해 포크로 명령 줄에 정의되어 있지 않으므로 기본 설정 방법은 명확하지 않습니다.
Benubird

31

VonC의 답변을 사랑하십시오. 초보자를위한 쉬운 버전입니다.

git remote가 origin있는데 모두 당신이 알고 있다고 확신합니다. 기본적으로 git repo에 원하는만큼 리모컨을 추가 할 수 있습니다. 그래서 우리가 할 수있는 것은 포크가 아닌 원래의 저장소 인 새로운 리모컨을 소개하는 것입니다. 나는 그것을 부르고 싶다original

포크에 오리지널 레포를 리모컨으로 추가합시다.

git remote add original https://git-repo/original/original.git

이제 우리가 최신 코드를 가지고 있는지 확인하기 위해 원래 저장소를 가져와 봅시다.

git fetch original

VonC가 제안했듯이, 우리가 마스터에 있는지 확인하십시오.

git checkout master

이제 오리지널 리포지토리의 최신 코드로 포크 속도를 높이려면 오리지널 리모컨에 따라 마스터 브랜치를 하드 리셋하기 만하면됩니다.

git reset --hard original/master

그리고 당신은 끝났습니다 :)


2
내가지고있어 fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.마지막 단계에. 어떤 충고?
TomNorway

이것은 원래의 원격 지점에 재고를 남기는 것처럼 보입니다. 포크를 올바른 리모컨으로 다시 설정하는 단계가 누락되었다고 생각합니까?
Ray Suelzer

1
originallocal의 "업스트림"과 upstream같이 Github 문서에서 사용하는 것보다 낫습니다 . 모호함을 줄입니다. 이것이 왜 당신이 그것을 사용하는지 궁금합니다. origin/mastermaster
vaughan

1
그것이 바로 내가 사용하는 이유입니다!
Ahmad Awais

2
나는이 지침을 따르고 이제 자식 상태가 말합니다 : 지점 마스터에서 지점과 '원산지 / 마스터'가 분기되었고 각각 52와 5의 다른 커밋이 있습니다. ( "git pull"을 사용하여 원격 브랜치를 병합하십시오)-5 커밋을 삭제하고 싶습니다. 다음 단계는 무엇입니까?
user3562927

6

@VonC의 훌륭한 답변을 따르면. GitHub 회사 정책에 따라 마스터에서 '강제 푸시'가 허용되지 않을 수 있습니다.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

이와 같은 오류 메시지가 표시되면 다음 단계를 시도하십시오.

포크를 효과적으로 재설정하려면 다음 단계를 수행해야합니다.

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

GitHub에서 포크를 열고 "설정-> 지점-> 기본 지점"에서 새 기본 지점으로 'new_master'를 선택하십시오. 이제 '마스터'브랜치를 강제로 밀어 넣을 수 있습니다.

git checkout master
git push --force origin

그런 다음 GitHub 설정에서 'master'를 기본 분기로 다시 설정해야합니다. 'tmp_master'를 삭제하려면 다음을 수행하십시오.

git push origin --delete tmp_master
git branch -D tmp_master

변경 사항을 잃어 버렸다는 경고에 대한 다른 답변은 여전히 ​​적용됩니다.


4

Sourcetree GUI를 통해 100 %하는 방법

(모두 git 명령 행 인터페이스를 통해 작업하는 것을 좋아하지는 않습니다)

이것이 설정되면 7-13 단계 만 수행하면됩니다.

가져 오기> 체크 아웃 마스터 분기> 마스터로 재설정> 변경 사항을 서버에 푸시

단계

  1. 화면 상단의 메뉴 툴바에서 : "리포지토리"> "리포지토리 설정"

상단 메뉴 표시 줄에서 "리포지토리"가 강조 표시됨

  1. "더하다"

대화 상자 하단의 "추가"버튼

  1. GitHub로 돌아가서 복제 URL을 복사하십시오.

Github 웹 사이트의 "복제 또는 다운로드"버튼과 git url

  1. URL을 "URL / 경로"필드에 붙여 넣은 다음 의미가있는 이름을 지정하십시오. 나는 그것을 "마스터"라고 불렀다. "기본 원격"체크 상자를 체크하지 마십시오 . 이 저장소로 직접 푸시 할 수 없습니다.

"원격 세부 사항"대화 상자에서 "원격 이름"및 "URL / 경로"필드가 강조 표시됨

  1. "확인"을 누르면 이제 리포지토리 목록에 나타납니다.

"리포지토리 설정"대화창의 리포지토리 목록에 "마스터"리포지토리 추가

  1. "확인"을 다시 누르면 "원격"목록에 표시됩니다.

사이드 바의 리모트 목록에 강조 표시된 "마스터"저장소

  1. "페치"버튼을 클릭하십시오 (소스 트리 헤더 영역의 왼쪽 상단).

헤더 영역의 "가져 오기"버튼

  1. "모든 리모컨에서 가져 오기"체크 상자가 선택되어 있는지 확인하고 "확인"을 누르십시오

"가져 오기"대화창에서 "모든 리모컨에서 가져 오기"체크 상자가 강조 표시됨

  1. "마스터"브랜치를 두 번 클릭하여 아직 체크 아웃되지 않은 경우 체크 아웃하십시오.

  2. 재설정하려는 커밋을 찾으십시오. repo "master"를 호출 한 경우 "master / master"태그가있는 커밋을 찾을 수 있습니다.

"마스터 / 마스터"태그가있는 커밋의 예

  1. 커밋> "현재 커밋을이 커밋으로 재설정"을 마우스 오른쪽 단추로 클릭하십시오.

  2. 대화 상자에서 "사용 모드 :"필드를 "하드-모든 작업 사본 변경 폐기"로 설정 한 다음 "확인"을 누르십시오 (먼저 잃어 버리지 않으려면 변경 사항을 별도의 브랜치에 두십시오).

"커밋으로 재설정"대화 상자에서 "사용 모드"필드가 강조 표시됩니다.  "작업중인 모든 사본 변경 사항 무시"로 설정되어 있습니다.

  1. "푸시"버튼 (소스 트리 헤더 영역의 왼쪽 상단)을 클릭하여 변경 사항을 저장소 사본에 업로드하십시오.

헤더 영역에서 "푸시"버튼

당신의 완료!

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