2013-02-21 3 views
3

У меня было плохое слияние, я не знал, что это плохое слияние, пока я не подтолкнул его к GitHub, и теперь я не знаю, как его отменить/вернуть.Отмена плохого слияния

история выглядит следующим образом:

Я открыл две отдельные ветви и совершили несколько изменений в этих отраслях. Через некоторое время я решил объединить эти ветки обратно к мастер-ветке, и для этой цели я использую $ git merge branch_name. Я объединил первую ветку и потом проверил журнал ведущей ветки: все фиксации на этой ветке были на хозяине. Затем я продолжил слияние второй ветви по той же команде. Затем я снова проверил журнал мастера, где увидел коммиты на ветке, которую я объединил, включая коммит со следующим комментарием: «Объединить ветвь branch_name». Комментарий, подобный этому, не был включен, когда я объединил другую ветку.

Короче говоря, проблема в том, что git объединил коммиты первой ветви, чтобы овладеть, как будто они являются коммитами мастера. Когда вы просматриваете сетевой график из «GitHub» или графа из «gitg», нет следа первой ветви слева, но его фиксации отображаются как коммиты главной ветви. Во второй ветке нет проблем: она показана отдельно и сливается, как ожидалось. Также обратите внимание, что после запуска команд слияния я продолжил удаление ветвей на $ git branch -d branch_name, как это было самым неотложным делом, к сожалению.

Теперь я хочу вернуться в позицию непосредственно перед тем, как запустить два последовательных слияния. Любая помощь приветствуется. Если вы прокомментируете, почему это произошло, это будет приятно.

+0

Я могу хотя бы сказать вам, что произошло то, что первая ветка была «быстрой перемоткой» слияния, и это совсем не плохо. Если вам действительно нужно сохранить историю, в будущем вам нужно вызвать merge с опцией '' --no-ff''. –

+0

Пока вы не получите ответ, я могу добавить еще две вещи: во-первых, '' git reflog'' может помочь здесь, во-вторых, что бы вы ни делали, если вы отмените и повторите слияние с не-ff-слиянием, ll в конечном итоге имеет не-быструю перемотку вперед, то есть вы должны принудительно нажать на github. Это, как правило, плохо, потому что это вызовет серьезные проблемы для всех людей, которые вытащили репозиторий тем временем. –

ответ

3
  1. Найти коммиты, которые были главами ветвей старой темы, которые вы удалили. Они должны быть двумя родителями слияния. Сделайте их в ветви снова (git branch или git checkout -b сделают трюк красиво).

  2. Переместить master в прежнее положение с git reset. На этом этапе вы вернулись туда, где вы начали, прежде чем слились.

  3. В следующий раз, когда вы слились, используйте git merge --no-ff. Это создаст фиксацию слияния, даже если Git не потребуется.

я почти всегда использую git merge с обеих --ff-only или --no-ff.

+0

Не существует слияния для первого слияния, поэтому нет родителей. –

+0

@JonasWielicki: происходит слияние. У него два родителя. Это родители, о которых я говорю. –

+0

Ааа, неважно, я понял это сейчас. Если вы теперь добавите '' git reflog'' или что-то еще полезное в качестве подсказки о том, как найти старый мастер HEAD, вы получите +1 :) –

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