Git reset (не сложно), а затем ускоренное слияние определенного фиксации

60
5

Случай: Branch A Commit1 → Commit2 → Commit3 → Commit4

В настоящее время голова находится в Commit4.

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

Итак, конечный результат: Commit1 → Commit4

Есть ли какая-нибудь команда git для этого? или я должен откат к Commit1 и выполнить изменения, сделанные в Commit4 вручную?

Благодарю!

спросил(а) 2015-05-12T06:42:00+03:00 4 года, 9 месяцев назад
1
Решение
69

Для меня ясно, на основании вашего вопроса, что вы хотите, чтобы последовательность фиксации читалась:

... <- C1 <- new-C4   <-- branch

(помните, стрелки всегда указывают на прошлую историю, а не на будущее).

Мне непонятно, хотите ли вы, чтобы ваша новая фиксация (которую я называю new-C4 выше), чтобы источник был таким, каким он есть в старом C4, или хотите отменить все изменения, сделанные в C2 и C3, сохраняя при этом только изменения, внесенные в C4.

Вы можете добиться последнего результата с помощью git rebase, но имейте в виду обычное предостережение, что вы никогда не должны переустанавливать опубликованный коммит. Чтобы это произошло, просто запустите:

git rebase -i HEAD~4

Это вызовет сеанс редактора, в котором вы можете сохранить или отменить определенные коммиты. См. Ответ, связанный с комментарием Мартина Конечного, или ответ Барри Гэкле.

Если вы хотите сохранить изменения, введенные C2 и C3 при отбрасывании самих git reset --soft, затем git reset --soft а git commit - правильный метод. См. Ответ VonC здесь.

ответил(а) 2015-05-12T06:52:00+03:00 4 года, 9 месяцев назад
49

Интерактивная перестановка - вот что я буду делать здесь.

Пусть говорят, что хэш для commit1 равен 27af3 (я собираю случайное число здесь, чтобы проиллюстрировать - сделайте "git log", чтобы получить фактический хеш)

Вы можете сделать:

    git rebase --interactive 27af3

Это покажет вам экран текстового редактора, содержащий список коммитов. Удалите строки, содержащие Commit2 и Commit3, и сохраните и закройте. Вы будете сидеть в желаемом конечном состоянии, которое вы указали.

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

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

ответил(а) 2015-05-12T06:47:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема