У меня есть хранилище в Git. Я сделал ветку, затем сделал некоторые изменения как в мастере, так и в ветке.
Затем, спустя десятки коммитов, я понял, что ветвь находится в гораздо лучшем состоянии, чем мастер, поэтому я хочу, чтобы ветка «стала» мастером и не обращала внимания на изменения в мастере.
Я не могу объединить это, потому что я не хочу сохранять изменения на мастере. Что мне делать?
Дополнительно : в этом случае «старый» мастер уже был push
подключен к другому хранилищу, такому как GitHub. Как это меняет вещи?
Ответы:
Проблема с двумя другими ответами состоит в том, что у нового мастера нет старого мастера в качестве предка, поэтому, когда вы нажимаете его, все остальные будут испорчены. Это то, что вы хотите сделать:
Если вы хотите, чтобы ваша история была немного понятнее, я бы порекомендовал добавить некоторую информацию в сообщение коммита слияния, чтобы прояснить, что вы сделали. Измените вторую строку на:
источник
--strategy=ours
отличается от--strategy=recursive -Xours
. Т.е. «наша» может быть стратегией сама по себе (результатом будет текущая ветка, не смотря ни на что) или передаваться в качестве опции «рекурсивной» стратегии (вносить изменения в другую ветку и автоматически отдавать предпочтение изменениям текущей ветви в случае конфликта ).git merge --strategy=ours master -m "new master"
чтобы это работало.git push
правильные действия, если вы хотите, чтобы ваш код был удален. Вы можете увидеть предупреждение, какYour branch is ahead of 'origin/master' by 50 commits.
это ожидается. Просто нажми! : DУбедитесь, что все загружено в ваш удаленный репозиторий (GitHub):
Переписать «master» с «better_branch»:
Принудительно нажмите на ваш удаленный репозиторий:
источник
git reset --hard origin/master
следующий раз, когда они захотят извлечь, иначе git попытается объединить изменения с их (теперь) расходящимися локальными. Опасности этого объясняются больше в этом ответеРедактировать: Вы не сказали, что подтолкнули к публичному репо! Это делает мир различий.
Есть два пути: «грязный» и «чистый». Предположим, что ваша ветка названа
new-master
. Это чистый способ:Это изменит конфигурационные файлы в соответствии с переименованными ветками.
Вы также можете сделать это грязным способом, который не будет обновлять файлы конфигурации. Это то, что происходит под капотом вышеупомянутого ...
источник
git branch old-master master; git branch -f master new-master
. Создайте резервную копию новой ветки, а затем непосредственно переместите мастер на новый мастер. (И извините за неправильное написание вашего имени, только что заметил)Переименуйте ветку в
master
:источник
git checkout master&&git reset --hard better_branch
?Из того, что я понимаю, вы можете ветвить текущую ветку в существующую ветку. По сути, это перезапишет
master
все, что у вас есть в текущей ветке:После того, как вы это сделаете, вы можете обычно выдвигать свою локальную
master
ветку, возможно, здесь также требуется параметр force :Нет слияний, нет длинных команд. Просто
branch
иpush
- но, да, это будет переписать историю вmaster
отрасли, так что если вы работаете в команде , вы получили , чтобы знать , что вы делаете.В качестве альтернативы я обнаружил, что вы можете перенести любую ветку в любую удаленную ветку, поэтому:
источник
Я нашел ответ, который хотел найти в записи блога. Замените основную ветку другой веткой в git :
По сути, это то же самое, что и ответ Каскабель . За исключением того, что «вариант» он добавил ниже своего решения, уже встроена в мой основной блок кода.
Так проще найти.
Я добавляю это как новый ответ, потому что, если мне нужно это решение позже, я хочу, чтобы все код, который я собираюсь использовать, был в одном блоке кода.
В противном случае я могу скопировать-вставить, а затем прочитать подробности ниже, чтобы увидеть строку, которую я должен был изменить - после того, как я уже выполнил ее.
источник
Приведенные здесь решения (переименование ветки в «master») не настаивают на последствиях для удаленного (GitHub) репо:
Если другие уже извлекли ваше хранилище, они не смогут извлечь эту новую мастер-историю, не заменив своего собственного мастера новой мастер-веткой GitHub (или не выполнив много слияний).
Есть альтернативы git push --force для публичных репозиториев .
Ответ Джефроми (объединение правых изменений с оригинальным мастером) - один из них.
источник
Я нашел этот простой метод, чтобы работать лучше всего. Он не переписывает историю, и все предыдущие проверки филиала будут добавлены к мастеру. Ничего не потеряно, и вы можете ясно увидеть, что произошло в журнале коммитов.
Цель: сделать текущее состояние "филиала" "мастером"
Работая над веткой, внесите изменения и отправьте их, чтобы убедиться в актуальности локальных и удаленных репозиториев:
После этого ваш мастер будет точно соответствовать состоянию вашего последнего коммита ветки, а в вашем журнале мастер коммитов будут показаны все проверки ветки.
источник
Также можно извлечь все файлы из другой ветки в master:
и затем передайте все изменения.
источник
Чтобы добавить к ответу Джефроми, если вы не хотите помещать бессмысленное слияние в историю
source
ветви, вы можете создать временную ветку дляours
слияния, а затем выбросить ее:Таким образом, коммит слияния будет существовать только в истории
target
ветки.В качестве альтернативы, если вы вообще не хотите создавать слияние, вы можете просто взять содержимое
source
и использовать его для нового коммитаtarget
:источник
Для меня я хотел, чтобы мой дьявол вернулся к мастеру после того, как он был впереди.
Пока на разработке:
источник
Мой способ ведения дел заключается в следующем
источник
Если вы используете eGit в Eclipse :
источник
Следующие шаги выполняются в браузере Git на платформе Atlassian (сервер Bitbucket)
Делая {current-branch} как
master
master
и назовите ее «master-duplicate».источник