2013-07-08 3 views
0

Я ранее работал над функциями и объединял их только в ведущую ветвь. Теперь мне нужно поддерживать мастер как ветку с устойчивой функцией, а затем работать с веткой dev для создания новых функций.Git - возврат назад к предыдущему фиксации без потери работы

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

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

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

Теперь я сижу с мастером и разработчиком с тем же (неустойчивым) фиксацией.

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

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

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

Сообщите мне, если я смогу прояснить ситуацию.

+0

Что вы уже нажали? Это очень просто (git checkout master, git reset --hard ), чтобы переместить своего местного мастера туда, где вы хотите. – antlersoft

ответ

2

Чтобы отменить совершающее:

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

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

Что касается вашего бонусного вопроса, обычно это делается с помощью ветвей признаков. Например, у меня обычно есть несколько ветвей, над которыми я работаю: 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 был интерактивным). Это позволит вам просматривать и манипулировать коммитами, прежде чем слиться с мастером. Я рекомендую разветвление перед тем, как вы это сделаете, чтобы не повредить ветку.

+0

Просто быть лишним ясным (как потерять эти 5 коммитов, сделав жесткий сброс, будет очень плохо), жесткий сброс на хозяина НЕ сделает ничего с моей веткой dev? – Squadrons

+1

Точно. Если вы параноик, сначала сделайте это на тестовой ветке. Это не испортит вашу удаленную ветку, если вы не нажмете. – tjameson

+0

Также спасибо за добавление в ссылку git-flow. Я прочитал его, когда впервые начал использовать git, но теперь, когда я использовал его некоторое время, я считаю, что на самом деле я готов начать использовать его. – Squadrons

1

На вашем мастер филиала:

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

Бонус:

  • Лоо K для git cherry-pick
  • построить свой «адрес электронной почты» функцию на ветке от разработчика, а затем rebase ваш филиал электронной почты на master (по электронной почте филиала: git rebase master)
2

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

git branch -m master old_master 

затем

git checkout -b master HEAD~5 

двигаться мастер тур 5 совершает назад (или указать ша), то вы можете удалить old_master с

git branch -d old_master 

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

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