로컬 및 원격 Git 리포지토리 모두의 마스터 브랜치 이름 바꾸기


820

나는 지점이 master원격 브랜치를 추적합니다 origin/master.

master-old로컬 및 원격으로 이름을 바꾸고 싶습니다 . 이것이 가능한가?

추적하고 origin/master( master를 통해 항상 로컬 지점 을 항상 업데이트 한) 다른 사용자의 git pull경우 원격 지점의 이름을 바꾼 후 어떻게됩니까?
자신의겠습니까 git pull정지 작업 또는 그것이 찾을 수 없다는 오류 던질 것 origin/master이상을?

그런 다음 계속해서 master로컬 및 원격 모두에 새 분기 를 만들고 싶습니다 . 다시 한 번이 작업을 수행 한 후에 다른 사용자가 수행하면 어떻게 git pull됩니까?

이 모든 것이 많은 문제를 일으킬 것이라고 생각합니다. 내가 원하는 것을 얻을 수있는 깨끗한 방법이 있습니까? 아니면 그대로두고 master새 지점을 만들고 master-new더 이상 작업해야합니까?


2
허용 된 답변에 제공된 조리법은 모든 이름의 지점에 적용되지만 Git 의 마스터 지점 의 (기본적으로) 특수한 역할로 인해주의 사항은 언급되지 않습니다 .
kynan

3
@ kynan : 이해가 안되는 것 같아요. 마스터에게는 어떤 경고가 적용되고 다른 지점에는 적용되지 않습니까? 그것이 xy라는 지점이고 다른 사람들이 그 지점을 추적했다면 어떻게 다른가?
Albert

4
일반적으로 원격 마스터를 삭제할 수 없다는 경고입니다. 그러나 Aristotle의 답변에는 적용되지 않으므로 수락 된 답변으로 표시 할 수 있습니다. 당신은 어떤이 맞아요 git push -f할 수있는 능력에 영향을 미치는 pull모든 원격 추적 브랜치에서합니다.
kynan

master-old이전 master분기 와 동일한 커밋을 가리키는 새 분기 를 만들 수 있습니다 . 그럼 당신은 덮어 쓸 수 있습니다 master을 수행하여 새로운 변화와 분기를 mergeours전략. 리모컨이 빠른 변경을 허용하지 않는 경우 병합을 수행 할 수 있습니다. 이는 다른 사용자가 강제 업데이트를하지 않음을 의미합니다.
dnozay 2016 년

1
@kynan master은 기존의 유일한 지점 인 한 특별합니다. 둘 이상을 가지 자마자 모든 지점이 같은 위치에 있습니다.
jub0bs

답변:


614

이름을 바꾸는 가장 가까운 것은 리모컨을 삭제 한 다음 다시 만드는 것입니다. 예를 들면 다음과 같습니다.

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

그러나 여기에는 많은 경고가 있습니다. 첫째, 기존 체크 아웃은 이름 바꾸기에 대해 알지 못합니다 .git은 지점 이름 바꾸기를 시도 하지 않습니다 . 새로운 master것이 아직 존재하지 않으면 git pull이 오류가 발생합니다. 새로운 master것이 만들어진 경우. 풀 병합하려고 시도 master하고 master-old. 따라서 이전에 저장소를 체크 아웃 한 모든 사람과 협력하지 않는 한 일반적으로 나쁜 생각입니다.

참고 : 최신 버전의 git에서는 기본적으로 마스터 분기를 원격으로 삭제할 수 없습니다. receive.denyDeleteCurrent구성 값을 원격 저장소 로 warn또는 원격 저장소 ignore에서 설정하여이를 대체 할 수 있습니다 . 그렇지 않으면 즉시 새 마스터를 만들 준비가되면 단계를 건너 뛰고 단계로 넘어 갑니다 . 원격 구성을 변경할 수 없으면 마스터 분기를 완전히 삭제할 수 없습니다!git push remote :master--forcegit push remote master

이 경고는 현재 분기 (일반적으로 master분기) 에만 적용됩니다 . 다른 분기는 위와 같이 삭제하고 다시 만들 수 있습니다.


2
브랜치는 단지 (이름, 해시) 쌍입니다. 브랜치에는 reflog가 있지만 원격 클라이언트에는 노출되지 않습니다.
bdonlan

122
원격에서 마스터를 삭제하기 전에 원격에서 마스터를 생성합니다. 난 그냥 편집증이야
Adam Dymitruk

6
아래 아리스토텔레스의 답변을 사용하면 마스터를 삭제하지 않고도이 작업을 수행 할 수 있으므로 바람직하다고 생각합니다.
Clay Bridges

13
당신이 사용할 수있는 경우는 명확하고 SAFE 것 new-branch-nameold-branch-name대신에 master/ master-old, 따라서이 일반적인 문제입니다.
Jaider

2
삭제 된 브랜치 (여기서는 master)가 다른 브랜치에 의해 참조되지 않으면, git은 그에 대한 모든 커밋을 가비지 수집 할 수 있습니다. – 일부 git porcelain 명령은 가비지 콜렉션을 트리거합니다. – 따라서 : 동일한 커밋을 가리키는 새 이름을 먼저 만든 다음 이전 이름을 삭제하십시오.
Robert Siemer

257

현재 있다고 가정합니다 master.

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. 먼저 로컬 리포지토리 의 커밋을 기반으로 리포지토리에 master-old분기를 만듭니다 .originmaster
  2. 이 새 지점에 대한 새 로컬 지점을 만듭니다 origin/master-old(추적 지점으로 자동 설정 됨).
  3. 이제 master당신이 원하는 커밋을 지역 으로 지정하십시오 .
  4. 마지막으로 저장소 master에서 강제 변경 origin하여 새 로컬을 반영하십시오 master.

(다른 방법으로 수행하는 경우 master-old추적을 올바르게 설정하기 위해 적어도 하나 이상의 단계가 필요합니다 origin/master-old.이 문서 작성 시점에 게시 된 다른 솔루션은 포함하지 않습니다.)


11
이것은 "답변"보다 더 나은 대답이지만, 여기에 온 사람들이 (명시 적으로 마스터가 아닌) 지점의 이름을 바꾸려면 3 단계는 의미가 없습니다.
knocte

그것은 당신이 master또는 다른 지점 에 있는지 여부에 대한 답에 전혀 차이가 없습니다 . 문제는 그것 심하게보다 더 복잡한 작업에 대한 요청, 그러나 표제가 붙었다 단지 지점의 이름을 변경.
아리스토텔레스 Pagaltzis

3
이것은 나를 위해 일한 솔루션으로 판명되었습니다. master를 다른 지점으로 바꾸려고했습니다. git log -1 origin / what_i_want_as_new_master를 수행하여 3 단계에 대한 $ new_master_commit을 얻었습니다. 푸시 (4 단계) 후 다른 개발자는 "295 커밋으로 지점이 마스터보다 앞서 있습니다"라는 메시지를 가져옵니다. 이 문제를 해결하기 위해 각 실행에 대해 이메일을 발송했습니다. git pull; 자식 체크 아웃 some_random_branch; 자식 분기 -D 마스터; 자식 풀; 자식 체크 아웃 마스터; 기본적으로 로컬 마스터를 제거하고 새 버전을 가져와야합니다. 그렇지 않으면 로컬에 잘못된 위치에 있습니다.
nairbv

당신은 훨씬 더 쉽게 것을 할 수 있었다 : 그들은 이미있어 가정 master그들은 그냥 할 수있는 git fetch && git reset --hard origin/master자신의 지역을 강제로 master에있는 것과 동일하게 origin. 나는 당신이 master유지하고 싶은 것보다 로컬 커밋을 가지고있는 더 복잡한 경우뿐만 아니라 이것을 문서화 했다. stackoverflow.com/q/4084868
Aristotle Pagaltzis

원격 설정 파일이 "denyNonFastforwards = false"인지 확인하십시오. 또는 "원격 : 오류 : 빨리 감기를하지 않는 심판 / 헤드 / 마스터 거부 (먼저 당길 것)"
gjcamann

159

Git v1.7에서는 약간 바뀌 었다고 생각합니다. 지역 지점의 추적 참조를 새로운 리모컨으로 업데이트하는 것은 매우 쉽습니다.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

10
대안 --set-upstream은 다음과 같습니다. 지점의 이름을 로컬로 바꾸고 원점에서 삭제 한 후에는 다음과 같이하십시오. git push -u --all
lucifurious

4
git에서는 원격 마스터를 삭제할 수 없으므로 마스터 브랜치에서는 작동하지 않습니다.
Alexandre Neto

4
@AlexandreNeto이 경우 두 번째 줄의 세 번째 줄을 실행하고 기본 분기를 설정 new_branch한 다음 master두 번째 줄로 리모컨 을 삭제할 수 있습니다.
Tristan Jahier

3
놀랍도록 간단한 단계. 이것은 질문에 대한 가장 좋은 답변입니다
siddhusingh

13
원격 브랜치를 삭제하는 git push origin --delete old_branch것이 약간 더 읽기 쉽습니다.
ThomasW

35
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

new-branch-name삭제 하기 전에 수동으로 전환해야 할 수도 있습니다old-branch-name


이 솔루션의 일부가 로컬 이전 지점 이름을 삭제합니까, 아니면 별도의 운동입니까?
GreenAsJade

4
결국 git branch -d old-branch-name로컬 오래된 지점을 삭제하기 위해 실행해야한다고 생각합니다 .
Nabi KAZ

하나의 명령만으로 변경 사항을 푸시 할 수 있습니다 git push remote-name new-branch-name :old-branch-name..
sigod

이렇게하면 git history가 복잡하지 않습니까? 새 분기를 여는 대신 현재 분기의 이름을 바꾸면됩니다.
androidevil

1
@androider 아니요. git의 브랜치 는 간단한 참조 입니다.
sigod

29

이 지점의 이름을 변경하는 방법에는 여러 가지가 있지만, 나는 더 큰 문제에 초점을 맞출려고하고있다 : "빨리 감기와하지에 클라이언트가 로컬로 지사와 함께 엉망이 허용하는 방법" .

먼저 빠른 그림 : 마스터 브랜치의 이름을 바꾸고 클라이언트가 빨리 감기

이것은 실제로 쉬운 일입니다. 그러나 그것을 남용하지 마십시오. 전체 아이디어는 병합 커밋에 달려 있습니다. 그들은 빨리 감기를 허용하고 지점의 이력을 다른 것으로 연결합니다.

지점 이름 바꾸기 :

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

새로운 "마스터"브랜치를 생성합니다 :

# create master from new starting point
git branch master <new-master-start-point>

부모-자식 내역을 갖기 위해 병합 커밋 만들기 :

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

그리고 짜잔.

git push origin master

merge커밋을 만들면 지점을 새로운 개정으로 빨리 전달할 수 있기 때문에 작동합니다 .

합리적인 병합 커밋 메시지 사용 :

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

3
감사! git merge -s ours master-old다른 답변이 놓친 중요한 부분입니다. 또한, "쉬운 작업"은 git의 많은 경우 인 것처럼 보이는 "알기 쉬운"또는 "알기 쉬운"을 의미하지는 않지만 난 어리둥절합니다.
Martin Vidner

3
나는 삭제가 언급되지 않았고 업스트림 클론으로 작업하는 사람들의 전환이 "원활한"사실을 좋아합니다. 감사합니다!
Piotrek

12

나는 당신이 여전히 이전 질문 에서와 동일한 상황에 대해 묻는다고 가정합니다 . 즉, master-new는 기록에 master-old를 포함하지 않습니다. * master-new "master"를 호출하면 기록을 효과적으로 다시 작성할 수 있습니다. 마스터가 이전 마스터 위치의 후손이 아닌 상태에 들어가는 방법 은 중요하지 않습니다 . 단순히 해당 상태에 있다는 것입니다.

마스터가 존재하지 않는 상태에서 당기려고 시도하는 다른 사용자는 단순히 당기기가 실패하고 (원격에서는 이러한 참조가 발생하지 않음) 다시 새 장소에 존재하면 끌어 오기에서 마스터를 새 리모트 마스터와 병합하려고 시도해야합니다. 마치 저장소에 master-old와 master-new를 병합 한 것처럼. 여기서 수행하려는 작업이 주어지면 병합에 충돌이 발생합니다. (이들이 해결되고 결과가 리포지토리로 푸시 된 경우, 두 버전의 히스토리가 더 나빠질 수 있습니다.)

당신의 질문에 간단히 대답하기 위해 : 당신은 때때로 당신의 역사에 실수가있을 것이라는 것을 받아 들여야합니다. 괜찮습니다 모든 사람에게 발생합니다. git.git 리포지토리에 되돌려 진 커밋이 있습니다. 중요한 것은 기록을 게시하면 모든 사람이 신뢰할 수있는 것입니다.

* 그렇다면 변경 사항을 마스터에 적용한 다음 이전에 새 브랜치를 생성하는 것과 같습니다. 문제 없어요.


예, 그것은 같은 문제입니다. 그것을 해결하는 방법 중 하나였습니다. 하지만이 분기 이름 변경을하지 않더라도 가능하다면 흥미로 웠습니다. "마스터"와 같은 참조는 특정 커밋에 대한 참조 일 뿐이라고 생각했습니다. 나는 역사를 바꾸고 싶지 않다. 나는 마스터 참조를 다른 머리를 가리킬 것이라고 생각했다. 이것은 또한 이전에 사용한 적이 있으면 다시 지점 이름을 사용할 수 없다는 것을 의미합니다.
Albert Albert

실제로 브랜치는 참조-커밋에 대한 포인터입니다. 문제는 지점장이 특정 방식으로 (즉, 항상 빨리 감기) 진화 할 것으로 예상한다는 것입니다. 다른 사람의 관점에서 공개 리포지토리로 지점을 이동하는 것은 지점 기록을 다시 쓰는 것과 같습니다. 더 이상 사용했던 모든 것을 포함하는 커밋을 가리 키지 않습니다.
Cascabel

8

선택한 대답은 내가 그것을 시도 할 때 실패했습니다. 오류가 발생합니다 : refusing to delete the current branch: refs/heads/master. 나는 나에게 맞는 것을 게시 할 것이라고 생각한다.

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

트릭은 자리 표시자를 원격 저장소로 푸시하기 직전에 체크 아웃하는 것입니다. 나머지는 자명하며 마스터 브랜치를 삭제하고 원격 저장소로 푸시하면 이제 작동합니다. 여기 에서 발췌 .


원격 쪽에서 git push remote : master를 선택하면 실패합니다. 오류 로그 줄에 "remote : error :"가 접두사로 표시됩니다.
rafalmag

2

좋은. 내 2 센트 서버에서 로그인하고 git 디렉토리로 이동하여 베어 리포지토리에서 분기 이름을 바꾸는 방법은 무엇입니까? 동일한 브랜치를 다시 업로드하는 것과 관련된 모든 문제가있는 것은 아닙니다. 실제로 '클라이언트'는 수정 된 이름을 자동으로 인식하고 원격 참조를 변경합니다. 이후 (또는 이전) 분기의 로컬 이름을 수정할 수도 있습니다.


8
github 서버에 로그온하는 자격 증명을 잊었습니다. 자격 증명이없는 사람
:-P

1

이건 어떤가요:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

지점 추적 문제-사용자가 지점을 로컬로 수정해야 할 수 있습니까?
dnozay

1

이것이 내가 아는 가장 간단하고 '가시적 인'방법입니다.

-m을 사용하여 '이동'로컬 지점

git branch -m my_old_branch_name my_new_branch_name

'이동 한'분기를 원격으로 푸시하고 -u를 사용하여 '업스트림'을 설정하십시오.

git push origin -u my_new_branch_name

( '업스트림'을 설정하면 로컬 지점을 원격으로 '연결'하므로 가져 오기, 끌어 오기 및 푸시와 같은 작업이 작동합니다)

리모컨에서 기존 지점 삭제

git push origin -D <old_name>

(첫 번째 단계에서 '이동'했기 때문에 지역 지점이 이미 사라졌습니다)


1

OK , 로컬원격 에서 지점의 이름을 바꾸는 것은 매우 쉽습니다! ...

지점에 있으면 쉽게 할 수 있습니다.

git branch -m <branch>

그렇지 않은 경우 다음을 수행해야합니다.

git branch -m <your_old_branch> <your_new_branch>

그런 다음 다음과 같이 삭제를 원격으로 푸시하십시오.

git push origin <your_old_branch>

이제 푸시하려고 할 때 업스트림 오류가 발생하면 다음을 수행하십시오.

git push --set-upstream origin <your_new_branch>

또한 아래 이미지를 만들어 실제 명령 줄에 단계를 표시하고 단계를 따르십시오.

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


0

다음을 수행 할 수 있습니다.

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

그러나 다른 사람들이이 저장소를 공유하고 있다면 강제 추진은 나쁜 생각입니다. 강제 푸시는 개정 내역이 새 개정 내역과 충돌하게합니다.


0

작업을 수행하기 위해 다음을 쉘 스크립트에 저장할 수 있습니다.

예를 들면 다음과 같습니다.

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then 
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName #delete old branch on remote
git push --set-upstream $remote $newBranchName # add new branch name on remote and track it

여기서 기본 원격 이름 "origin"은 하드 코딩되어 있으므로 스크립트를 확장하여 구성 할 수 있도록 만들 수 있습니다!

그런 다음이 스크립트를 bash 별명, git 별명 또는 소스 트리 사용자 정의 조치와 ​​함께 사용할 수 있습니다.


-1

나는 키가 당신이 수행하는 것을 실현이라고 생각 이중 : 이름 바꾸기 mastermaster-oldmaster-newmaster.

다른 모든 답변에서 나는 이것을 합성했습니다.

doublerename master-new master master-old

여기서 doublerenameBash 함수 를 먼저 정의해야 합니다.

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

이것은 git rebase브랜치 내용이 상당히 다르다는 점에서 히스토리 변경과 유사 하지만 클라이언트가 여전히으로 안전하게 앞으로 나아갈 수 있다는 점이 다릅니다 git pull master.


-5
git update-ref newref oldref
git update-ref -d oldref newref

2
이것은 나를 위해 작동하지 않는 것, 내가 얻을 : 자식 갱신-REF 트렁크 trunk2 치명적인 : trunk2 : 유효한 SHA1
그레그 린드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.