etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 12. 28. 01:51
반응형

질문자 :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) 리포지토리에 대한 결과를 주장하지 않습니다.

    -NS
    --힘

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

다른 사람들이 이미 저장소를 가져왔다면 자신의 마스터를 새 GitHub 마스터 브랜치로 바꾸지 않고(또는 많은 병합을 처리하지 않고) 새 마스터 기록을 가져올 수 없습니다.
공개 repos에 대한 git push --force에 대한 대안 이 있습니다.
Jefromi의 답변 (올바른 변경 사항을 원래 마스터로 다시 병합)이 그 중 하나입니다.


VonC

다른 분기의 모든 파일을 마스터로 체크아웃할 수도 있습니다.

 git checkout master git checkout better_branch -- .

그런 다음 모든 변경 사항을 커밋합니다.


user2064284

Cascabel의 답변에 추가하려면 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-g

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

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

Junchen Liu

저를 위해, 저는 develop 브랜치가 앞서 있는 마스터에게 돌아가기를 원했습니다.

개발 중:

 git checkout master git pull git checkout develop git pull git reset --hard origin/master git push -f

Braden Borman

Atlassian(Bitbucket 서버) 기반 Git 브라우저에서 다음 단계를 수행합니다.

{current-branch}를 master

  1. master 에서 분기를 만들고 이름을 "마스터-복제"로 지정합니다.
  2. {current-branch}에서 분기를 만들고 이름을 "{current-branch}-copy"로 지정합니다.
  3. 저장소 설정(Bitbucket)에서 "기본 분기"를 "마스터-복제"를 가리키도록 변경합니다(이 단계가 없으면 마스터를 삭제할 수 없습니다 - "다음 단계에서").
  4. "마스터" 분기 삭제 - 소스 트리에서 이 단계를 수행했습니다(CLI 또는 Git 브라우저에서 수행할 수 있음)
  5. "{current-branch}"의 이름을 "master"로 바꾸고 저장소로 푸시합니다(이렇게 하면 새 "master" 분기가 생성되지만 여전히 "{current-branch}"가 존재함).
  6. 리포지토리 설정에서 "기본 분기"를 "마스터"를 가리키도록 변경합니다.

Purushothaman

댓글을 달기에는 업력이 부족합니다.

나는 이것이 OP가 원했던 것이 아니라는 것을 알고 있지만 미래에 OP와 비슷한 문제가 있을 것이라는 것을 안다면 이것을 할 수 있습니다.

여기 당신의 상황이 있습니다,

  1. 새롭고 우수한 새로운 주요 기능이 있지만 현재는 생산되지 않는 분기가 필요합니다. 앞으로 제품화할 계획이 있습니다.
  2. 현재 prod 브랜치(마스터)가 잘 실행되고 있지만 지루합니다. 약간의 변경을 할 수 있습니다.
  3. 나중에 필요할 경우 현재 마스터(프로덕트) 분기를 미래를 위해 안전하게 유지하려고 합니다.

이것이 혼란스럽다면 아래의 나쁜 상황 도표를 참조하십시오.

 *bad situation* initial master ---> added boring changes ----merge---> you loose boring \ / ---> (awesome branch) added awesome changes ---

이를 해결하려면(즉, 지루함의 손실을 막으려면) 다음을 수행하십시오. 기본적으로,

  1. git branch boring 을 수행하여 현재 마스터의 복사본을 생성합니다. 보링을 유지하려는 이름으로 바꿉니다.
  2. 이제 마스터 분기에 새로운 멋진 기능을 추가하고 지루한 분기에 지루한 기능을 추가할 수 있습니다.
  3. 지루한 분기를 계속 업데이트하고 마스터에 병합하지 않는 데 사용할 수 있습니다. 지루한 기능을 잃지 않을 것입니다.
  4. 마스터 브랜치에는 멋진 기능이 있습니다.

그래서,

 *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

반응형