Git에서 로컬 브랜치를 원격 브랜치로 완전히 바꾸는 방법은 무엇입니까?


778

두 가지가 있습니다.

  1. 현지 지사 (내가 일하는 곳)
  2. 원격 브랜치 (공개, 잘 테스트 된 커밋 만 이동)

최근에 나는 현지 지점을 심각하게 망쳤습니다.

로컬 브랜치를 완전히 원격 브랜치로 대체하여 원격 브랜치가있는 곳에서 작업을 계속할 수 있습니까?

나는 이미 SO를 검색했으며 원격 지점을 로컬로 체크 아웃해도 아무런 영향을 미치지 않습니다.


1
승인 된 답변에 1280 개의 투표가 있음을 알고 있지만 @TTT에서 허용 된 답변을 답변으로 변경하는 것을 고려해야합니다.
Jamie

답변:


1287
  1. Zoltán의 의견 에서 교체하려는 지점을 확인했는지 확인하십시오 .
  2. master가 교체하려는 로컬 지점이고 "origin / master"가 재설정하려는 원격 지점이라고 가정합니다.

    git reset --hard origin/master
    

그러면 로컬 HEAD 분기가 출발지 / 마스터와 동일한 개정으로 업데이트되고이 --hard변경 사항을 인덱스 및 작업 영역에도 동기화합니다.


4
귀하의 제안에 감사드립니다. --hard 및 --force를 이미 사용하는 것이 무서워서 사용하지 않는 솔루션을 선택했습니다.
YemSalat

13
@ KonstantinLevin : 아, 그렇습니다. 이러한 옵션의 이름은 오히려 짜증납니다. git reset기본적으로 현재 지점을 다시 지정하고 색인을 동기화합니다. --soft인덱스 업데이트를 건너 뛰고 --hard작업 영역도 동기화합니다. 내 자신의 경험을 사용하고 --hard내가 마지막 (단지 인 커밋을 취소 할 때를 제외하고는 대부분의 시간을 git reset HEAD^)
araqnid

9
자식에 대한 더 많은 경험을 가진 후에 이것이 더 나은 해결책이라고 확신합니다. 감사합니다.
YemSalat

24
아마 당신은 먼저 가져와야 할 것입니다 :git fetch origin remote_branch
b1r3k

53
이것은 현재 어느 브랜치 를 master내용으로 대체 할 입니다. 예를 들어 기능 지점에있는 경우 모든 커밋 master이로 바뀌므로 먼저 교체하려는 지점을 확인하십시오.
Zoltán

218

세 단계만큼 쉽습니다.

  1. 현지 지점을 삭제하십시오. git branch -d local_branch
  2. 최신 원격 지점을 가져옵니다. git fetch origin remote_branch
  3. 원격 지점을 기반으로 로컬 지점을 다시 작성하십시오. git checkout -b local_branch origin/remote_branch

7
실제로 @araqnid가 말한 것은 옳고 간결합니다. 나는 그것을 테스트했고 당신도 그것을 시도 할 수 있습니다.
adamsmith 2012

와우, git checkout -b local_branch origin / remote_branch는 훌륭합니다! 나는 항상 두 가지 별도의 명령 으로이 작업을 수행했습니다. 감사!
kendepelchin 2013

11
git branch -D local_branch지점이 병합되지 않은 경우 첫 번째 단계에서 수행해야 할 수도 있습니다 .
szeryf

덕분에, gitflow를 사용할 때 분기를 게시 한 다음 마무리 한 후 어려움을 겪었습니다. 삭제 된 분기로 이동하고 싶었습니다. 솔루션이 작동하는 유일한 솔루션이었습니다. 풀이 작동하지 않는 것 같습니다. 잘 사용하지 마십시오
Decebal

2
현재 브랜치가 삭제할 브랜치가 아닌지 확인해야합니다.
a_secenthusiast

43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

--track 부분은 무엇을합니까?
eonist

3
@GitSync, 이것에 대해 git help branch말합니다 --track. When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. 나는 대답 에서이 명령을 수정했습니다. 요점을 높여 주셔서 감사합니다.
Sailesh

평신도의 관점에서 볼 때, 그것은 새로운 브랜치에 원격 URL을 추가합니다. 그래서 그들은 영원히 동기화됩니다. 말하자면.
eonist

2
그것은 단지 편의를위한 것이라고 말할 수 있습니다. 그렇게 git status하면 연결된 지점이있는 경우 로컬 지점이 원격 지점보다 앞이나 뒤에 있는지보고합니다. 또한 이미 지점을 추적하도록 설정 한 경우 전체 대신에 git pull(또는 push) 수행 할 수 있습니다 . git pull <remote> <branch><remote/branch>
Sailesh

22

원격 브랜치로 모든 것을 교체하십시오. 그러나 로컬 커밋이 같은 커밋에서만 :

git reset --hard origin/some-branch

또는 원격 지점에서 최신 정보 를 얻고 모든 것을 교체하십시오.

git fetch origin some-branch
git reset --hard FETCH_HEAD

또한 필요한 경우 아직 커밋하지 않은 추적되지 않은 파일 및 디렉토리를 지울 수 있습니다.

git clean -fd

git clean명령은 나를 위해 그것을했다. git reset hard origin/master추적되지 않은 파일을 지우지 마십시오. 감사!
Mornor

9

현재 로컬 브랜치를 원격으로 교체하는 가장 안전하고 완벽한 방법 :

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

stash줄은 커밋되지 않은 변경 사항을 저장합니다. branch라인은 원래 이름을 확보, 다른 이름으로 지점을 이동합니다. fetch라인은 원격의 최신 복사본을 검색합니다. 이 checkout선은 원래 분기를 추적 분기로 다시 만듭니다.

또는 bash 함수로 :

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

현재 분기의 이름이 replace_master_98d258f와 같은 이름으로 바뀝니다.


git stash pop해당 워크 플로우 에 포함시킬 수 있습니다 . 숨김 파일을 다시 적용하려는 경우
eonist

숨김 지점으로 무엇을합니까? 나는 그것이 무엇을 잊어 버린 지 오래 후에 어딘가에 다시 나타날 것을 두려워합니다.
Scott Biggs

1
@ScottBiggs 숨김 분기를 제거하려면 "git stash clear"를 사용하십시오.
Mark A. Durham

4

아직 아무도 이것을 언급하지 않은 것에 놀랐습니다. 나는 거의 매일 그것을 사용합니다 :

git reset --hard @{u}

기본적으로 @{u}현재 지점에서 추적하는 업스트림 지점의 약어입니다. 예를 들어, 이것은 일반적으로와 같습니다 origin/[my-current-branch-name]. 가지에 구애받지 않기 때문에 좋습니다.

에 있는지 확인 git fetch원격 브랜치의 최신 복사본을 얻을 첫번째.


1
정말 멋져 보입니다. 재설정하기 위해 지점 이름을 복사하여 붙여 넣는 데 지쳤습니다!
pedroct92

1
예전 질문에 대한 답변을 추가 한 사례가 몇 군데 있었으며 답변이 순위표에 올라갔습니다. 나는 이것이 가능하기를 바랍니다.
Jamie

3

더 나은 지식 관점을 전파하기 위해이 답변을 계속 편집하여 여러 가지 방법으로 수행 할 수 있습니다.

1) 하드 리셋

원격 개발 브랜치에서 작업중인 경우 다음과 같이 HEAD를 원격 브랜치의 마지막 커밋으로 재설정 할 수 있습니다.

git reset --hard origin/develop

2) 현재 브랜치를 삭제하고 원격 저장소에서 다시 체크 아웃하십시오.

원격 / 개발 지점과 동기화되는 로컬 리포지토리에서 지점을 개발하고 있다고 생각하면 다음과 같이 할 수 있습니다.

git branch -D develop
git checkout -b develop origin/develop

3) 중단 병합

잘못된 병합 사이에 있고 (잘못 잘못된 분기로 수행됨) 병합이 다음과 같이 최신 지점으로 다시 돌아가는 것을 피하려는 경우 :

git merge --abort

4) 중단 rebase

불량한 리베이스 사이에있는 경우 다음과 같이 리베이스 요청을 중단 할 수 있습니다.

git rebase --abort

2

@Laurent의 @Hugo가 말한 것처럼 할 수 있거나 git rebase어떤 커밋을 알고 있다면 제거하려는 커밋을 삭제할 수 있습니다. git rebase -i head~N이런 종류의 작업에는 (N은 숫자이므로 마지막 N 커밋을 조작 할 수 있습니다) 사용하는 경향이 있습니다 .


실제로 모든 것이 엉망이 된 'git rebase'명령이었고, 일부는 강제 병합 및 하드 리셋이었습니다. 어쨌든, 내가 찾고 있던 것은 병합하지 않고 원격 서버에서 전체 저장소를 가져 오는 쉬운 방법입니다.
YemSalat

2

선택한 대답은 절대적으로 올바른 그러나 그것은 / 커밋 최신으로 밀어 나를 떠나지 않았다, ...

그래서 나를 위해 :

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

몇 주 동안 업스트림 브랜치를 특정 브랜치로 일시적으로 설정하고 싶다는 것을 알고 있기 때문에 (이전에 전환 / 체크 아웃하고 하드 리셋을 한 것과 동일)

따라서 재설정 후

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

1

현재 체크 아웃되지 않은 지점을 업데이트하려면 다음을 수행하십시오.

git fetch -f origin rbranch:lbranch

0

선택한 설명에 제공된대로 git reset 이 좋습니다. 그러나 오늘날 우리는 종종 서브 모듈을 사용합니다 : 리포지토리 내부의 리포지토리. 예를 들어, 프로젝트에서 ZF3 및 jQuery를 사용하는 경우 원래 리포지토리에서 복제 할 수 있습니다. 이 경우 git reset 으로 충분하지 않습니다. 저장소에 정의 된 정확한 버전으로 하위 모듈을 업데이트해야합니다.

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

각 하위 모듈의 작업 디렉토리로 재귀 적으로 와서 (cd) 다음과 같이 실행됩니다.

git submodule update

그리고 그것은 매우 다릅니다

git checkout master
git pull

하위 모듈은 분기가 아니라 커밋을 가리 키기 때문입니다.

이 경우 하나 이상의 하위 모듈에 대한 일부 분기를 수동으로 체크 아웃하면 실행할 수 있습니다

git submodule foreach git pull

특히이 질문에 대답 할 때 설명을 제공해주십시오. 귀하의 답변은있는 그대로 도움이되지 않습니다.
Erik A

수락 된 답변은 이미 제안합니다 git reset --hard. 이것은 작은 가치를 추가합니다.
florisla

0
git reset --hard
git clean -fd

이것은 나를 위해 일했습니다. 깨끗한 파일도 삭제했습니다. 변경 사항을 잃게 될 것이라고 말하면 숨겨야합니다.


-6

추악하지만 간단한 방법 : 로컬 폴더를 삭제하고 원격 저장소를 다시 복제하십시오.


10
또는 지점을 삭제하고 다시 확인하십시오.
laurent February

그래, 내가 덜 추악한 방법으로 그것을하는 방법을 찾지 못하면 내가 뭘 할 것 같아
YemSalat

2
추악한 경우가 종종 있습니다. 사람들이 기존 방식이 아니기 때문에 물건을 공짜로 투표하지 않기를 바랍니다. 공감대에 대한 더 합리적인 이유가 있어야합니다. 힘내는 결과를 달성하는 것입니다. 어떤 종류의 신성한 텍스트가 아닙니다.
마이크 설치류

3
나는 downvotes를 이해하지 못한다 :-( 예, 그것은 우아하지 않습니다. 그러나 그것은 어떤 경우에는 가장 잘 작동 할 수 있습니다 ... 죄송합니다 @Hugo
silverdr

@ 휴고, 합의. 신비한 냄새가 나는 지역 개발 부서에 일어 났고, 팀장과 엔지니어링 관리자는 더 우아한 솔루션 중에서도 (내 기능 작업을 압축, 복사 및 저장 한 다음) 로컬 리포지토리를 복제하고 복제 할 것을 제안했습니다.
AmitaiB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.