Подтвердить что ты не робот

Мне нужно всплывать и удалять "среднюю" фиксацию в моей главной ветке. Как мне это сделать?

Например, в следующей главной ветке мне нужно удалить только commit af5c7bf16e6f04321f966b4231371b21475bc4da, что является вторым из-за предыдущей перезагрузки:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <[email protected]>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <[email protected]>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

Мне нужно mantain

  • Первая фиксация 60b413512e616997c8b929012cf9ca56bf5c9113,
  • Третий фиксатор e6523efada4d75084e81971c4dc2aec621d45530 и
  • Последняя фиксация 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"отбрасывание" только вторая фиксация af5c7bf16e6f04321f966b4231371b21475bc4da

Как я могу это сделать? заранее спасибо Лука

4b9b3361

Ответ 1

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

Revert - это правильное решение, когда ветка была передана другим репозиториям. git revert af5c7bf16 создаст новый фиксатор, который просто изменит изменения, внесенные af5c7bf16. Таким образом, история не переписывается, вы сохраняете четкую запись об ошибке, и другие репозиции будут принимать push.

Здесь хороший способ стереть: git rebase -i <commit>^ Это приведет вас к фиксации непосредственно перед тем, который вы хотите удалить. Интерактивный редактор покажет вам список всех коммитов назад к этой точке. Вы можете выбрать, сквош и т.д. В этом случае удалите строку для фиксации, которую вы хотите удалить и сохранить файл. Rebase завершит свою работу.

Ответ 2

Если rebase является опцией, вы можете переустановить и просто отказаться от нее:

$ git rebase -i 414ceffc^

Если rebase не является опцией, вы можете просто вернуть его:

$ git revert af5c7bf16

Ответ 3

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

  • Создайте новую ветку с головы, содержащей все коммиты, и переключитесь на нее.
  • Верните новую ветку обратно в точку, из которой вы хотите начать новую базу.
  • Затем (здесь ключевой момент) cherry pick последующие коммиты, которые вы на самом деле хотите применить после этого от исходной ветки к новой, и пропустите коммиты, которые вам больше не нужны (т.е. те, которые вы удаляете).
  • При желании переименуйте исходную ветвь на то, что указывает на ее старый код, а затем переименуйте новую ветвь, из которой был выдан оригинальный.
  • Наконец, нажмите свои изменения на дистанционное репо (если оно используется). Вероятно, вам придется использовать "принудительный толчок". Если у ваших коллаборационистов возникли проблемы с пересмотром, может быть проще всего просто клонировать репо снова из удаленного источника. Так или иначе, вы, скорее всего, захотите поговорить с ними, если вы все равно вырвете из середины своей истории!

Информация о Cherry Picking: Что делает сборка вишни с помощью git?

Вот некоторые из них делают это с Tortoise git (как я только что сделал). Это определенно проще использовать утилиту gui для этих видов операций! Черри-выбор с использованием TortoiseGit