질문자 :Karel Bílek
Git에 저장소가 있습니다. 분기를 만든 다음 마스터와 분기 모두에 약간의 변경을 수행했습니다.
그런 다음 수십 개의 커밋을 수행한 후 분기가 마스터보다 훨씬 나은 상태라는 것을 깨달았습니다. 그래서 분기가 마스터가 되기를 원하고 마스터의 변경 사항을 무시합니다.
변경 사항을 마스터에 유지하고 싶지 않기 때문에 병합할 수 없습니다. 어떻게 해야 하나요?
추가 : 이 경우 '이전' 마스터는 이미 GitHub와 같은 다른 저장소 push
이것이 어떻게 변화합니까?
다른 두 답변의 문제는 새 마스터가 이전 마스터를 조상으로 갖고 있지 않기 때문에 푸시하면 다른 모든 사람들이 엉망이 될 것이라는 점입니다. 이것이 당신이 하고 싶은 일입니다:
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
Cascabel모든 것이 원격 저장소(GitHub)에 푸시되었는지 확인하십시오.
git checkout main
"main"을 "better_branch"로 덮어씁니다.
git reset --hard better_branch
원격 저장소로 강제 푸시:
git push -f origin main
Brandon Howard편집: 공개 리포지토리로 푸시했다고 말하지 않았습니다! 그것은 차이의 세계를 만듭니다.
"더러운" 방법과 "깨끗한" 방법의 두 가지 방법이 있습니다. 브랜치의 이름이 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
Dietrich Epp다음을 통해 분기의 이름을 master
로 바꿉니다.
git branch -M branch_name master
Alan Haggai Alavi내가 이해한 바에 따르면 현재 분기를 기존 분기로 분기할 수 있습니다. 본질적으로 이것은 현재 분기에 있는 모든 것으로 master
git branch -f master HEAD
일단 완료하면 일반적으로 로컬 master
분기를 푸시할 수 있으며 여기에 force 매개변수도 필요할 수 있습니다.
git push -f origin master
병합, 긴 명령이 없습니다. 단순히 branch
하고 push
. 하지만 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
fregante블로그 게시물에서 원하는 답변을 찾았습니다 . 마스터 브랜치를 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의 답변 과 동일합니다. 솔루션 아래 의 "옵션"이 이미 위의 코드 블록에 포함되어 있다는 점을 제외하고.
이 방법으로 찾기가 더 쉽습니다.
나중에 이 솔루션이 필요한 경우 하나의 코드 블록에서 사용하는 데 필요한 모든 코드를 갖고 싶기 때문에 이것을 새로운 답변으로 추가하고 있습니다.
그렇지 않으면 이미 실행한 후 복사하여 붙여 넣은 다음 아래 세부 정보를 읽고 변경 했어야 하는 행을 볼 수 있습니다.
SherylHohman이 간단한 방법이 가장 효과적이라는 것을 알았습니다. 기록을 다시 쓰지 않으며 분기의 모든 이전 체크인이 마스터에 추가됩니다. 아무것도 손실되지 않으며 커밋 로그에서 어떤 일이 발생했는지 명확하게 볼 수 있습니다.
목표: "분기"의 현재 상태를 "마스터"로 만듭니다.
브랜치에서 작업하면서 변경 사항을 커밋하고 푸시하여 로컬 및 원격 리포지토리가 최신 상태인지 확인합니다.
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
그 후 마스터는 브랜치의 마지막 커밋의 정확한 상태가 되며 마스터 커밋 로그에는 브랜치의 모든 체크인이 표시됩니다.
Mark Dietel여기에 제공된 솔루션('마스터'에서 브랜치 이름 바꾸기)은 원격(GitHub) 리포지토리에 대한 결과를 주장하지 않습니다.
- 해당 분기를 만든 후 아무 것도 푸시하지 않았다면 이름을 변경하고 문제 없이 푸시할 수 있습니다.
- GitHub에 푸시 마스터가 있는 경우 새 분기를 'git push -f'해야 합니다. 더 이상 빨리 감기 모드로 푸시할 수 없습니다 .
-NS
--힘
일반적으로 이 명령은 덮어쓰는 데 사용된 로컬 참조의 상위 항목이 아닌 원격 참조 업데이트를 거부합니다. 이 플래그는 검사를 비활성화합니다. 이로 인해 원격 저장소에서 커밋이 손실될 수 있습니다. 주의해서 사용하십시오.
다른 사람들이 이미 저장소를 가져왔다면 자신의 마스터를 새 GitHub 마스터 브랜치로 바꾸지 않고(또는 많은 병합을 처리하지 않고) 새 마스터 기록을 가져올 수 없습니다.
공개 repos에 대한 git push --force에 대한 대안 이 있습니다.
Jefromi의 답변 (올바른 변경 사항을 원래 마스터로 다시 병합)이 그 중 하나입니다.
VonC다른 분기의 모든 파일을 마스터로 체크아웃할 수도 있습니다.
git checkout master git checkout better_branch -- .
그런 다음 모든 변경 사항을 커밋합니다.
user2064284Cascabel의 답변에 추가하려면 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>
staafl나의 일을 하는 방법은 다음과 같다
#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
ar-gEclipse 에서 eGit 을 사용하는 경우:
- 프로젝트 노드를 마우스 오른쪽 버튼으로 클릭합니다.
- 팀 → 고급 → 분기 이름 바꾸기 를 선택하십시오.
- 그런 다음 원격 추적 폴더를 확장합니다.
- 잘못된 이름을 가진 분기를 선택한 다음 이름 바꾸기 버튼을 클릭하고 새 이름으로 이름을 바꿉니다.
- 새 마스터를 선택한 다음 이름을 마스터로 바꿉니다.
Junchen Liu저를 위해, 저는 develop
브랜치가 앞서 있는 마스터에게 돌아가기를 원했습니다.
개발 중:
git checkout master git pull git checkout develop git pull git reset --hard origin/master git push -f
Braden BormanAtlassian(Bitbucket 서버) 기반 Git 브라우저에서 다음 단계를 수행합니다.
{current-branch}를 master
-
master
에서 분기를 만들고 이름을 "마스터-복제"로 지정합니다. - {current-branch}에서 분기를 만들고 이름을 "{current-branch}-copy"로 지정합니다.
- 저장소 설정(Bitbucket)에서 "기본 분기"를 "마스터-복제"를 가리키도록 변경합니다(이 단계가 없으면 마스터를 삭제할 수 없습니다 - "다음 단계에서").
- "마스터" 분기 삭제 - 소스 트리에서 이 단계를 수행했습니다(CLI 또는 Git 브라우저에서 수행할 수 있음)
- "{current-branch}"의 이름을 "master"로 바꾸고 저장소로 푸시합니다(이렇게 하면 새 "master" 분기가 생성되지만 여전히 "{current-branch}"가 존재함).
- 리포지토리 설정에서 "기본 분기"를 "마스터"를 가리키도록 변경합니다.
Purushothaman댓글을 달기에는 업력이 부족합니다.
나는 이것이 OP가 원했던 것이 아니라는 것을 알고 있지만 미래에 OP와 비슷한 문제가 있을 것이라는 것을 안다면 이것을 할 수 있습니다.
여기 당신의 상황이 있습니다,
- 새롭고 우수한 새로운 주요 기능이 있지만 현재는 생산되지 않는 분기가 필요합니다. 앞으로 제품화할 계획이 있습니다.
- 현재 prod 브랜치(마스터)가 잘 실행되고 있지만 지루합니다. 약간의 변경을 할 수 있습니다.
- 나중에 필요할 경우 현재 마스터(프로덕트) 분기를 미래를 위해 안전하게 유지하려고 합니다.
이것이 혼란스럽다면 아래의 나쁜 상황 도표를 참조하십시오.
*bad situation* initial master ---> added boring changes ----merge---> you loose boring \ / ---> (awesome branch) added awesome changes ---
이를 해결하려면(즉, 지루함의 손실을 막으려면) 다음을 수행하십시오. 기본적으로,
-
git branch boring
을 수행하여 현재 마스터의 복사본을 생성합니다. 보링을 유지하려는 이름으로 바꿉니다. - 이제 마스터 분기에 새로운 멋진 기능을 추가하고 지루한 분기에 지루한 기능을 추가할 수 있습니다.
- 지루한 분기를 계속 업데이트하고 마스터에 병합하지 않는 데 사용할 수 있습니다. 지루한 기능을 잃지 않을 것입니다.
- 마스터 브랜치에는 멋진 기능이 있습니다.
그래서,
*good situation* initial master ---> added awesome changes ---> Final master(awesome) branch \ ---> (boring branch) added boring changes ---> Dont merge to master --X-->
Anuraag Barde출처 : http:www.stackoverflow.com/questions/2763006/make-the-current-git-branch-a-master-branch