2015-07-14 6 views
1

У меня был процесс, на котором я работал бы на отдельных ветвях разработки, а затем, когда закончил, объединил их в «стабильную» ветвь. Затем я создавал новую ветку для следующей ветки развития, созданной из мастера. Это обеспечило бы, чтобы каждая ветвь развития всегда содержала самые последние стабильные изменения. Но я допустил ошибку. Я забыл объединить ветвь развития в мастер, но потом я создал новую ветку от мастера и много работал над ней. Таким образом, эта новая отрасль, которая имеет много изменений, не обновляется с последними стабильными изменениями.Объединить изменения из ветки в другую ветку без объединения ветви

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

Если возможно, я бы предпочел сделать это визуально с помощью Source Control для XCode, чтобы сравнивать и выбирать изменения, но если не использовать Terminal, это просто отлично.

ответ

0

Если я правильно понял ваш сценарий:

  • Вы создали отделение функции от мастера.
  • Вы объединили новую работу в master («новый» используется здесь как работа, которая отличается от того, когда вы создали ветвь функции).
  • Вы теперь хотите, чтобы убедиться, что функция ветвь в курсе того, что в настоящее время на хозяина, но не хотите, чтобы на самом деле объединить мастер в.

Что вы можете сделать в этом сценарии rebase ваш филиал против хозяина.

# When on your feature branch: 
git rebase master 

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

Чтобы прояснить мой последний момент: когда вы переустанавливаете, вы делаете overwrite the history своих коммитов, создавая фиксацию, похожую на другую, но не то же самое, что и она (другой предок).

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

+0

Это, по-видимому, мой сценарий. Я хотел бы отметить, что новая ветвь dev содержит много изменений, в том числе и нажатия на нее, что мастер не имеет. Я знаю, что будут конфликты слияния. Я бы не хотел, чтобы история отделения ветви была стерта, и история мастера, конечно. Если бы вы могли расширить свой последний абзац, я был бы признателен. В частности, я не уверен, что вы подразумеваете под воздействием силы, чтобы сохранить историю. – Joey

+0

Вы не теряете историю, вы просто меняете ее.То есть, Git идентифицирует это как новую вещь, которая произошла, но это очень специфическая фиксация, которая была воспроизведена, чтобы появиться в определенном предковском порядке. – Makoto

+0

Я пошел вперед с rebase. Я разрешил конфликты, запустил 'git rebase -continue', он применил мои коммиты, которые я сделал к ветви dev, а затем запустил« Revert »слияние« master »в dev-branch». Все хорошо смотрелись на Терминале, но, глядя на код, он не имел никакого значения - изменения от мастера не сливаются в dev-ветку. Нет никаких незафиксированных изменений. – Joey

0

Возможно, вы захотите использовать модификатор --squah при слиянии. Это объединит код, но не создаст фиксацию, объединяющую истории двух ветвей.

См. http://git-scm.com/docs/git-merge

Смежные вопросы