Очистка 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