Git — откат к предыдущему коммиту без потери работы

Раньше я работал над функциями и объединял их только в основную ветку. Теперь мне нужно поддерживать master как ветку только со стабильными функциями, а затем работать над веткой dev для создания новых функций.

Проблема в том, что я опережаю свою целевую стабильную фиксацию на мастере.

Я хотел бы настроить master так, чтобы он сказал 5 коммитов назад, подтолкнуть эту ветку вверх, а затем сохранить ее как стабильную ветку для развертывания на моем рабочем сервере.

Вот что я сделал до сих пор: при последнем коммите (перед моим стабильным коммитом) я создал новую ветку «dev». Теперь dev будет моей нестабильной новой функциональной сборкой.

Теперь я сижу с мастером и разработчиком на одном (нестабильном) коммите.

Я бы хотел, чтобы мастер теперь сидел за моей предыдущей стабильной фиксацией (5 коммитов назад).

Бонусный вопрос: если я затем захочу добавить функции от dev (которые будут фиксироваться перед мастером), но только после того, как они станут стабильными, возможно ли это? Допустим, я нахожусь в разработке и создал ленту активности и систему электронной почты, и я хотел бы включить только систему электронной почты.

Как мне объединить мою ветку функций системы электронной почты с мастером (5 коммитов позади разработчика, на основе которого основана ветвь системы электронной почты), не внося все мои другие изменения (изменения, сделанные в тех 5 коммитах, которые разработчик опережает мастер)?

Дайте мне знать, если я могу что-то прояснить.


person Squadrons    schedule 08.07.2013    source источник
comment
Что вы уже нажали? Очень легко (git checkout master; git reset --hard ‹commit id›) переместить локальный мастер обратно туда, где вы хотите.   -  person antlersoft    schedule 08.07.2013


Ответы (3)


Чтобы отменить коммиты:

git reset HEAD~5 --hard # 5 being number of commits, --hard to not keep around changed files

Поскольку вы разветвились с master, история коммитов все еще находится в dev. Слейте обратно в master, как только он будет готов.

Что касается вашего бонусного вопроса, это обычно делается с помощью веток функций. Например, у меня обычно есть несколько веток, над которыми я работаю: master (здесь только стабильный код), 1.x (здесь только выпущенный код), feature-X, feature-Y и т. д.

Каждая функция находится в песочнице, поэтому, когда она готова, я просто объединяю ее с мастером. Если функция Y зависит от X, я объединяю X в Y и продолжаю работать. После того, как вы закончите, объединитесь, чтобы освоить, протестировать и отправить.

Об этом стиле разработки есть хорошая статья: http://nvie.com/posts/a-successful-git-branching-model/. Этот пост представляет git-flow, который довольно популярен. Я не использую его точно так, как написано, но я получил от него немало советов.

В качестве альтернативы вы можете перебазироваться против мастера, исключая коммиты, которые вы не хотите сохранять. Для этого я бы использовал git rebase -i master (-i интерактивный). Это позволит вам просматривать коммиты и манипулировать ими перед слиянием с мастером. Я рекомендую выполнить ветвление до того, как вы это сделаете, чтобы не сломать вашу ветку.

person beatgammit    schedule 08.07.2013
comment
Просто чтобы быть предельно ясным (поскольку потеря этих 5 коммитов из-за жесткого сброса была бы очень плохой), жесткий сброс на мастере НЕ БУДЕТ ничего делать с моей веткой разработки? - person Squadrons; 08.07.2013
comment
Точно. Если вы параноик, сначала сделайте это на тестовой ветке. Это не испортит вашу удаленную ветку, если вы не нажмете. - person beatgammit; 08.07.2013
comment
Также спасибо за добавление ссылки на git-flow. Я прочитал его, когда впервые начал использовать git, но теперь, когда я использую его некоторое время, я считаю, что действительно готов начать его использовать. - person Squadrons; 08.07.2013

сделайте это, чтобы сохранить указатель на ваш текущий мастер

git branch -m master old_master

потом

git checkout -b master HEAD~5

чтобы переместить Tour Master 5 коммитов назад (или указать sha), то вы можете удалить old_master с помощью

git branch -d old_master

Для бонусного вопроса вы можете разработать ветки функций и объединить их с --no-ff в ветке разработки, а затем, сидя на мастере, вы должны выполнить git merge --no-ff devcommit , где devcommit представляет собой слияние этой ветки функций в разработке. .

В этом сообщении вы можете увидеть пример того, как это сделать.

person DRC    schedule 08.07.2013

На мастере вашей ветки:

  • git checkout -b dev: теперь у вас есть ветка dev, указывающая на тот же хэш, что и master (нестабильно)
  • git reset --hard HEAD~5 : мастер теперь 5 коммитов назад (ваши нестабильные коммиты все еще находятся в вашей ветке)

Бонус:

  • ищите git cherry-pick
  • создайте свою функцию «электронной почты» в ветке от dev, а затем rebase электронная почта вашей ветки в master (в ветке электронной почты: git rebase master)
person Bruce    schedule 08.07.2013