[git] 로컬 및 원격 Git 리포지토리 모두의 마스터 브랜치 이름 바꾸기
나는 지점이 master
원격 브랜치를 추적합니다 origin/master
.
master-old
로컬 및 원격으로 이름을 바꾸고 싶습니다 . 이것이 가능한가?
추적하고 origin/master
( master
를 통해 항상 로컬 지점 을 항상 업데이트 한) 다른 사용자의 git pull
경우 원격 지점의 이름을 바꾼 후 어떻게됩니까?
자신의겠습니까 git pull
정지 작업 또는 그것이 찾을 수 없다는 오류 던질 것 origin/master
이상을?
그런 다음 계속해서 master
로컬 및 원격 모두에 새 분기 를 만들고 싶습니다 . 다시 한 번이 작업을 수행 한 후에 다른 사용자가 수행하면 어떻게 git pull
됩니까?
이 모든 것이 많은 문제를 일으킬 것이라고 생각합니다. 내가 원하는 것을 얻을 수있는 깨끗한 방법이 있습니까? 아니면 그대로두고 master
새 지점을 만들고 master-new
더 이상 작업해야합니까?
답변
이름을 바꾸는 가장 가까운 것은 리모컨을 삭제 한 다음 다시 만드는 것입니다. 예를 들면 다음과 같습니다.
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
--force
git push remote master
이 경고는 현재 분기 (일반적으로 master
분기) 에만 적용됩니다 . 다른 분기는 위와 같이 삭제하고 다시 만들 수 있습니다.
답변
현재 있다고 가정합니다 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
- 먼저 로컬 리포지토리 의 커밋을 기반으로 리포지토리에
master-old
분기를 만듭니다 .origin
master
- 이 새 지점에 대한 새 로컬 지점을 만듭니다
origin/master-old
(추적 지점으로 자동 설정 됨). - 이제
master
당신이 원하는 커밋을 지역 으로 지정하십시오 . - 마지막으로 저장소
master
에서 강제 변경origin
하여 새 로컬을 반영하십시오master
.
(다른 방법으로 수행하는 경우 master-old
추적을 올바르게 설정하기 위해 적어도 하나 이상의 단계가 필요합니다 origin/master-old
.이 문서 작성 시점에 게시 된 다른 솔루션은 포함하지 않습니다.)
답변
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
답변
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name
new-branch-name
삭제 하기 전에 수동으로 전환해야 할 수도 있습니다old-branch-name
답변
이 지점의 이름을 변경하는 방법에는 여러 가지가 있지만, 나는 더 큰 문제에 초점을 맞출려고하고있다 : “빨리 감기와하지에 클라이언트가 로컬로 지사와 함께 엉망이 허용하는 방법” .
이것은 실제로 쉬운 일입니다. 그러나 그것을 남용하지 마십시오. 전체 아이디어는 병합 커밋에 달려 있습니다. 그들은 빨리 감기를 허용하고 지점의 이력을 다른 것으로 연결합니다.
지점 이름 바꾸기 :
# 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
답변
나는 당신이 여전히 이전 질문 에서와 동일한 상황에 대해 묻는다고 가정합니다 . 즉, master-new는 기록에 master-old를 포함하지 않습니다. * master-new “master”를 호출하면 기록을 효과적으로 다시 작성할 수 있습니다. 마스터가 이전 마스터 위치의 후손이 아닌 상태에 들어가는 방법 은 중요하지 않습니다 . 단순히 해당 상태에 있다는 것입니다.
마스터가 존재하지 않는 상태에서 당기려고 시도하는 다른 사용자는 단순히 당기기가 실패하고 (원격에서는 이러한 참조가 발생하지 않음) 다시 새 장소에 존재하면 끌어 오기에서 마스터를 새 리모트 마스터와 병합하려고 시도해야합니다. 마치 저장소에 master-old와 master-new를 병합 한 것처럼. 여기서 수행하려는 작업이 주어지면 병합에 충돌이 발생합니다. (이들이 해결되고 결과가 리포지토리로 푸시 된 경우, 두 버전의 히스토리가 더 나빠질 수 있습니다.)
당신의 질문에 간단히 대답하기 위해 : 당신은 때때로 당신의 역사에 실수가있을 것이라는 것을 받아 들여야합니다. 괜찮습니다 모든 사람에게 발생합니다. git.git 리포지토리에 되돌려 진 커밋이 있습니다. 중요한 것은 기록을 게시하면 모든 사람이 신뢰할 수있는 것입니다.
* 그렇다면 변경 사항을 마스터에 적용한 다음 이전에 새 브랜치를 생성하는 것과 같습니다. 문제 없어요.
답변
선택한 대답은 내가 그것을 시도 할 때 실패했습니다. 오류가 발생합니다 : 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.
트릭은 자리 표시자를 원격 저장소로 푸시하기 직전에 체크 아웃하는 것입니다. 나머지는 자명하며 마스터 브랜치를 삭제하고 원격 저장소로 푸시하면 이제 작동합니다. 여기 에서 발췌 .