git-filter-branch против rebase + reset --hard + push --force

Я включил файл в коммит, на котором был мой пароль, я нажал его, а позже понял, что совершил ошибку.

Я понимаю git-filter-branch (или BFG Repo-Cleaner) помогает очистить историю, однако чем это отличается от...

  1. rebase -i - перемещение коммита в подсказку, затем
  2. reset --hard [previous_commit] - чтобы применить это к репо, затем
  3. push --force

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

Итак, в чем основная разница по сравнению с git-filter-branch? Я сравниваю яблоки с апельсинами?

EDIT: Похоже, вы можете выполнить шаги 1 и 2 выше за один раз, используя rebase -i --autosquash [commit_hash].


person benomatis    schedule 26.08.2015    source источник
comment
Последнее, что я проверял, не было такого понятия, как git reverse --hard... Вы имели в виду git reset --hard?   -  person twalberg    schedule 26.08.2015
comment
но я могу представить, что это может появиться в истории для других, которые уже вытащили репо с ошибочным коммитом - да. или даже для новых клонов - нет. Нет, если нет какой-либо другой истории, на которую есть ссылки, включая эту фиксацию.   -  person jthill    schedule 26.08.2015
comment
@twalberg Исправлено, спасибо!   -  person benomatis    schedule 26.08.2015
comment
@jthill Что, если я спрошу тех, кто уже вытащил pull --force? это избавит меня от коммита, который я удалил, верно? Разве это не то же самое для git-filter-branch?   -  person benomatis    schedule 26.08.2015
comment
Это зависит от того, что вы подразумеваете под избавлением. Контент на самом деле не исчезает из какого-либо конкретного репозитория до тех пор, пока сборщик мусора не очистит его, и по умолчанию фактически не удаляется какой-либо объект, на который можно было ссылаться в течение последнего месяца. git pull --force перезапишет любые ссылки на удаленные ветки отслеживания для этого конкретного удаленного устройства, но не для других — ни теги, ни локальные ветки, ни ветки удаленного отслеживания для других удаленных устройств. git filter-branch просто переименовывает исходные ссылки; старая история никуда не исчезла, она просто спрятана, пока вы сами ее не очистите.   -  person jthill    schedule 04.09.2015
comment
@jthill может быть хорошим ответом?   -  person benomatis    schedule 04.09.2015


Ответы (1)


Да, вы можете использовать оба метода для решения вашей проблемы. Я бы рекомендовал git rebase, потому что вы лучше контролируете, как именно должны выглядеть окончательные коммиты.

git filter-branch гораздо больше подходит для внесения изменений во многие коммиты, а не только в один.

person FelipeC    schedule 26.08.2015
comment
Им приходится переустанавливать свои локальные ветки на новые и вручную удалять старые коммиты. Есть инструкция, как это сделать. В этом проблема переписывания истории. - person FelipeC; 27.08.2015