Можно ли получить sta sh после запуска git filter-branch? - PullRequest
1 голос
/ 31 марта 2020

Я запустил git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE', чтобы зафиксировать даты принятия после того, как я перебазировал. Однако я не знал, что мой sta sh будет потерян.

Я пробовал следующее:

  • выполняется git reflog --all, проверяя самый ранний коммит, который он показал (c9e4e26 HEAD@{37}: rebase (start): checkout e3536c9^) и запустил git stash list
  • запустил git fsck, проверил каждый недостижимый / висячий большой двоичный объект и зафиксировал и запустил git stash list

Есть ли способ чтобы получить эту ставку sh?

1 Ответ

2 голосов
/ 31 марта 2020

Ваш существующий sta sh не совсем потерян . Ну, это трудно найти, так что в этом смысле он "потерян". Случилось так, что git filter-branch повредил . git stash делает два, а иногда и три коммита, причем ключевой коммит похож на коммит слияния. Большинство Git команд рассматривают это как слияние. Это включает в себя git filter-branch. Это может повредить sta sh -группе, поскольку сама git stash требует этих странно сформированных скоплений коммитов - они выглядят как слияния, но не могут рассматриваться как слияния.

Так как ничего в Git на самом деле может изменить любые существующие коммиты, однако то, что сделала ветвь фильтра, было скопировать sta sh в новые и "улучшенные" (но на самом деле, поврежденные) коммиты. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) * * * * * * * * * * * * 10 * * * * * * * * * * * * * * * '' 10 * '' * * * * * * * * * '' 10 * '' * ' 1022 *, как это было до операции ветвления фильтра. (Это предполагает один проход filter-branch; для каждого дополнительного прохода потребуется -f или удаление предыдущего refs/original/ пробела, любой из которых уничтожает значение, которое вы хотели получить здесь.)

Если вы использовали sta sh "стек", который находится в reflog для самого refs/stash. Он должен быть неповрежденным, за исключением того, что последняя запись, stash@{1}, должна содержать старое значение refs/stash до операции ветвления фильтра. Это обеспечивает еще один способ восстановления, если вы перенесли имена refs/original. Если вы выполнили несколько проходов git filter-branch, вам может потребоваться большее число, чем 1.

Если все остальное не помогло, метод git fsck, описанный в git stash документации , ближе к концу под Восстановление sta sh записей, которые были ошибочно очищены / отброшены , доступно, но болезненно.

(Кстати, не то, чтобы это помогло при this балл - это одна из многих причин, по которой я рекомендую избегать git stash большую часть времени. Поскольку все, что он делает, это делает коммиты, просто делает нормальные коммиты. Остальные Git будут хорошо работать с эти нормальные коммиты.)

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