Git에서 원격으로 브랜치 이름 바꾸기


407

내가 git://액세스 할 수 있는 저장소 (일반적으로 푸시 + 풀)가있는 경우 로컬에서 수행하는 것과 같은 방식으로 해당 저장소의 분기 이름을 바꾸는 방법이 git branch -m있습니까?


48
연결된 "중복"질문은 "로컬 및 원격"분기의 이름을 바꾸도록 요청합니다. 그러나이 질문은 지점의 이름을 원격으로 바꾸는 방법 만 묻기 때문에 단순화 할 수 있습니다. 이것은 체크 아웃하거나 로컬 브랜치를 만들 필요없이 서버에서 브랜치의 이름을 바꾸는 것 git push origin origin/old_name:refs/heads/new_name && git push origin :old_name입니다.
sschuberth

1
@ sschuberth : 한 번에 두 명령을 모두 줄 수 있습니다. 그리고 이것은이 질문에 대한 답이어야합니다.
Joachim Breitner

2
@JoachimBreitner 당신이 옳습니다, 나는 이미이 스크립트 에서 최적화를했습니다 .
sschuberth '12

1
@ sschuberth, 아래 의견보다 낫기 때문에 귀하의 의견을 답변으로 게시해야합니다.
phatmann

답변:


480

원하는 이름으로 새 로컬 브랜치를 만들고 원격으로 푸시 한 다음 이전 원격 브랜치를 삭제하면됩니다.

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

그런 다음 이전 분기 이름을 보려면 저장소의 각 클라이언트가 수행해야합니다.

$ git fetch origin
$ git remote prune origin

참고 : 이전 지점이 기본 지점 인 경우 기본 지점 설정을 변경해야합니다. 그렇지 않으면을 실행할 때 "현재 지점 삭제가 금지되었습니다"라는$ git push origin :old-branch-name 오류가 발생 합니다.


8
이전 이름과 새 이름이 동일하면 지점 이름을 바꿀 필요가 없으므로 처음에는 명령을 실행할 지점이 없습니다. ;-)
Sylvain Defresne

9
확실한. 나는 당신이 이것을 자동화 된 방식으로 (다른 스크립트의 기능 부분으로) 호출한다면 그것을 피할 수 있다면 잘못된 일을하지 않을 수도 있음을 의미합니다.
Mysterious Dan

9
Dan의 방법 : 명령이 재정렬되어 항상 작동합니다. Earth Engine의 방법 : 항상 확인해야합니다. 그렇지 않으면 데이터가 손실됩니다. 어떤 것을 고르는 지 압니다.
Doradus

2
사용자는 다음을 실행할 수 있습니다 git fetch origin --prune(새 분기를 효과적으로 가져오고 더 이상 원격에서 참조를 제거함).
DolphinDream

2
최신 버전의 git 대신 -d또는 --delete대신 사용할 수 있습니다 :.
Zitrax

285

로컬 분기의 이름을 바꾸지 않고 원격으로 분기의 이름을 바꾸려면 단일 명령 으로이 작업을 수행 할 수 있습니다.

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

위의 작업을 쉽게 수행 할 수있는 편리한 바로 가기를 제공하는 이 스크립트 ( git-rename-remote-branch )를 작성했습니다.

bash 함수로서 :

git-rename-remote-branch(){
  if [ $# -ne 3 ]; then
    echo "Rationale : Rename a branch on the server without checking it out."
    echo "Usage     : $(basename $0) <remote> <old name> <new name>"
    echo "Example   : $(basename $0) origin master release"
    exit 1 
  fi

  git push $1 $1/$2:refs/heads/$3 :$2
}

@ksrb의 의견을 통합하려면 : 이것이 기본적으로하는 일은 단일 명령에서 두 번의 푸시입니다. 먼저 git push <remote> <remote>/<old_name>:refs/heads/<new_name>이전 원격 추적 분기를 기반으로 새 원격 분기를 푸시 한 다음 git push <remote> :<old_name>이전 원격 분기를 삭제합니다.


10
해당 명령의 별명을 원하는 사람들의 경우 : rename = "! f () {git push origin origin / $ 1 : refs / heads / $ 2 : $ 1;}; f"> git rename <old_name> < new_name>
Jonathan Schmidt

33
이 명령은 실제로 2 푸시의 본질적의 무엇을 의미하는지에 대한 호기심 사람들을 위해 git push <remote>/<old_name>:refs/heads/<new_name>수단은 SRC로 기존의 리모컨을 사용하는 새로운 리모컨을 누르면 다음 git push [space]:<old_name> 수단이 기존의 원격 삭제
ksrb

3
왜 사용해야 refs/heads/name합니까? name직접 사용할 수 없어서 첫 번째 명령을 내릴 수 git push <remote> <remote>/<old_name>:<new_name>있습니까?
Drew Noakes

6
원격 브랜치 <new_name>가 아직 없기 때문에 아니요 . 지점이 존재하지 않으면 Git은 전체 이름을 사용해야합니다. 그렇지 않으면 <new_name>태그 이름도 참조 할 수 있습니다.
sschuberth

3
우리는이 접근 방식을 빌드 시스템에서 사용합니다. 우리가 직면 한 유일한 경고는 refs/heads/<new_name> 이미 존재하는 것입니다. 삭제가 여전히 성공하여 <remote>/<old_name>삭제 만됩니다. 사전에 점검을하면 쉽게 피할 수 있습니다.
Apeiron

172

먼저 이름을 바꾸려는 지점으로 체크 아웃하십시오.

git branch -m old_branch new_branch
git push -u origin new_branch

이전 분기를에서 제거하려면 remote:

git push origin :old_branch

12
이름이 바뀐 분기 (new_branch)를 원격 (원점)으로 푸시 할 때 새 이름 (예 git push -u origin new_branch:)으로 분기를 추적하도록 업스트림을 설정해야합니다. 그렇지 않으면 이름이 바뀐 분기 (new_branch)가 계속 원점 / old_branch를 추적합니다. 원격 old_branch를 삭제 한 후에도 new_branch는 분기가 없어도 여전히 origin / old_branch를 추적합니다.
DolphinDream

@DolphinDream 유용한 업스트림 변경 사항을 포함하도록 답변을 편집했습니다.
mVChr

10

확실한. 지점의 이름을 로컬로 바꾸고 새 지점을 누른 다음 이전 항목을 삭제하십시오.

유일한 실제 문제는 리포지토리의 다른 사용자가 이름을 바꾸는 로컬 추적 분기가 없다는 것입니다.


1
그래서 마스터를 삭제하려고 할 때 $ git clone ../src $ cd src $ git branch notmaster $ git checkout notmaster $ git branch -d master $ git push ../src : master 시도했지만 대상 : 불평 refspec은 원격의 기존 참조와 일치하거나 refs /로 시작하지 않으며 소스 참조를 기반으로 접두사를 추측 할 수 없습니다. 오류 : 실패는 약간의 심판을 밀어에 '../alpha/'원격 정말라는 마스터 지점을 가지고
KDT

2

TL; DR

원격 브랜치 "이름 바꾸기"는 실제로 2 단계 프로세스입니다 (필수 순서는 아님).

  • 이전 리모트 브랜치 (결실 git push [space]:<old_name>ksrb 설명 );
  • 새로운 원격 지사로 들어갑니다 (아래의 몇 가지 답변 명령의 차이점).

삭제

TortoiseGit을 사용 하고 명령 줄을 통해 처음 분기를 삭제하려고 할 때 다음과 같은 결과가 나타납니다.

$ git push origin :in
  • 치명적 : 'origin'은 자식 저장소가 아닙니다.

  • 치명적 : 원격 저장소에서 읽을 수 없습니다.

올바른 액세스 권한이 있고 저장소가 존재하는지 확인하십시오.

이것은 pageant개인 키가 로드 되지 않았기 때문일 수 있습니다 ( TortoiseGit이 자동으로 pageant 로로드 됨 ). 또한 TortoiseGit 명령에는 origin참조 가 없습니다 (예 :) git.exe push --progress "my_project" interesting_local:interesting.

또한 Bitbucket 을 사용 하고 있으며 다른 웹 기반 온라인 git 관리자 (GitHub, GitLab)와 마찬가지로 인터페이스 (분기 페이지)를 통해 원격 지점을 직접 삭제할 수있었습니다.

지사 Bitbucket 삭제

그러나 TortoiseGit 에서는 찾아보기 참조를 통해 원격 브랜치를 삭제할 수도 있습니다 .

참조 찾아보기 메뉴

원격 지점 (원격 목록)을 마우스 오른쪽 버튼으로 클릭하면 원격 지점 삭제 옵션이 표시됩니다.

TortoiseGit 원격 지점 삭제

미는

이전 원격 지점을 삭제 한 후 푸시 창의 원격 : 필드에 새 이름을 입력하기 만하면 TortoiseGit를 통해 새 원격 지점으로 직접 푸시 했으며이 지점은 Bitbucket 에서 자동으로 생성되어 표시됩니다 .

그러나 여전히 수동으로 수행하는 것을 선호하는 경우이 스레드에서 아직 언급되지 않은 점은 -u= --set-upstream입니다.

에서 git push문서 , -u단지 별칭 --set-upstream의 답변에서 이렇게 명령 실뱅 ( -set-upstream new-branch)Shashank ( -u origin new_branch) , 동등한 원격 심판 이후 기본값으로origin 다른 심판 이전에 정의되지 않은 경우 :

  • git push origin -u new_branch= git push -u new_branch 로부터 문서 정보 :

    구성이 없으면 기본값은 origin입니다.

결국, 나는 여기에 다른 답변에서 제안한 명령을 수동으로 입력하거나 사용하지 않았으므로 비슷한 상황에서 다른 사람들에게 유용 할 수 있습니다.


문제는 리모컨이 호출되지 않는다는 것 origin입니다. 명령을 실행할 때 리모컨 이름을 지정해야합니다 git remote. Git은 ssh공개 + 개인 키를 사용하고 있음을 의미합니다. Autoload Putty keysTortoiseGit은 원격 참조로 무엇이든 할 수있는 필요한 키를 자동으로로드 한다고 가정합니다 . 마지막 git push -u으로 원격 브랜치로 푸시하기위한 별칭이 아니며 로컬로 생성 된 원격 브랜치로 푸시하기위한 별칭이며 원격 참조는 아직이 브랜치가 아닙니다 .
juanecabellob

1
@juancab -u은 별명 --set-upstream이며 "구성이 없으면 기본값은origin "입니다. SylvainShashank 새로 만든 원격 지점 으로이 기능을 사용합니다 . 문제에 기인되었을 수도 미인 대회 I 시도 할 때로드 가지고 있지 git push origin :in쉘에. 그래서 나는 당신의 downvote를 이해하지 못합니다. 나는 다른 답변에서 내 주소와 주소가없는 세부 사항을 지적하고 설명하고 해결했습니다.
CPHPython

당신은 잘못된 것을 말하고 있으며이 답변의 대부분은 질문 자체와 관련이 없습니다. 자신에게 도움이 된 것을 지적하고있는 경우 답변을 제한하고 실제로 설명하고 싶은 경우 더 나은 정보를 제공하십시오. Btw : -u는 별칭 --set-upstream이지만 원격 브랜치로 푸시하는 별칭은 아닙니다. 원격 지점에 푸시하려면 고유하게 필요 git push <remote>하며 아직 원격에 있지 않은 경우을 추가하십시오 git push -u <remote>. 따라서 -u원격에서 분기의 참조를 작성하는 데 사용됩니다.
juanecabellob

1
@juancab 아마도 당신이 잘못 생각하는 것은 아마도 별칭 이나 단어 선택이었습니다. 나는 원격 지점의 이름바꾸는 것으로 찾은 솔루션에 대한 완전한 설명을 제공하기 위해 대답을 재구성하고 다시 해석했습니다 .
CPHPython

나는 그것을 다시 말로 표현할 것이다. 이제 더 의미가 있지만 여전히 너무 깁니다. TortoiseGit 사용자에게는 제안 된 솔루션이 작동하지 않는다는 문제에 대해 더 구체적으로 설명하겠습니다. 당신은 이야기를하고 있으며 혼란스럽고 사용자가 독서를 피하게합니다. 제안으로 답변을 편집하겠습니다.
juanecabellob

1

@Sylvain Defresne의 답변이 왜 효과가 없는지 모르겠습니다.

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

업스트림을 설정 해제 한 다음 스트림을 다시 설정할 수 있습니다. 다음은 내가 한 일입니다.

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

0

이것이 옳고 그른지 모르겠지만 지점의 "이전 이름"을 지점의 "새 이름"으로 밀고 다음 두 줄로 이전 지점을 완전히 삭제했습니다.

git push origin old_branch:new_branch
git push origin :old_branch

내가 알 수있는 한, 이것은 다른 모든 대답이 정확히하는 일입니다. 당신의 대답은 더 간결합니다.
더 명확한

-1

기존 지점을 기반으로 새 분기를 만들 수 있습니다. 이처럼 오래된 지점을 삭제하십시오.여기에 이미지 설명을 입력하십시오


Git이 아닌 GitHub입니다. ;)
Bouncner

-4

이미 주어진 답변에 추가하여 새 분기가 이미 존재하는지 먼저 확인하는 버전이 있습니다 (스크립트에서 안전하게 사용할 수 있음)

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(확인은 이 답변 에서 온 것입니다 )


git show-ref --quiet --verify -- refs/heads/$new_name대신에 사용했을 것입니다 ls-remote | cut | sed | grep.
Andy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.