Сделайте текущую ветвь 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 by:

git branch -M branch_name master

решения, приведенные здесь (переименование ветви в "master"), не настаивают на последствиях для удаленного (GitHub) РЕПО:

    -f
    --force

как правило, команда отказывается обновлять удаленный ref, который не является предком локального ref, используемого для его перезаписи. Этот флаг отключает проверку. Это может привести к потере фиксации удаленного репозитория; используйте его с осторожностью.

если другие уже вытащили ваше РЕПО, они не смогут вытащить эту новую мастер-историю, не заменив своего собственного мастера на новую мастер-ветвь GitHub (или имея дело с большим количеством слияний).
Есть альтернативы git push --force для общественности repos.
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 -- .

и затем зафиксировать все изменения.


Я нашел этот простой метод, чтобы работать лучше всего. Он не переписывает историю, и все предыдущие проверки филиала будут добавлены к мастеру. Ничего не потеряно, и вы можете ясно видеть, что произошло в журнале фиксации.

цель: сделать текущее состояние "филиала ""master"

рабочий на ветке, 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 на затмение:

  • Правой Кнопкой Мыши на узле проекта.
  • выбрать команда → далее дополнительно → далее переименовать филиал
  • затем разверните удаленного слежения.
  • выберите ветку с неправильным именем, затем нажмите кнопку переименовать, переименуйте ее в любое новое имя.
  • выберите новый мастер, затем переименуйте это хозяину.

следующие шаги выполняются в браузере Git на базе Atlassian (Bitbucket server)

создание {current-branch} как master

  1. сделать ветку из master и назовите его "master-duplicate".
  2. сделайте ветвь из {current-branch} и назовите ее "{current-branch} - copy".
  3. в настройках репозитория (Bitbucket) измените "ветвь по умолчанию" на "master-duplicate" (без этого шага вы не сможете удалить master - "на следующем шаге").
  4. удалить ветку "master" - я сделал этот шаг из исходного дерева (вы можете сделать это из браузера CLI или Git)
  5. переименовать " {current-branch} "в" master "и нажать на репозиторий (это создаст новую ветвь" master "по-прежнему будет существовать" {current-branch}").
  6. в настройках репозитория измените " ветвь по умолчанию "на"master".