Сделать текущую ветвь Git главной ветвью
У меня есть репозиторий в Git. Я сделал ветку, затем сделал некоторые изменения как для мастера, так и для ветки.
Затем, десятки коммиттов позже, я понял, что ветвь находится в гораздо лучшем состоянии, чем мастер, поэтому я хочу, чтобы ветвь "стала" мастером и игнорировала изменения на главном сервере.
Я не могу объединить его, потому что я не хочу сохранять изменения в master. Что мне делать?
Дополнительно: В этом случае "старый" мастер уже был push
-ed в другой репозиторий, такой как GitHub. Как это может измениться?
Ответы
Ответ 1
Проблема с двумя другими ответами заключается в том, что у нового мастера нет старого мастера как предка, поэтому, когда вы его нажимаете, все остальные будут перепутаны. Это то, что вы хотите сделать:
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
Ответ 2
Убедитесь, что все вытолкнуто в удаленный репозиторий (GitHub):
git checkout master
Перезаписать "master" с помощью "better_branch":
git reset --hard better_branch
Вставьте push в удаленный репозиторий:
git push -f origin master
Ответ 3
Изменить: Вы не сказали, что нажали на публичный репо! Это делает мир различий.
Есть два пути: "грязный" способ и "чистый" способ. Предположим, что ваша ветка называется 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
Ответ 4
Переименуйте ветвь на master
на:
git branch -M branch_name master
Ответ 5
Из того, что я понимаю, вы можете разветкить текущую ветку на существующую ветку. По сути, это перезапишет 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 on the remote
git reset --hard origin/master
Ответ 6
Решения, приведенные здесь (переименование ветки в "хозяине" ), не настаивают на последствиях для ретрансляции удаленного (GitHub):
-f
--force
Обычно команда отказывается обновлять удаленный реф, который не является предком локального ref, используемого для его перезаписывания. Этот флаг отключает проверку. Это может привести к тому, что удаленный репозиторий потеряет фиксации; используйте его с осторожностью.
Если другие уже вытащили ваше репо, они не смогут вытащить эту новую магистерскую историю, не заменяя своего хозяина этой новой главной веткой GitHub (или имея дело с большим количеством слияний).
Существуют альтернативы git push -force для публичных репозиториев.
Ответ Jefromi (слияние правильных изменений обратно к оригинальному мастеру) является одним из них.
Ответ 7
Я нашел этот простой способ работать лучше. Он не переписывает историю, и все предыдущие проверки ветки будут добавлены к мастеру. Ничто не потеряно, и вы можете четко видеть, что произошло в журнале фиксации.
Цель: Сделать текущее состояние "ветки" "мастером"
Работая с филиалом, фиксируйте и нажимайте свои изменения, чтобы убедиться, что локальные и удаленные репозитории обновлены:
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
После этого ваш мастер будет точным состоянием вашего последнего фиксации ветки, и ваш журнал фиксации будет показывать все проверки ветки.
Ответ 8
Можно также проверить все файлы из другой ветки на мастер:
git checkout master
git checkout better_branch -- .
а затем зафиксировать все изменения.
Ответ 9
Я нашел ответ, который хотел найти в записи блога Замените основную ветку на другую ветку в 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
По сути, это то же самое, что и ответ каскабеля. За исключением того, что "опция", которую он добавил ниже своего решения, уже встроена в мой основной блок кода.
Так проще найти.
Я добавляю это как новый ответ, потому что, если мне понадобится это решение позже, я хочу, чтобы весь код, который я собираюсь использовать, был в одном блоке кода.
В противном случае я могу скопировать-вставить, а затем прочитать подробности ниже, чтобы увидеть строку, которую я должен был изменить - после того, как я уже выполнил ее.
Ответ 10
Чтобы добавить к ответу 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>
Ответ 11
Если вы используете eGit в Eclipse:
- Щелкните правой кнопкой мыши узел проекта.
- Выберите команду → затем Дополнительно → затем переименовать ветвь
- Затем разверните папку удаленного отслеживания.
- Выберите ветку с неправильным именем, затем нажмите кнопку переименования, переименуйте ее в любое новое имя.
- Выберите нового мастера, затем переименуйте его в мастер.
Ответ 12
Мой способ делать вещи следующий
#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
Ответ 13
Следующие шаги выполняются в браузере Git на базе Atlassian (сервер Bitbucket)
Создание {current-branch} в качестве master
- Сделайте ветку из
master
и назовите ее "master-duplicate". - Сделайте ветку из {current-branch} и назовите ее "{current-branch} -copy".
- В настройках репозитория (Bitbucket) измените "Разделение по умолчанию" на "master-duplicate" (без этого шага вы не сможете удалить мастер - "В следующем шаге").
- Удалить ветку "master" - я сделал этот шаг из исходного дерева (вы можете сделать это из браузера CLI или Git)
- Переименуйте "{current-branch}" в "master" и нажмите на репозиторий (это создаст новую "ведущую" ветвь, все еще "{current-branch}" будет существовать).
- В настройках репозитория измените "Разделитель по умолчанию", чтобы указать "мастер".
Ответ 14
Для меня я хотел, чтобы мой дьявол вернулся к мастеру после того, как он был впереди.
Пока на разработке:
git checkout master
git pull
git checkout develop
git pull
git reset --hard origin/master
git push -f
Ответ 15
Использование:
get fetch && git checkout branch