Исправление мерзавца после неудачной ветки filter --tree-filter - PullRequest
1 голос
/ 04 июня 2019

Так что я допустил ошибку.Мне пришлось удалить случайно переданный большой двоичный файл из истории git, и я использовал для этого команду git filter-branch --tree-filter.И, как много потоков здесь о состояниях SO, это f.up, если кто-то еще фиксирует ветку, пока вы выполняете ветку filter, я по ошибке вытянул эти изменения, объединил их, затем протолкнул на удаленный, вместоделая толчок силы без слияния.Эта ошибка привела к дублированию коммитов по всему моему хранилищу.

Есть ли способ избавиться от этих дублированных коммитов.У нас более 10K коммитов, и те были обмануты, поэтому раздавливать их вручную или делать что-либо вручную - не вариант.

У меня тоже ничего нет в .git/refs/original/refs у меня даже нетэту папку.

Могу ли я восстановить этот репо или нам нужно начать все сначала?


Обновления, отражающие @ ElpieKay

Я сделал git reset --hard наcommit (HEAD -> development) development@{2}: filter-branch: rewrite это коммит прямо перед неправильным слиянием.Это решило некоторые проблемы, но в наших текущих pull-запросах возникали многочисленные конфликты из-за недавно введенных дублированных коммитов.

Итак, я сделал git push origin -f ad67a5z2z8:development, после чего HEAD указал на коммит ad67a5z2z8, который является последним коммитом.до того, как я выполнил команду filter-branch.После этого конфликты в pull-запросах исчезают, но дублированные коммиты все еще присутствуют.Я не мог удалить их, несмотря ни на что.

1 Ответ

0 голосов
/ 04 июня 2019

Предположим, ветвь master.Запустите git reflog master.В выходных данных вы должны быть в состоянии найти одну строку сверху, которая указывает, где master был после git pull, в этом шаблоне

b3c23d5 master@{n}: pull foo master: Merge made by the 'recursive' strategy.

, а затем еще одну следующую строку, которая указывает, где master было после git filter-branch, в этом паттерне

569a613 master@{n}: filter-branch: rewrite

А строка прямо под предыдущей указывает, какой коммит master был до git filter-branch.Это может выглядеть как

123abcd master@{n}: foo bar baz

Ожидается, что хэши будут другими в вашем хранилище.В этом примере 569a613 - это тот самый коммит, который вы должны нажать принудительно.Чтобы решить проблему, необходимо выполнить 2 шага:

1) принудительное нажатие 569a613 для обновления master в удаленном хранилище,

git push origin -f 569a613:master

2) выяснитькоммиты, выдвинутые другими, и применить эти коммиты к новым master,

git log --oneline 123abcd..b3c23d5^2

коммиты, перечисленные на 2-м шаге, могут быть неточными.Проверьте их с другими участниками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...