Удаление коммитов Git на ветке - PullRequest
7 голосов
/ 28 февраля 2012

Как мне удалить коммиты, которые разветвляются master?

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

Я пробовал различные комбинации git rebase, но никогда не получал ожидаемого результата [*].

Мой репозиторий выглядит примерно так:

A---B-----------F---G master
               /
  ... C---D---E

и я бы хотел, чтобы это выглядело примерно так:

A---B-----------F'--G' master
               /
              E'

или

A---B-------E'--F'--G' master

[*]:

  • git rebase --onto C E master
  • git checkout F; git rebase --onto C E master

1 Ответ

1 голос
/ 28 февраля 2012
  1. Это редактирование истории. В итоге вы получите что-то вроде

    A---B-----------F'---G' master
                   /
                  E'
    
  2. После этого слияние будет проблемой, потому что Git не сможет найти общих родителей между вашей историей и историей библиотек.

  3. Чтобы на самом деле это сделать, вам нужно

    1. Сброс до B (создание тега или ветви для G, чтобы сохранить его)
    2. Выполнить слияние с --no-commit.
    3. Перебазируйте или выбирайте G здесь (это будет G ')

    История будет выглядеть

    A---B-----------F'---G'
    

Чтобы сделать неглубокий клон библиотеки, вам нужно сделать что-то вроде этого (Предупреждение: не проверено):

  1. Сохранить коммиты из F (не включая) в G (включая) в патч (git format-patch F --stdout > ~/saved_commits.patch)
  2. Сброс на B. Убедитесь, что нет ветвей, которые указывают на F, E или G
  3. Удалить пульт вместе с его пространством имен ref git remote rm
  4. Стереть reflogs: git reflog expire --expire=now --all
  5. На самом деле удалите вещи из git: git gc --prune=now. Теперь вы должны увидеть, как хранилище сжалось.
  6. Повторно добавьте пульт для библиотеки.
  7. git fetch --depth=10 libraryremote
  8. Повторить слияние (обычным способом)
  9. Применение сохраненных коммитов (git am ~/saved_commits.patch).

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

...