Git filter-branch дал мне два набора коммитов

Мне нужно было удалить файл из моей истории коммитов. Я следовал инструкциям Github для удаления конфиденциальных данных:

$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch <myfile>' \
--prune-empty --tag-name-filter cat -- --all

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

2 ответа

Решение

Учитывая информацию из вопроса, существующие ответы и их комментарии, кажется, что оригинальный постер сделал несколько ошибок после выполнения git filter-branch и не сделал резервный клон репо.

Итак, вот инструкции по возврату репо в его предыдущее состояние до ответвления фильтра, если это то, что хочет сделать оригинальный автор.

Оригинальные ссылки

git filter-branch автоматически сохранит ссылки на ваши старые коммиты, если вам нужно восстановить их по какой-либо причине. Вы найдете их под своим репо .git/refs/original/refs/ каталог:

ls -l .git/refs/original/refs/heads/
total 1
-rw-r--r--    1 Keoki    Administ       41 May 23 01:13 master

ls -l .git/refs/original/refs/tags/
total 1
-rw-r--r--    1 Keoki    Administ       41 May 23 01:13 v1.0

Каждая из приведенных выше ссылок содержит идентификатор коммита ваших старых коммитов:

cat .git/refs/original/refs/heads/master
276fc24dc4b12edf75aea40f4fd50e25a5840005

cat .git/refs/original/refs/tags/v1.0
475593a612141506f59a141e38b8c6a3a2917f85

Используйте жесткий сброс для восстановления

Вернуть свой оригинал master ответвление (от того, что вы делали с ответвлением фильтра), просто сделайте полный сброс, используя приведенные выше ссылки, или используйте идентификатор commit sha, содержащийся в них:

git checkout master

# Use reference
git reset --hard refs/original/refs/heads/master

# Or use sha ID
git reset --hard 276fc24dc4b12edf75aea40f4fd50e25a5840005

Предположительно вы применили фильтр-ответвление, а затем вытащили его с пульта. Когда ты git filter-branchВы действительно дублируете свою историю. Вы создаете новый набор коммитов, идентичный старым, за исключением внесенных изменений (удаленный файл в вашем случае). Все (или большинство) идентификаторы коммитов будут изменены. Тем не менее, ваши изменения произошли только локально. Пульт все еще имеет оригинальные коммиты. Теперь вы, вероятно, пытались выдвинуть свои коммиты, но там говорилось что-то о "отстраненных головах" или вашей истории "разошлись". Тогда обычная вещь - тянуть. Таким образом, вы взяли оригинальные коммиты и объединили их в свою переписанную историю. Вместо того, чтобы тянуть, вы должны были сделать принудительный толчок, чтобы деструктивно переписать историю вашего пульта, чего-то, что git отказывается обходиться без -f по уважительной причине.

Другие вопросы по тегам