Сделайте текущую ветвь Git главной ветвью
У меня есть репозиторий в Git. Я сделал ветку, затем сделал некоторые изменения как для мастера, так и для ветки.
затем, десятки коммитов позже, я понял, что ветвь находится в гораздо лучшем состоянии, чем мастер, поэтому я хочу, чтобы ветвь "стала" мастером и игнорировала изменения на мастере.
Я не могу объединить его, потому что я не хочу, чтобы сохранить изменения на master. Что же мне делать?
дополнительно: в этом случае "старый" хозяин уже был push - ed в другой репозиторий, такой как GitHub. Как это все меняет?
13 ответов:
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перезаписать "master" с помощью "better_branch":
git reset --hard better_branchпринудительно нажмите на удаленный репозиторий:
git push -f origin master
Edit: вы не сказали, что вы нажали на публичное РЕПО! Это имеет огромное значение.
есть два пути," грязный "путь и" чистый " путь. Предположим, что ваша ветвь называется
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") не настаивают на последствиях для удаленного (GitHub) РЕПО:
- если вы ничего не нажимали с момента создания этой ветки, вы можете переименовать ее и нажать без каких-либо проблем.
- если у вас был push master на GitHub, вам нужно будет "git push-f" новая ветка:вы больше не можете нажать в режиме быстрой перемотки вперед.
-f --forceобычно, команда отказывается обновлять удаленную ссылку, которая не является предком локальной ссылки, используемой для ее перезаписи. Этот флаг отключает проверку. Это может привести к тому, что удаленный репозиторий потеряет коммиты; используйте его с осторожностью.
если другие уже вытащили ваше РЕПО, они не смогут вытащить эту новую мастер-историю, не заменив свой собственный мастер на эту новую ветвь GitHub master (или имея дело с большим количеством слияний).
Есть альтернативы git push --force для общественности РЕПО.
Jefromi это (слияние правых изменений обратно в исходный мастер) является одним из них.
из того, что я понимаю, вы можете ветвить текущую ветвь в существующую ветвь. По сути, это будет перезаписывать
masterС тем, что у вас есть в текущей ветке:git branch -f master HEADкак только вы это сделаете, вы обычно можете нажать свой локальный
masterветвь, возможно, требующая силу параметр здесь также: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
можно также проверить все файлы из другой ветви в master:
git checkout master git checkout better_branch -- .а затем зафиксировать все изменения.
Я нашел этот простой метод, чтобы работать лучше всего. Он не переписывает историю и все предыдущие возвраты ветки будут приложены к мастеру. Ничего не потеряно, и вы можете ясно видеть, что произошло в журнале фиксации.
цель: сделать текущее состояние "ветви ""мастер"
рабочий на ветке, commit и push изменения, чтобы убедиться, что ваши локальные и удаленные репозитории обновились:
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после этого, ваш мастер будет точное состояние вашей последней фиксации ветви, и ваш главный журнал фиксации покажет все возвраты ветви.
добавить в ответ 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>
Я нашел ответ, который я хотел в блог замените главную ветвь на другую ветвь в 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это по сути то же самое, что и ответ Каскабеля. Кроме того, что "вариант" он добавил ниже его решение уже встроено в мой основной блок кода.
это легче найти таким образом.
Я добавляю это как новый ответ, потому что если мне нужно это решение позже, я хочу иметь все код Я собираюсь использовать в одном блоке кода.
в противном случае, я могу копировать-вставить, затем прочитайте детали ниже, чтобы увидеть строку, которую я должны изменились - после того, как я уже выполнил ее.
мой способ ведения дел заключается в следующем
#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
Если вы используете eGit на затмение:
- Правой Кнопкой Мыши на узле проекта.
- выбрать команда → далее Advanced → далее переименовать филиал
- затем разверните удаленного слежения.
- выберите ветку с неправильным именем, затем нажмите кнопку переименовать, переименуйте ее в любое новое имя.
- выберите новый мастер, затем переименуйте это к мастеру.
следующие шаги выполняются в браузере Git на базе Atlassian (Bitbucket server)
создание {current-branch} как
master
- сделать ветку из
masterи назовите его "мастер-дубликат".- сделайте ветвь из {current-branch} и назовите ее "{current-branch} - copy".
- в настройках репозитория (Bitbucket) измените "ветвь по умолчанию" на "master-duplicate" (без этого шага вы не сможете удалить master - "в следующем шаге").
- удалить ветку "master" - я сделал этот шаг из исходного дерева (вы можете сделать это из браузера CLI или Git)
- переименуйте " {current-branch}" в "master" и нажмите на репозиторий (это создаст новую ветвь "master" по-прежнему будет существовать " {current-branch}").
- в настройках репозитория измените " ветвь по умолчанию "на"master".
Comments