Восстановление упавшего sta sh 'не является sta sh -подобным коммитом' - PullRequest
0 голосов
/ 16 января 2020

Я пытался восстановить сброшенный sta sh с работой, в которой я нуждался, следуя множеству примеров (таких как здесь и здесь ) из

git log --graph --oneline --decorate $(git fsck --no-reflog | awk '/dangling commit/ {print $3}')

Я нашел га sh ref (1234AB C) для оборванного коммита, который я сбросил и нуждался:

1234ABC untracked files on feature/guards: 0987XYZ Merge branch 'develop'
0987XYZ Merge branch 'develop'

, но когда я попытался git stash apply 1234ABC, я продолжал получать следующее сообщение:

'1234ABC' is not a stash-like commit

Я также заметил, что, если я извлек эту ссылку в отдельную ветку HEAD, git checkout -b 1234ABC, единственной доступной информацией журнала была только одна фиксация, которая содержала только изменения сделал и спрятал тогда - без какой-либо предыдущей истории предков.

Итак, я попытался сделать это из статьи Dev.to , чтобы попытаться обновить ссылки * * * * sh, но затем попытка вставить / применить sta sh там также не удалось применить. Это также привело к другим проблемам, таким как неспособность отбросить добавленный sta sh «Мой восстановленный sta sh».

git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "My recovered stash"


Q1: Что означает « разве не означает * * * * * * * * * * * * * * * *

Q: почему это произошло, и как я могу правильно применить эту sh?

Будет ли писать это, я попробовал git stash apply 0987XYZ (больше думая о том, как моя удаленная ссылка sh имела только спрятанные изменения без какой-либо наследственной истории и как это были неперехваченные файлы, спрятанные в то время на текущем коммитном коммите 0987XYZ).

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

Q3: В этом случае, будет ли git stash apply 0987XYZ, применяя sta sh ref для родительского (или предыдущего) коммита, который мне нужен, правильный способ сделать это?

Спасибо за любые идеи и дополнительные информация для дальнейшего обучения меня об этом сценарии!

1 Ответ

0 голосов
/ 16 января 2020

Git реализует sta sh в виде двух коммитов, чтобы иметь возможность отдельно хранить поэтапные и неустановленные изменения. Если вы используете -u или -a, будет создан третий коммит для хранения неотслеживаемых файлов (спасибо @torek за разъяснение моей путаницы по этому поводу). Структура коммита выглядит следующим образом:

*__ Unstaged changes
|\ \
| | * Untracked files
| |
| * Staged changes
|/
* Base commit

Таким образом, найденный вами коммит, вероятно, является частью "неотслеживаемых файлов" без родительского контроля вашего sta sh. git stash предположительно знает только, как работать с самой верхней "неотмеченной частью", поскольку именно она знает, где находятся другие части. Если изменения, которые вы видите в коммите, который вы нашли, являются теми, которые вы хотите, вы можете попробовать просто скопировать файлы в нем (это будет перезаписывать любые незафиксированные изменения в этих файлах, если они в данный момент находятся в вашей работе directory):

git checkout 1234ABC -- fileA fileB fileC

Чтобы определить фиксацию «неустановленные изменения», вы можете искать фиксацию, в которой 1234ABC является одним из ее родителей. Если вы найдете его, вы сможете его восстановить. sh.

...