현재 Git 브랜치를 마스터 브랜치로 만들기


1657

Git에 저장소가 있습니다. 지점을 만든 다음 마스터와 지점을 모두 변경했습니다.

그런 다음 수십 번의 커밋 후에 지점이 마스터보다 훨씬 나은 상태임을 깨달았으므로 지점이 마스터가되게하고 마스터의 변경 사항을 무시하기를 원합니다.

변경 사항을 마스터에 유지하고 싶지 않기 때문에 병합 할 수 없습니다. 어떻게해야합니까?

Extra :이 경우 '이전'마스터는 이미 pushGitHub와 같은 다른 저장소에 저장되어 있습니다. 이것이 어떻게 변화합니까?


2
매우 유사한 질문에 대한 답변을 확인하십시오 stackoverflow.com/q/2862590/151641
mloskot

4
동일한 문제가 있었다, 그러나 나는 단순히 마스터를 제거하고 마스터로 다른 지점 이름 : stackoverflow.com/a/14518201/189673
jayarjo

10
@jayarjo 당신은 가능한 경우 역사를 다시 작성하고 다음에 마스터를 당기려고 할 때 다른 사람들에게 문제를 일으킬 수 있기 때문에 이것을 피해야합니다.
joelittlejohn

3
이것이 @Jefromi의 답변을 좋아하는 이유입니다. 아카이브 기록의 해체가 진행되고 있지 않습니다.
froggythefrog

답변:


2134

다른 두 가지 대답의 문제는 새로운 마스터가 이전 마스터를 조상으로 가지고 있지 않으므로 푸시하면 다른 모든 사람들이 엉망이된다는 것입니다. 이것은 당신이하고 싶은 것입니다 :

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

역사를 좀 더 명확하게하려면 병합 커밋 메시지에 정보를 추가하여 수행 한 작업을 명확하게하는 것이 좋습니다. 두 번째 줄을 다음과 같이 변경하십시오.

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

25
git의 병합 "전략"에 대한 참고 사항과 --strategy=ours는 다릅니다 --strategy=recursive -Xours. 즉, "우리의"는 그 자체로 전략이 될 수 있으며 (결과는 현재 지점이 무엇이든 상관 없음) 또는 "재귀"전략에 대한 옵션으로 전달됩니다 (다른 지점의 변경 사항을 가져오고 충돌이있을 때 현재 지점의 변경 사항을 자동으로 선호 함) ).
켈빈

5
나는 git merge --strategy=ours master -m "new master"그것이 작동 하기 위해 두 번째 줄을 만들어야 했습니다.
백열 자

5
@Johsm 그것이 바로 내 대답의 첫 문장에 관한 것입니다. 그렇게하면 새 마스터는 이전 마스터와 동일한 기록을 가지지 않습니다. 밀거나 당기려면 매우 나쁩니다. 제대로 작동하려면 공유 조상이 있어야합니다. 대신 당신이 말하는 것을하면, 당신이 그것을 밀려 고 할 때 당신이 그것을 강요하지 않으면 단순히 실패 할 것입니다 (이것은 나쁘고 당신을 막으려 고하기 때문에). 이전 마스터와 새 마스터를 병합하려고 시도하는데, 이는 아마도 열차의 잔해 일 것입니다.
Cascabel

4
병합하는 동안 vi 편집기가 나타나면 : w (저장하기 위해) : q (vi에서 나가기 위해)를 입력하십시오.
Tomas Kubes

9
이 답변은 훌륭합니다. git push코드를 원격으로 푸시하려면이 직후 에 수행해야한다고 (새롭거나 확실하지 않은 사람들을 위해) 추가하고 싶었 습니다. 다음과 같은 경고가 표시 될 수 있습니다 Your branch is ahead of 'origin/master' by 50 commits.. 그냥 밀어! : D
chapeljuice

387

모든 것이 원격 저장소 (GitHub)로 푸시되었는지 확인하십시오.

git checkout master

"better_branch"로 "master"를 덮어 씁니다.

git reset --hard better_branch

원격 저장소로 강제 푸시하십시오.

git push -f origin master

81
이것은 아마도 대부분의 사람들이 찾고있는 대답 일 것입니다. BS 전략 병합에 대한 다른 모든 답변은 지점을 완전히 대체하지 않습니다. 이것은 내가 원하는 것처럼 모든 것을 만들었습니다. 단순히 분기를 덮어 쓰고 강제로 밀어 넣으십시오.
Gubatron

31
이것이 실제로 많은 사람들이 찾고있는 것이지만, 다른 리포지토리의 다른 사본은 git reset --hard origin/master다음에 가져 오기를 원할 때 필요합니다 . 그렇지 않으면 git은 변경 사항을 (현재) 다양한 로컬로 병합하려고 시도합니다. 이것의 위험은이 답변에
7yl4r

3
예를 들어 비즈니스 환경에서이하지 않습니다 작업 - 또한 저장소에 힘 푸시 허용 될 필요가 있음을 유의하시기 바랍니다
inetphantom

여기의 단점은 사람들이 원하는 것에 따라 단점이 될 수도 있습니다. 마스터 히스토리를 다른 브랜치의 히스토리로 대체하려는 경우 이것이 당신의 대답입니다.
b15

75

편집 : 당신은 당신이 공공 저장소에 밀 었다고 말하지 않았다! 그것은 세상을 변화시킵니다.

"더러운"방법과 "깨끗한"방법의 두 가지 방법이 있습니다. 지점 이름이이라고 가정합니다 new-master. 이것은 깨끗한 방법입니다.

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

그러면 이름이 바뀐 분기와 일치하도록 구성 파일이 변경됩니다.

구성 파일을 업데이트하지 않는 더러운 방법으로도 할 수 있습니다. 이것은 위의 후드에서 일어나는 일입니다 ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

2
감사합니다. 하나 더 질문. 나는 그것을 github에 밀어 넣고있다. 이 작업을 수행하면 어떻게됩니까?
Karel Bílek

3
@Karel : 다른 사용자들에게는 약간의 혼란을 줄 것입니다. 마스터를 github 마스터로 재설정해야합니다. 문제를 일으키지 않으려면 내 대답을 살펴보십시오.
Cascabel

6
@ Dietrick Epp : 더러운 길을 제안하는 것이 좋은 아이디어인지 확실하지 않습니다. 원격 추적, reflogs를 망칠 것입니다 ... 당신이 그것을 한 이유를 생각할 수 없습니다.
Cascabel

2
아, 좋은 지적입니다. 그래도 두 가지 방법을 모두 사용할 수 있습니다 git branch old-master master; git branch -f master new-master. 백업 브랜치를 새로 만든 다음 마스터를 새 마스터로 직접 이동하십시오. (그리고 당신의 이름을 잘못 입력하여 죄송합니다, 방금 알았습니다)
Cascabel

2
@FakeName 나는 그것을 할 이유가 없다고 결론 내리지 않았다. 단지 더러운 길 을 할 이유가 없다고 생각했다 . 이전 명령에서와 같이 일반적인 명령을 사용하여 수행 할 수 있으며 reflogs가 그대로 있고 지칠 가능성이없는 경우를 제외하고 동일한 결과를 얻을 수 있습니다. 구현 세부 사항을 다루지 않기 때문에 작동합니다.
Cascabel

46

다음과 같이 지점 이름을 바꾸십시오 master.

git branch -M branch_name master

11
불행히도 git은 브랜치 이름 변경을 추적하지 않으므로 이미 리포지토리를 원격으로 밀고 다른 사람들이 로컬 이전 마스터 브랜치에서 로컬 변경 사항을 가지고 있으면 문제가 발생합니다.
thSoft

이 차이가 git checkout master&&git reset --hard better_branch있습니까?
wotanii

26

내가 이해 한 것에서 현재 분기를 기존 분기로 분기 할 수 있습니다. 본질적으로 이것은 master현재 브랜치에있는 모든 것을 덮어 씁니다 .

git branch -f master HEAD

일단 그렇게하면 일반적으로 로컬 master분기를 푸시 할 수 있으며 여기에 force 매개 변수가 필요할 수도 있습니다.

git push -f origin master

병합이나 긴 명령이 없습니다. 간단히 branchpush-하지만, 그래, 이 역사를 다시 쓰는 것master당신이 당신이 무슨 일을하는지 알게 한 팀에서 작업 그렇다면, 지점.




또는 모든 지점을 원격 지점으로 푸시 할 수 있다는 것을 알았습니다.

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

매우 간단하고 완벽하게 작동했습니다! 간단하고 이해하기 쉬운 두 가지 git 명령. 내 자식 저장소가 저장되었으며 이제 매우 깨끗해 보입니다. 감사!
thehelix

16

블로그 게시물에서 원하는 답변을 찾았 습니다 .master 분기를 git의 다른 분기로 바꿉니다 .

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

Cascabel의 답변 과 본질적으로 동일 합니다. 그가 솔루션 아래에 추가 한 "옵션"을 제외하고 는 이미 기본 코드 블록에 포함되어 있습니다.

이 방법으로 찾기가 더 쉽습니다.

나중에이 솔루션을 필요로하는 경우, 내가 갖고 싶어 때문에, 새 응답으로이 추가 해요 모든 코드 나는 하나 개의 코드 블록에 사용하기 위하여려고하고있다.

그렇지 않으면 복사하여 붙여 넣은 다음 아래 세부 정보 읽고 이미 실행 한 후에 변경 해야 할 줄을 볼 수 있습니다.


14

여기에 주어진 솔루션 ( 'master'에서 지점 이름 바꾸기)은 원격 (GitHub) 저장소에 대한 결과를 주장하지 않습니다.

    -에프
    --힘

일반적으로이 명령은 덮어 쓰기에 사용 된 로컬 참조의 조상이 아닌 원격 참조 업데이트를 거부합니다. 이 플래그는 검사를 비활성화합니다. 이로 인해 원격 저장소가 커밋을 잃을 수 있습니다. 조심해서 사용하십시오.

다른 사람들이 이미 리포지토리를 가져간 경우 자체 마스터를 새 GitHub 마스터 브랜치로 바꾸거나 많은 병합을 처리하지 않으면 해당 새 마스터 히스토리를 가져올 수 없습니다. 공개 리포지토리를위한 git push --force에 대한 대안
이 있습니다 . Jefromi의 대답 (올바른 변경 사항을 원래 마스터로 병합)은 그 중 하나입니다.


14

이 간단한 방법이 가장 효과적이라는 것을 알았습니다. 기록을 다시 쓰지 않으며 분기의 모든 이전 체크인이 마스터에 추가됩니다. 아무것도 잃어 버리지 않고 커밋 로그에서 발생한 내용을 명확하게 볼 수 있습니다.

목표 : "지점"의 현재 상태를 "마스터"로 설정

지점에서 작업하면서 변경 사항을 커밋하고 푸시하여 로컬 및 원격 리포지토리가 최신 상태인지 확인하십시오.

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

이 후, 마스터는 마지막 분기 커밋의 정확한 상태가되고 마스터 커밋 로그는 분기의 모든 체크인을 표시합니다.


10

다른 브랜치에서 마스터로 모든 파일을 체크 아웃 할 수도 있습니다.

git checkout master
git checkout better_branch -- .

그런 다음 모든 변경 사항을 커밋하십시오.


5

Jefromi의 답변에 추가하기 위해 source분기 기록에 의미없는 병합을 원하지 않는 경우 병합을 위한 임시 분기를 ours만든 다음 버릴 수 있습니다.

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

이렇게하면 병합 커밋이 target지점 기록에만 존재합니다 .

또는 병합을 생성하지 않으려는 경우 내용을 가져 source와서 새로운 커밋에 사용할 수 있습니다 target.

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>

3

나를 위해, 나는 내 devl이 앞서서 마스터로 돌아 오기를 원했습니다.

개발 중 :

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

2

일을하는 나의 방법은 다음과 같습니다

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

2

Eclipse 에서 eGit 을 사용하는 경우 :

  • 프로젝트 노드를 마우스 오른쪽 버튼으로 클릭하십시오.
  • 고급지점 이름 변경 을 선택하십시오.
  • 그런 다음 원격 추적 폴더를 확장하십시오 .
  • 이름이 잘못된 지점을 선택한 다음 이름 바꾸기 버튼을 클릭하고 새 이름으로 바꿉니다.
  • 새 마스터를 선택한 다음 이름을 master로 바꿉니다.

나는 그것을했지만 그것이 작동했는지 확실하지 않습니다. github에서는 아무것도 변경되지 않았지만 git extension에서는 지점 이름이 바뀌는 것을 알 수 있습니다.
Pramod

0

Atlassian (Bitbucket 서버)에서 제공하는 Git 브라우저에서 다음 단계가 수행됩니다.

{current-branch}를 다음과 같이 만들기 master

  1. 지점을 master만들고 이름을 "master-duplicate"로 지정하십시오.
  2. {current-branch}에서 분기를 만들고 이름을 "{current-branch} -copy"로 지정하십시오.
  3. 리포지토리 설정 (Bitbucket)에서 "기본 분기"를 "마스터 복제"를 가리 키도록 변경합니다 (이 단계가 없으면 마스터- "다음 단계에서")를 삭제할 수 없습니다.
  4. “마스터”브랜치 삭제-소스 트리에서이 단계를 수행했습니다 (CLI 또는 Git 브라우저에서 수행 가능).
  5. "{current-branch}"의 이름을 "master"로 바꾸고 리포지토리로 푸시합니다. 그러면 "{current-branch}"가 여전히 존재하는 새 "마스터"분기가 만들어집니다.
  6. 리포지토리 설정에서 "기본 분기"를 "마스터"를 가리 키도록 변경하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.