2014-05-30 5 views
1

Как я знаю, чтобы получить старую версию файла какой мне нужен вход:Git Checkout все файлы из точной фиксации

git checkout COMMIT-HASH -- file-name.ext 

Но если я не буду, чтобы получить все измененные файлы из некоторых совершить? Могу ли я ввести что-то вроде:

git checkout COMMIT-HASH -- * 

P.S. Я знаю, что я могу перечислить файлы вручную, но это не удобно, если файлов много.

ответ

1

Просто не передавайте имя файла вообще.

git checkout COMMIT-HASH 
+2

Эта команда перемещает HEAD в этот COMMIT-HASH. Мне нужно что-то вроде git revert && git reset --mixed HEAD ~ 1, но без каких-либо конфликтов. Просто все файлы из этой фиксации в этом состоянии и возможность смотреть diff current и те состояния. – valior

+0

IIRC, есть флаг для перехода на 'git reset', который сделает это. – SLaks

+0

Я не могу найти. --no-commit также просит разрешить конфликты. – valior

2

Если я понимаю, что вы правильно спрашивать, я думаю, что один из этих двух будет делать работу:

git reset --merge <commit> 

или

git checkout <commit> -- . 

Если есть файлы, в настоящее время в вашей рабочей которые не находятся в <commit>, они все равно будут там, что может запутать вещи, в зависимости от того, почему вы хотите это сделать. Один из вариантов, чтобы получить чистое рабочее дерево, только содержимое <commit> бы это:

rm -r * 
git archive --format=tar <commit> | tar xf - 

Для этого вопроса, вы могли бы просто опорожнить worktree перед git reset или git checkout команд выше, а также ...

ни один из них не будет на самом деле переместить HEAD, который я думаю, это эффект, который вы пытаетесь достичь ...

+0

Я считаю, что вопрос OP разрешен с 'git checkout - .'. Он, похоже, не намерен перемещать текущую ветку, поэтому 'git reset --merge ' не поможет. –

0

Я считаю, что это ТАК вопрос может быть полезен: 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 будет лучший способ пойти об этом.

+0

Спасибо, ваша ссылка мне помогает. Окончательная команда, которая мне нужна: 'git show COMMIT_ID | patch -p1 ' – valior

+0

Интересно ... это повторное применение фиксации, которая отличается от вашего вопроса. :-) Рад, что вы нашли то, что вам было нужно. – jszakmeister

Смежные вопросы