Как я могу получить содержимое рабочего каталога, как это было при конкретном коммите - PullRequest
1 голос
/ 02 августа 2011

У меня есть git-репозиторий с некоторыми коммитами. Я хочу воспроизвести точное состояние рабочего каталога, как оно было сразу после конкретной фиксации (здесь я предполагаю, что я зафиксировал все внесенные изменения).

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

Простой пример, иллюстрирующий мою проблему. Я подготовил репозиторий, используя следующие команды

u@u-desktop:/tmp/git$ git init
Initialized empty Git repository in /tmp/git/.git/

u@u-desktop:/tmp/git$ echo 'ffff' > first.file
u@u-desktop:/tmp/git$ git add first.file
u@u-desktop:/tmp/git$ git commit -m "Important file was added"
[master (root-commit) fb05f7e] Important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 first.file

u@u-desktop:/tmp/git$ echo 'Second line' >> first.file 
u@u-desktop:/tmp/git$ git commit -m "Important data was added" -a
[master df93d04] Important data was added
 1 files changed, 1 insertions(+), 0 deletions(-)

u@u-desktop:/tmp/git$ echo 'ssss' > second.file
u@u-desktop:/tmp/git$ git add second.file
u@u-desktop:/tmp/git$ git commit -m "Second important file was added"
[master b6c106a] Second important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 second.file

u@u-desktop:/tmp/git$ echo 'tttt' > third.file
u@u-desktop:/tmp/git$ git add third.file
u@u-desktop:/tmp/git$ git commit -m "Third important file was added"
[master 33fce06] Third important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 third.file

Прямо сейчас каталог выглядит так

u@u-desktop:/tmp/git$ ls
first.file  second.file  third.file

first.file имеет следующее содержание

u@u-desktop:/tmp/git$ cat first.file 
ffff
Second line

Теперь я хочу восстановить рабочий каталог, как он выглядел сразу после первого коммита (fb05f7e)

u@u-desktop:/tmp/git$ git checkout fb05f7e .
u@u-desktop:/tmp/git$ cat first.file 
ffff

Но second.file и third.file все еще находятся в каталоге

u@u-desktop:/tmp/git$ ls
first.file  second.file  third.file

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Удалите . из вашего git checkout.Выбор из справочной страницы:

   git checkout [<branch>], git checkout -b|-B <new_branch> [<start
     point>], git checkout [--detach] [<commit>]
       This form switches branches by updating the index, working tree,
       and HEAD to reflect the specified branch or commit.

       (...)

   git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
       When <paths> or --patch are given, git checkout does not switch
       branches. It updates the named paths in the working tree from the
       index file or from a named <tree-ish> (most often a commit).

Если, кроме того, вы хотите удалить файлы, которые не отмечены в индексе, используйте git clean (прочитайте справочную страницу, есть "анти-упс ", вам придется передать в командной строке, чтобы он работал).

3 голосов
/ 02 августа 2011

Просто сделай:

git checkout fb05f7e

... т.е. без с указанием текущего каталога (.) в качестве пути к оформлению заказа. Вы обнаружите, что second.file и third.file удалены, как вы ожидаете.

Причина этого в том, что git checkout имеет два совершенно разных режима работы, в зависимости от того, указали ли вы путь или нет. Если вы указываете путь, он не меняется HEAD, он просто

... обновляет именованные пути в рабочем дереве из файла индекса или из именованного (чаще всего коммит)

(это из git checkout документации ). Это только обновляет пути, которые фактически присутствовали в этом другом коммите.

...