Очистка git master branch и переместить некоторую фиксацию в новую ветку?
У меня есть клон репо на Github, в котором я создал новую функцию для восходящего потока. Проблема в том, что я сделал это в моей мастер-ветке, которая также содержит другие вещи, которые я вытащил из других клонов. Это полностью нарушило мою способность создать разумный запрос на тягу.
Итак, я хочу сделать следующее:
- Восстановить основную ветвь, чтобы она была точно такой же, как у ведущего мастера.
- Создайте новую ветку.
- Переместите некоторые мои старые коммиты в новую ветку.
- Создайте запрос на перенос с ветки.
И, в будущем, я буду выполнять всю свою работу в ветких и создавать отрывки от них, оставляя только мою ведущую ветку и просто сливая все, что приходит с восходящего потока.
Мои вопросы:
- Это разумный подход?
- Как бы я делал шаги 1 и 3?
Ответы
Ответ 1
Создайте новую ветку для хранения вещей
$ git branch old_master
Отправлять на удаленный компьютер для резервного копирования (просто отключить)
$ git checkout old_master
$ git push origin old_master
Reset локальный мастер для фиксации, прежде чем вы начнете изменять материал
$ git checkout master
$ git reset --hard 037hadh527bn
Объединить изменения из upstream master
$ git pull upstream master
Теперь мастер DELETE при удаленном репо
В github это не сработает без первого перехода в раздел администрирования fork и установки ветки по умолчанию на что-то другое, кроме мастера, поскольку они пытаются защитить вас от выдувания материала.
$ git push origin :master
И заново создайте его
$ git push origin master
В github вы должны теперь установить ветвь по умолчанию на главную
Ответ 2
Это почти разумный подход, но вы, возможно, немного портите порядок. Первое, что нужно сделать, это создать новую ветку, где текущие точки master
, так что вы не потеряете удобную ссылку на работу, которую вы уже сделали:
git branch mywork-orig master
После этого вы можете reset master
перейти вверх по представлению (при условии, что вы выбрали master
):
git reset --hard origin/master
Затем вы можете создать собственную ветвь с запланированными изменениями:
git checkout -b mywork
Сделайте изменения, которые вы хотите (вишня - выберите их из mywork-orig и т.д.) и отправьте запрос на растяжение для этого.
Ответ 3
-
git reset origin/master
-
git checkout -b new-branch
-
git cherry-pick <hash>
для каждой фиксации
- создайте запрос на перенос.
В качестве альтернативы вы можете:
-
git checkout -b new-branch
-
git rebase -i origin/master
- (выберите и выберите свои коммиты)
-
git checkout master
-
git reset origin/master
Ответ 4
Это уже поздно, но никто не предлагал этот более простой метод:
# make sure we're in master
git checkout master
# create new branch from current master
git branch tmp_master
# grab most recent changes from upstream w/o applying them
git fetch upstream
# force reset local master to match upstream/master
git reset --hard upstream/master
Вы сохранили локальные изменения в tmp_master
и принудительно обновили master
, чтобы соответствовать последнему upstream/master
. Теперь, чтобы получить origin/master
, как upstream/master
:
git push -f origin master
Теперь продолжайте и cherry-pick
вычеркните коммиты или rebase
изменения в верхней части текущего master
. После этого у вас уже будет новая ветка devel.
То, что вы хотели сделать, совершенно возможно, просто не в том порядке, который вы задали. И казалось, что другие забыли, что вы можете fetch
удаленных изменений, фактически не применяя их. Делает жизнь намного проще.
Ответ 5
В соответствии с git push вы можете использовать git push origin +dev:master
для:
Обновите основную ветвь репозитория с веткой dev, что позволит неперематывать обновления. Это может оставить незарегистрированные комманды, свисающие в исходном репозитории.
Я не уверен, что это работает с github. У меня нет ничего, что нужно, чтобы уничтожить прямо сейчас.:)
Это должно позволить вам сделать ваш локальный мастер выглядеть так, как вы хотите, используя git rebase -i
, а затем вывести результат до github.
В качестве альтернативы вы можете удалить основную ветвь на github (git push origin :master
), а затем переустановить ее из локального исправленного мастера. У меня такое чувство, что github может помешать вам сделать это, если это ветка по умолчанию (как, вероятно, мастер). Если это произойдет, перейдите в раздел "Админ" для своего репозитория и временно измените по умолчанию на другой ветвь.
Ответ 6
Вы можете нажать произвольный набор изменений на произвольный номер ссылки в репозитории git, используя команду git push
. В этом случае вам нужно будет определить хэш набора изменений, к которому вы хотите вернуться, и установить его в качестве главы главной ветки в удаленном репозитории. Предполагая, что этот удаленный репозиторий называется origin
, вы можете использовать следующее, где XXXX
- хэш изменения, к которому вы хотите вернуться:
git push -f origin XXXX:refs/heads/master
Переключатель -f
заставит изменение, поскольку по умолчанию git не позволит вам вводить немедленные изменения в удаленный репозиторий, поскольку это может привести к серьезным проблемам, если другие хранилища были клонированы из ваших.
Ответ 7
Если вы хотите заставить "master" выглядеть "remotes/origin/master", вы можете сделать принудительное нажатие.
$ git pull +master:master
From git://github.com/matthewmccullough/hellogitworld
+ 1d22ca0...2a52e96 master -> master (forced update)
Ответ 8
@Новелократ предложил почти то же самое, что и я. Окончательно создайте ветвь резервного копирования из текущего местоположения ветки master
:
git branch mywork-orig master
В вашем случае, я думаю, что origin
- ваша вилка github, а upstream
- это то, от чего вы разветвлялись. По этой причине, когда вы проверили локальный master
, вы должны сделать:
git reset --hard upstream/master
Это будет reset там, где upstream
master
. Затем вы также должны нажать на свою вилку на github:
git push origin +master
Затем создайте новые ветки из ветки reset master
, которая теперь должна быть такой же, как upstream/master
:
git checkout -b mywork
Поскольку вы сделали так много слияний в своей старой ветке master
, вы, вероятно, можете не чересстрочно выбирать новые ветки функций, которые вы создаете. Черри-выберите коммиты, которые вы можете, а затем просто (или не так просто;) заново создайте те, которые вы не можете легко выбрать.
Ответ 9
У меня есть подход, который логичен и максимально безопасен. Предположения:
- У вас должен быть полномочия принудительно обновлять исходные файлы.
- Предполагается, что никто другой не удалил ни один из узлов, которые должны быть удалены.
- Вы можете предотвратить обновление ведущей ветки по источнику, когда вы локально устанавливаете главную ветвь.
Переместить/переименовать локальную ветвь bad master в my-bad-master.
git branch -m master my-bad-master
Обновите локальную ветвь мастера, чтобы она соответствовала ветке главного источника.
git pull origin master:master
Сохраните начальную ветвь оригинала на ветку с именем old-master
git branch old-master master
В целях безопасности надавите ветку старого мастера на начало координат
git push origin old-master:old-master
checkout master
Внести изменения в главную ветку.!!!! Убедитесь, что никаких изменений в исходной ветке не произошло до завершения!!!
Когда это будет сделано, заставьте новую ветвь мастера вернуться к началу координат.
git push -f origin master:master