Я считаю, что это ТАК вопрос может быть полезен: How to list all the files in a commit?
В основном, чтобы получить список файлов, вы можете использовать git diff-tree
:
git diff-tree --no-commit-id --name-only -r COMMIT_ID
После того, как вы есть, что вы можете кормить его мерзавцу проверку:
git diff-tree --no-commit-id --name-only -r COMMIT_ID | \
xargs git checkout COMMIT_ID --
Таким образом, git diff-tree
поможет получить список файлов, а xargs git checkout COMMIT_ID --
поможет сбросить затронутые файлы обратно в состояние, в котором они были, при совершении (вы только откатываете эти файлы).
Возможно, вам нужно сделать это в верхней части рабочего дерева. Кроме того, я не пытался понять, что произойдет, если будет задействовано переименование, поэтому, вероятно, вам понадобится рассмотреть другой вопрос. Здесь также могут быть пробелы в именах путей, но я не видел способа получить пути в формате с нулевым завершением с помощью git diff-tree
. Возможно git diff
бы лучше в этом случае:
git diff --name-only -z COMMIT_ID^ COMMIT_ID | \
xargs -0 git checkout COMMIT_ID --
Кроме того, если вы действительно хотите, чтобы вернуться таким образом, и есть на самом деле только один совершить это вопрос, возможно, git revert
будет лучший способ пойти об этом.
Эта команда перемещает HEAD в этот COMMIT-HASH. Мне нужно что-то вроде git revert && git reset --mixed HEAD ~ 1, но без каких-либо конфликтов. Просто все файлы из этой фиксации в этом состоянии и возможность смотреть diff current и те состояния. – valior
IIRC, есть флаг для перехода на 'git reset', который сделает это. – SLaks
Я не могу найти. --no-commit также просит разрешить конфликты. – valior