현재 Git 브랜치를 마스터 브랜치로 만들기 다음 수십 번의 커밋

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

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

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

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



답변

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

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 master

“better_branch”로 “master”를 덮어 씁니다.

git reset --hard better_branch

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

git push -f origin master


답변

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

“더러운”방법과 “깨끗한”방법의 두 가지 방법이 있습니다. 지점 이름이이라고 가정합니다 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

일단 그렇게하면 일반적으로 로컬 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


답변

블로그 게시물에서 원하는 답변을 찾았 습니다 .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의 답변 과 본질적으로 동일 합니다. 그가 솔루션 아래에 추가 한 “옵션”을 제외하고 는 이미 기본 코드 블록에 포함되어 있습니다.

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

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

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


답변

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

    -에프
    --힘

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

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