source

현재 Git 분기를 마스터 분기로 설정

nicesource 2023. 5. 9. 22:48
반응형

현재 Git 분기를 마스터 분기로 설정

Git에 저장소가 있습니다.브랜치를 만들고 마스터와 브랜치를 모두 변경했습니다.

그러다 수십 번의 커밋 끝에 브랜치가 마스터보다 훨씬 좋은 상태에 있다는 것을 깨달았고, 그래서 브랜치가 마스터가 되고 마스터에 대한 변화는 무시했으면 합니다.

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

추가: 이 경우 '이전' 마스터는 이미push-GitHub와 같은 다른 리포지토리에 편집합니다.이것이 어떻게 상황을 변화시킬까요?

나머지 두 대답의 문제는 새 주인이 옛 주인을 조상으로 두고 있지 않기 때문에 밀면 다른 사람들은 모두 엉망이 된다는 것입니다.다음 작업을 수행할 수 있습니다.

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

원격 저장소(GitHub)에 모든 항목을 푸시해야 합니다.

git checkout main

"main"을 "better_branch"로 덮어씁니다.

git reset --hard better_branch

원격 저장소에 강제 푸시:

git push -f origin main

편집: 당신은 공공 레포에 밀고했다고 말하지 않았습니다!그것이 큰 차이를 만듭니다.

과 " 두 가지 .더러운" 방법과 "깨끗한" 방법의 두 가지 방법이 있습니다.분기의 이름이 지정되었다고 가정합니다.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

을 분이름다변경로음으을로 변경합니다.master기준:

git branch -M branch_name master

현재 지점을 기존 지점으로 분기할 수 있는 것으로 알고 있습니다.은 기적으로, 이다을덮다니어씁음을 덮어씁니다.master현재 지점에 있는 모든 것으로:

git branch -f master HEAD

이 작업을 완료한 후에는 일반적으로 로컬 정보를masterbranch. 여기에도 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

블로그 게시물에서 원하는 답을 찾았습니다. 마스터 분기를 다른 분기로 바꾸기:

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

그것은 본질적으로 카스카벨의 대답과 같습니다.솔루션 아래의 "옵션"이 이미 위의 코드 블록에 포함되어 있다는 점을 제외하고는,

이 길을 찾는 것이 더 쉽습니다.

나중에 이 솔루션이 필요할 경우 하나의 코드 블록에서 사용해야 하는 모든 코드필요하기 때문에 새로운 답변으로 추가합니다.

그렇지 않으면 복사하여 붙여넣은 다음 아래의 세부 정보를 읽고 이미 실행한 후 변경했어야 하는 행을 확인할 수 있습니다.

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

목표: "지점"의 현재 상태를 "마스터"로 합니다.

분기에서 작업할 때 로컬 및 원격 리포지토리가 최신인지 확인하기 위해 변경 사항을 커밋하고 푸시합니다.

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

이렇게 하면 마스터가 마지막 분기 커밋의 정확한 상태가 되고 마스터 커밋 로그에 분기의 모든 체크인이 표시됩니다.

여기에 제시된 솔루션('master'에서 분기 이름 변경)은 원격(GitHub) repo에 대한 결과를 주장하지 않습니다.

  • 브랜치를 만든 이후로 아무것도 누르지 않았다면 브랜치 이름을 바꾸고 아무 문제 없이 누르게 할 수 있습니다.
  • GitHub에 push master가 있었다면, 당신은 새로운 브랜치를 'git push -f'해야 할 것입니다: 당신은 더 이상 빠른 전진 모드로 push 할 수 없습니다.
-f--힘

일반적으로 명령은 덮어쓰는 것을 거부하는 로컬 참조의 상위가 아닌 원격 참조의 업데이트를 거부합니다.이 플래그는 검사를 비활성화합니다.이로 인해 원격 리포지토리의 커밋이 손실될 수 있습니다. 주의하여 사용하십시오.

다른 사용자가 이미 사용자의 레포를 풀한 경우 자신의 마스터를 새로운 GitHub 마스터 분기(또는 많은 병합 처리)로 교체하지 않고는 새로운 마스터 히스토리를 풀할 수 없습니다.
공공 저장소에 대한 기트 푸시, 즉 강제력에 대한 대안이 있습니다.
제프로미의 대답(권리를 원래 주인에게 다시 합치는 것)도 그 중 하나입니다.

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

git checkout master
git checkout better_branch -- .

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

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>

나의 방식은 다음과 같습니다.

#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

저는 저의develop이전 후 마스터로 돌아가기 위한 분기.

개발 중:

git checkout master
git pull

git checkout develop
git pull

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

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

  • 프로젝트 노드를 마우스 오른쪽 버튼으로 클릭합니다.
  • Team →(), Advanced →(고급), Rename(지점 이름 변경)을 선택합니다.
  • 그런 다음 원격 추적 폴더를 확장합니다.
  • 이름이 잘못된 분기를 선택한 다음 이름 바꾸기 단추를 클릭하고 새 이름으로 이름을 바꿉니다.
  • 새 마스터를 선택한 후 마스터로 이름을 변경합니다.

Atlassian(Bitbucket 서버)으로 구동되는 Git 브라우저에서 다음 단계를 수행합니다.

{current-branch}을(를) 다음으로 만드는 중master

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

이것이 OP가 원했던 것이 아니라는 것을 알지만, 앞으로 OP와 유사한 문제가 발생할 것이라는 것을 안다면 당신은 이것을 할 수 있습니다.

그래서 여기 당신의 상황이 있습니다.

  1. 새로운 우수한 절단 기능이 있지만 현재 생산되지 않는 분기가 필요합니다.당신은 미래에 그것을 촉진시킬 계획을 가지고 있습니다.
  2. 현재 prod 브랜치(마스터)는 잘 실행되고 있지만 지루합니다.약간의 변경 사항이 있을 수 있습니다.
  3. 나중에 필요할 경우 현재 마스터(prod) 분기를 안전하게 유지하려고 합니다.

이것이 혼란스럽게 느껴진다면, 아래의 나쁜 상황 도표를 참고하세요.

*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-->

gitlab이나 github 웹사이트에 가서 설정을 찾아보세요.

그런 다음 설정에서 리포지토리를 찾습니다.

기본 분기를 찾아서 확장하면 이름을 바꾸거나 다른 분기로 변경할 수 있는 옵션을 얻을 수 있습니다.

이 긱랩을 해봤는데 효과가 있었습니다.

이것이 여기서 답이 아니라는 것이 놀랍습니다.이게 제가 한 일입니다.

  1. 다른 디렉토리에 있는 파일 시스템의 repo 복사본 2개를 만들었습니다. 하나는 마스터가 있고 다른 하나는 브랜치가 있습니다.
  2. 분기에서 마스터로 모든 파일 복사(수동으로)
  3. 마스터에 변경 사항을 커밋했습니다.

이렇게 하면 모든 차이가 포함된 단일 커밋이 있고 커밋 기록이 보존되며 강제 푸시가 필요하지 않습니다.

언급URL : https://stackoverflow.com/questions/2763006/make-the-current-git-branch-a-master-branch

반응형