[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--forcegit 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
  1. 먼저 로컬 리포지토리 의 커밋을 기반으로 리포지토리에 master-old분기를 만듭니다 .originmaster
  2. 이 새 지점에 대한 새 로컬 지점을 만듭니다 origin/master-old(추적 지점으로 자동 설정 됨).
  3. 이제 master당신이 원하는 커밋을 지역 으로 지정하십시오 .
  4. 마지막으로 저장소 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.

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