2014-09-05 2 views
3

я уже просмотрел: Temporarily switch working copy to a specific Git commit Is it possible to switch between GIT commits? Git switching between commits Однако, я хотел бы разобраться в конкретной теме:Git - временно переключаться между

Я не работать в команде в настоящее время,

Я использую Git, чтобы сохранить историю проекта локально (нет GitHub или Bitbucket) и иметь только ведущую ветвь,

Я не PUSH, мой коммит за пределами .git в моей рабочей директории до конца проекта. Мой вопрос прост:

Как я могу безопасно вернуться к одному из моих предыдущих коммитов (машина времени), не имея в виду разбить существующие индексы дерева?

Как я могу гарантировать, что файлы, добавленные после этой конкретной фиксации, не будут присутствовать в рабочем каталоге во время этого эксперимента?

Как я могу безопасно вернуться к HEAD дерева и еще раз - убедиться, что файлы, удаленные после этого конкретного коммита в прошлом (давным-давно, а не в этот раз), не будут присутствовать в рабочем каталоге?

Причина, по которой я прошу об этом, проста: я сейчас учусь и поэтому хочу время от времени возвращаться к просмотру (только для чтения) - что было в прошлом (скажем, месяц назад) ,

Спасибо.

+0

Как 'git checkout' не отвечает вашим потребностям? –

+0

он не удаляет файлы в рабочем каталоге, которые были добавлены после этого конкретного коммита, AFAIK – Mike

+0

@Mike: он делает. Он не удаляет файлы _untracked_, но отслеженные файлы удаляются, если они не существовали в более ранних транзакциях. – knittl

ответ

0

Одно простое решение состоит в следующем:

  • клон снова ваш репо локально
  • эксперимент в этом новом клоне

Таким образом:

  • оригинал репо остается на мастера
  • вы можете сделать git checkout anOldCommitSHA1, как вы хотите во втором репо

Вы можете по-прежнему в основном репо и проверка любой старше совершить вы хотите, но:

  • сделать git stash раньше (чтобы убедиться, что любая работа в прогресс заначка прочь)
  • выполните git clean -d -f -x после (когда мастер проверки еще раз), чтобы очистить любой локальный файл, который вы могли сгенерировать, при использовании старого дерева обработки.
+0

Спасибо. - В настоящее время я использую этот подход. - Но я немного ленив, чтобы создавать новые записи в vhosts и файлы hosts для клонированного проекта и хотел бы знать, есть ли что-то более короткое внутри Git, fengshui-way ... – Mike

+0

@Mike ok, я отредактировал ответ. – VonC

+0

Я не использую репо, у меня есть только рабочий каталог с .git внутри – Mike

4

Я думаю, что это делает то, что вы ищете.

git stash --include-untracked 
git checkout <commit> 

git checkout master 
git stash pop --index 

Для полностью чистого рабочего дерева, вы можете заменить --include-untracked с --all копить игнорируемые файлы.

+0

1. означает, что я получаю в результате «git reflog»? - как "24b7ecb"? 2. Получается ли результат «git stash --include-untracked» HEAD дерева? – Mike

+0

Извините, «refspec» было неправильным словом (это означает [что-то еще] (http://git-scm.com/book/en/Git-Internals-The-Refspec)). Изменено на «commit». Это может быть хеш-фиксация (например, то, что вы видите в 'git reflog', да, но чаще в' git log'), имя тега или имя ветки. –

+0

@Mike Нет, списание не создает фиксацию. Я думаю, что [справочная страница] (http://git-scm.com/docs/git-stash) может объяснить, что кошелек лучше, чем я могу. «Используйте git stash, когда вы хотите записать текущее состояние рабочего каталога и индекса, но хотите вернуться к чистой рабочей директории ...» –

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